当前位置: 首页 > news >正文

Nginx入门:高性能Web服务器详解

什么是nginx?

Nginx是一个高性能的HTTP和反向代理服务器,也是一个邮件代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定。

所以其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。

Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目官网: The Tengine Web Server

Nginx的应用场景?

1、静态资源服务器:Nginx 擅长高效处理静态文件(HTML、CSS、JS、图片、视频等),相比动态服务器(如 Apache + PHP),它的并发能力更强,资源占用更低。

2、反向代理服务器:将客户端请求转发到后端服务(如 Tomcat、Node.js、Python/Django 等),隐藏真实服务器信息,提升安全性。

3、负载均衡:将流量分发到多个后端服务器,提高系统可用性和扩展性。

Nginx作为web服务器

Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

Nginx是什么?Nginx介绍及Nginx的优点 - LNMP一键安装包

1、正向代理

正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

2、反向代理

反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。

反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

3、负载均衡

负载均衡(Load Balancing)是一种将网络流量分配到多个服务器的技术,目的是优化资源使用、最大化吞吐量、减少响应时间,并避免任何单一服务器过载。

Nginx不仅可以作为高效的Web服务器,还可以作为强大的负载均衡器,将客户端请求分发到多个后端服务器(也称为"上游服务器")。

Nginx负载均衡的工作原理
  1. 客户端向Nginx服务器发送请求
  2. Nginx根据配置的负载均衡算法选择一个后端服务器
  3. Nginx将请求转发到选定的服务器
  4. 后端服务器处理请求并返回响应
  5. Nginx将响应返回给客户端
负载均衡算法

使用一些算法来决定如何分配流量:

轮询(Round Robin):按顺序将请求分配给每个服务器。

加权轮询(Weighted Round Robin):根据服务器的权重分配请求。

最少连接(Least Connections):将请求分配给当前活动连接最少的服务器。

源 IP 哈希(Source IP Hash):根据客户端 IP 地址的哈希值分配请求,确保同一客户端总是连接到同一台服务器。

一致性哈希(Consistent Hashing):用于分布式系统中,确保当服务器增加或减少时,最少的请求需要重新分配。

nginx安装

1、安装编译工具及库文件

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel pcre-devel

2、下载nginx并解压

cd /usr/local
mkdir nginx
cd nginx/wget https://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz

3、进入安装包目录

cd nginx-1.18.0/

4、编译安装nginx,默认安装到 /usr/local/nginx中

# 编译
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module# 安装
make && make install

5、查看nginx安装到什么位置

[root@lw nginx]# whereis nginx
nginx: /usr/local/nginx

6、启动,重启,停止nginx

cd /usr/local/nginx/sbin/
./nginx   #启动
./nginx -s stop  #停止
./nginx -s quit  #退出
./nginx -s reload  #重启 

7、启动后查看进程

ps -ef|grep nginx  #查询进程号kill -QUIT 主进程号   #从容停止kill -TERM 主进程号  #快速停止kill -9 主进程号  #强制停止

Linux设置nginx开机自启动

1、进入到/lib/systemd/system/

cd /lib/systemd/system/

2、创建nginx.service文件,并编辑

vim nginx.service

粘贴内容如下:

[Unit]
Description=nginx service
After=network.target [Service] 
Type=forking 
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true [Install] 
WantedBy=multi-user.target

3、设置开机自启动或取消

# 设置开机自启
systemctl enable nginx
# 关闭开机自启
systemctl disable nginx

4、服务的启动/停止/刷新配置文件/查看状态

# systemctl start nginx.service          启动nginx服务# systemctl stop nginx.service           停止服务# systemctl restart nginx.service        重新启动服务# systemctl list-units --type=service     查看所有已启动的服务# systemctl status nginx.service          查看服务当前状态# systemctl enable nginx.service          设置开机自启动# systemctl disable nginx.service         停止开机自启动

nginx.conf 配置文件

nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件

nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改

配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的

内容如下:

#user  nobody;
worker_processes  1;#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;sendfile        on;#tcp_nopush     on;#keepalive_timeout  0;keepalive_timeout  65;#gzip  on;server {listen       80;server_name  localhost;#charset koi8-r;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}#error_page  404              /404.html;# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443 ssl;#    server_name  localhost;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.key;#    ssl_session_cache    shared:SSL:1m;#    ssl_session_timeout  5m;#    ssl_ciphers  HIGH:!aNULL:!MD5;#    ssl_prefer_server_ciphers  on;#    location / {#        root   html;#        index  index.html index.htm;#    }#}}

根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:

第一部分:全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

比如上面第一行配置的:

worker_processes  1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约

worker_processes 1; 是 Nginx 配置中一个重要的全局指令,用于设置 Nginx 服务器的工作进程数量。

worker_processes auto;  # 自动根据CPU核心数设置

第二部分:events块

events {worker_connections  1024;
}

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。

上述例子就表示每个 workprocess 支持的最大连接数为 1024.

这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

最大并发连接数 = worker_processes × worker_connections

例如:如果有 4 个 worker 进程,每个 1024 连接,则最大并发连接数为 4096

如何合理配置

确定系统限制

ulimit -n  # 查看单个进程能打开的文件描述符上限

配置示例:

events {worker_connections 4096;  # 每个worker进程4096个连接use epoll;               # 使用epoll事件模型(Linux高效模型)multi_accept on;         # 允许worker同时接受多个新连接
}

高级优化配置:

events {worker_connections 8192;use epoll;multi_accept on;# 优化连接处理(Linux特有)accept_mutex on;          # 启用互斥锁均衡连接分配accept_mutex_delay 500ms; # 获取互斥锁的等待时间# 减少上下文切换worker_aio_requests 32;   # 每个worker的异步I/O操作数
}

第三部分:http块

http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  localhost;location / {root   html;index  index.html index.htm;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}}}

这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块也可以包括 http 全局块、server 块。

①、http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

http {# 1. http全局配置# 加载一个预定义的 MIME 类型映射文件,该文件包含了常见文件扩展名到 MIME 类型的对应关系include       mime.types;# 设置默认的 MIME 类型,当请求的文件类型无法在 mime.types 中找到对应关系时使用default_type  application/octet-stream;# 2. 日志、缓存、超时等全局设置access_log  /var/log/nginx/access.log;# 3. server块(虚拟主机配置)server {# 服务器监听配置listen 80;# location块(请求路由配置)location / {root /var/www/html;}}
}
HTTP 全局块详解
1. MIME 类型配置
include       mime.types;  # 引入预定义的MIME类型文件
default_type  application/octet-stream;  # 默认MIME类型
2. 文件传输优化
sendfile        on;  # 启用高效文件传输模式
tcp_nopush      on;  # 仅在sendfile开启时有效,优化数据包发送
tcp_nodelay     on;  # 禁用Nagle算法,提高实时性
3. 连接超时设置
keepalive_timeout  65;  # 客户端连接保持时间(秒)
keepalive_requests 100; # 单个连接的最大请求数
client_header_timeout 15; # 读取请求头超时
client_body_timeout 15;   # 读取请求体超时
send_timeout 10;          # 响应传输超时
4. 缓冲区设置
client_body_buffer_size 128k;  # 请求体缓冲区大小
client_header_buffer_size 4k;  # 请求头缓冲区大小
large_client_header_buffers 4 16k; # 大请求头缓冲区
5. Gzip 压缩配置
gzip on;
gzip_min_length 1k;     # 最小压缩文件大小
gzip_comp_level 6;      # 压缩级别(1-9)
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_vary on;           # 启用Vary头

②、server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

1、全局 server 块

最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

server {# 1. 监听配置listen 80;listen [::]:80;  # IPv6# 2. 服务器名称(支持通配符和正则)server_name example.com www.example.com;# 3. 字符集设置charset utf-8;# 4. 根目录与索引文件root /var/www/example.com;index index.html;# 5. 日志配置access_log /var/log/nginx/example.access.log;error_log /var/log/nginx/example.error.log;# 6. Location 块配置...
}
1、监听配置详解
listen 80;                          # 监听80端口(HTTP)
listen 443 ssl;                     # 监听443端口(HTTPS)
listen 127.0.0.1:8080;              # 监听指定IP和端口
listen [::1]:8080;                  # 监听IPv6
listen unix:/var/run/nginx.sock;    # 监听Unix域套接字
案例1:基础 Vue 项目(History 模式)
server {listen 80;server_name vue-app.com;root /var/www/vue-app/dist;index index.html;# 开启gzip压缩gzip on;gzip_types text/plain text/css application/json application/javascript text/xml;# 静态资源缓存location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp)$ {expires 1y;add_header Cache-Control "public, no-transform";access_log off;}# Vue路由处理location / {try_files $uri $uri/ /index.html;}# 错误页面error_page 404 /index.html;error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
案例1:基础 Vue 项目(History 模式)
server {listen 80;server_name api-vue-app.com;root /var/www/vue-app/dist;index index.html;# API代理配置location /api/ {proxy_pass http://backend-server:3000/;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# 跨域支持add_header 'Access-Control-Allow-Origin' '$http_origin' always;add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type' always;# 预检请求处理if ($request_method = 'OPTIONS') {return 204;}}# Vue应用路由location / {try_files $uri $uri/ /index.html;}
}
2、location 块

一个 server 块可以配置多个 location 块。

这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

1. 精确匹配
location = /exact-path {# 只匹配/exact-path(不包括子路径)proxy_pass http://backend/exact;
}
2. 前缀匹配
location ^~ /static/ {# 优先于正则匹配,匹配/static/开头的路径alias /var/www/static/;
}
3. 正则匹配
location ~* \.(jpg|jpeg|png)$ {# 不区分大小写的正则匹配图片文件expires 30d;access_log off;
}
4. 命名location
location @fallback {# 命名的location,用于错误处理proxy_pass http://backend;
}

HTTPS 安全配置
server {listen 443 ssl http2;server_name secure-vue-app.com;# SSL证书配置ssl_certificate /etc/letsencrypt/live/secure-vue-app.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/secure-vue-app.com/privkey.pem;# SSL优化配置ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';ssl_prefer_server_ciphers on;# 安全头add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";add_header X-Content-Type-Options nosniff;add_header X-Frame-Options DENY;add_header X-XSS-Protection "1; mode=block";add_header Content-Security-Policy "default-src 'self'";# Vue应用配置root /var/www/secure-vue-app/dist;index index.html;location / {try_files $uri $uri/ /index.html;}
}# HTTP重定向到HTTPS
server {listen 80;server_name secure-vue-app.com;return 301 https://$host$request_uri;
}

Nginx 的日志配置

Nginx 的日志配置遵循层级继承原则,但具有灵活的覆盖机制:

  • http 块中的日志配置:作为全局默认配置
  • server 块中的日志配置:可继承或覆盖 http 块的配置
  • location 块中的日志配置:可进一步覆盖上层配置

Nginx 负载均衡配置

1. 基础负载均衡配置(轮询算法)

http {upstream backend {# 默认就是轮询算法server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
}

2. 加权轮询算法

http {upstream backend {server backend1.example.com weight=3;  # 3/6的请求server backend2.example.com weight=2;  # 2/6的请求server backend3.example.com weight=1;  # 1/6的请求}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;}}
}

3. 最少连接算法

http {upstream backend {least_conn;  # 最少连接算法server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;}}
}

4. IP 哈希算法

http {upstream backend {ip_hash;  # 基于客户端IP的哈希算法server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;}}
}

5. 一致性哈希算法

http {upstream backend {hash $request_uri consistent;  # 基于请求URI的一致性哈希server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;}}
}

关键参数说明

  1. weight:服务器权重,默认为1
  2. max_fails:允许失败次数,超过后暂停服务
  3. fail_timeout:服务器暂停时间(与max_fails配合使用)
  4. backup:标记为备用服务器
  5. down:标记服务器永久不可用
  6. least_conn:最少连接算法
  7. ip_hash:IP哈希算法
  8. hash:通用哈希算法(可指定一致性哈希)
  9. zone:定义共享内存区域(商业版功能)

http://www.dtcms.com/a/316669.html

相关文章:

  • 商用密码应用安全性评估(密评)实施指南:法律依据与核心要点解析
  • 神坛上的transformer
  • 如何测量滚珠花键的旋转方向间隙?
  • PYQT的QMessageBox使用示例
  • unity之 贴图很暗怎么办
  • Redis作为MySQL缓存的完整指南:从原理到实战
  • 《算法导论》第 4 章 - 分治策略
  • Nature Neuroscience | 如何在大规模自动化MRI分析中规避伪影陷阱?
  • 虚拟电场:能源互联网的隐形交响乐团
  • 基于SD地图增强无图车道线和拓扑推理
  • 【25-cv-23395】宠物/婴儿玩具品牌BESTSKY商标维权!
  • 面向对象编程基础:类的实例化与对象内存模型详解
  • Java基础面试题(1)—Java优势(JVM,JRE,JIT,Java类,方法)
  • RHCA04--系统模块管理与资源限制
  • 91、【OS】【Nuttx】【启动】栈溢出保护:配置项添加
  • 第13届蓝桥杯Scratch_选拔赛_初级组_真题2022年1月22日
  • GPTs和AssistantAPl和Alagent的区别联系
  • 8月5号打卡
  • 智慧社区(八)——社区人脸识别出入管理系统设计与实现
  • 1panel服务器管理工具
  • QML开发:QML的第一个程序
  • Qt Quick 之动态旋转刻度盘(无人机中指南针 Demo )
  • 400V降24V,200mA,应用领域:从生活到工业的 “全能电源管家”WD5208
  • 华清远见25072班C语言学习day2
  • Z20K118库中寄存器及其库函数封装-CLOCK库
  • Boosting 知识点整理:机制、对比与应用场景
  • TDengine 中 TDgp 中部署时序基础模型
  • Android10 系统休眠调试相关
  • 力扣热题100-------169.多数元素
  • 工作相关: 预刷真值与人工标注的真值之间的关系 以及 真值与原始数据的关系,