web中间件——(二)Nginx(高级功能、优化)

文章目录

Nginx变量使用

nginx的变量可以在配置文件中引用,作为功能判断或者日志等场景使用

变量可以分为内置变量和自定义变量

内置变量是由nginx模块自带,通过变量可以获取到众多的与客户端访问相关的值

常用内置变量

nginx内置变量官方文档

变量名称 核心说明 示例 / 补充说明
一、客户端相关变量
$remote_addr 客户端的真实 IP 地址(公网 IP,无代理时直接获取,有代理需配合转发头) 示例:113.xxx.xxx.xxx
$remote_port 客户端访问 Nginx 时随机使用的本地端口 示例:54321(客户端临时端口)
$remote_user 经过 Auth Basic Module 验证后的用户名 验证通过后返回用户名,未验证则为空
$http_user_agent 客户端浏览器 / 请求工具的详细信息 示例:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
$http_cookie 客户端请求报文中的所有 Cookie 信息 示例:PHPSESSID=abc123; username=test
$cookie_ 客户端 Cookie 中指定 key 为的值(替换为实际 Cookie 键名) 如 $cookie_PHPSESSID,返回 abc123
二、请求相关变量
$args URL 中的所有请求参数(query string 部分) 访问/index.do?id=1&name=test,返回:id=1&name=test
$document_root 当前请求对应的 Nginx 系统根目录(由 root/alias 指令配置) 示例:/apps/nginx/html
$document_uri 请求的 URI(不包含参数部分) 访问/main/index.do?id=1,返回:/main/index.do
$request_body_file 反向代理时,发送给后端服务器的本地资源文件名 用于代理本地文件到后端场景,如静态资源转发
$request_method 客户端请求的 HTTP 方法 示例:GET、POST、PUT、DELETE
$request_filename 当前请求资源的磁盘绝对路径(root/alias + URI 生成) 如 root 为/apps/nginx/html,请求/main/index.html,返回:/apps/nginx/html/main/index.html
$request_uri 包含参数的原始 URI(= doc um en tur**i?args),不包含主机名 访问/main/index.do?id=1&name=test,返回:/main/index.do?id=1&name=test
$http_ 获取请求报文中指定的首部字段(替换为实际首部名,横线转下划线) 示例:http_refferer(获取头)、http_Accept(获取 Accept 头)
三、服务器相关变量
$server_addr Nginx 服务器的 IP 地址 示例:192.168.1.100
$server_name 客户端请求的服务器主机名(由 server_name 指令配置) 示例:myblog.csq.xyz
$server_port 客户端请求的 Nginx 服务器端口号 示例:80(HTTP)、443(HTTPS)
$server_protocol 客户端请求使用的 HTTP 协议版本 示例:HTTP/1.0、HTTP/1.1、HTTP/2.0
四、协议 / 代理相关变量
$scheme 客户端请求的协议类型 示例:http、https、ftp
$proxy_add_x_forwarded_for 追加客户端 IP 到 X-Forwarded-For 请求头,多 IP 用逗号分隔;无原有头则用 $remote_addr 示例:113.xxx.xxx.xxx, 192.168.1.200(客户端 IP + 中间代理 IP)
五、其他常用变量
$host 客户端请求的 Host 名称(优先取请求头 Host,无则取 server_name) 示例:myblog.csq.xyz、192.168.1.100:8080
$limit_rate Nginx 配置的客户端限速值(未配置则返回 0) 配置limit_rate 10240;(10KB/s),echo $limit_rate 返回:10240

Nginx负载均衡

七层负载

负载均衡指令

upstream中server中指令 说明
weight=number 权重,默认为1
max_fails=number 对后端服务器连续监测失败多少次就标记为不可用,默认为1次 当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
max_conns=number 给当前server设置最大活动链接数,默认为0表示没有限制
fail_timeout 默认是10秒,失败后10s后再次测试
backup 设置为备份服务器,当所有服务器不可用时将重新启用次服务器
down 标记为down状态
resolve 当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启Nginx

负载均衡配置参数

官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html

指令名称 指令值格式 默认值 指令说明
proxy_pass address(主机名 / IP: 端口 /upstream 组) --- 反向代理核心指令,指定客户端请求转发的后端目标(主机名、IP: 端口或预设服务器组)
proxy_set_header field value --- 修改 / 添加客户端请求头并转发至后端;常用示例:X-Forwarded-For $proxy_add_x_forwarded_for(传递真实 IP)、X-Real-IP $remote_addr(传递客户端公网 IP)
proxy_http_version 1.0|1.1 1.0 代理使用的 HTTP 协议版本,如需支持keepalive建议显式设为 1.1
proxy_connect_timeout time 60s Nginx 与后端服务器建立连接的超时时间,超时返回 504 响应码;示例:proxy_connect_timeout 6s
proxy_hide_header field --- 反向代理时,隐藏后端服务器返回的指定 HTTP 响应头,可配置在 http/server/location 块
proxy_headers_hash_bucket_size size 128 保存 HTTP 报文头的 hash 表上限,配合proxy_hide_header/proxy_set_header使用
proxy_headers_hash_max_size size 512 设置proxy_headers_hash_bucket_size的最大可用空间
proxy_ignore_client_abort on|off off 客户端中断请求时,Nginx 是否继续向后端发起请求:on = 忽略客户端中断,off = 随客户端中断并记录 499 日志
proxy_read_timeout time 60s Nginx 向后端发起 read 请求后,等待响应数据的超时时间
proxy_send_timeout time 60s Nginx 向后端发起 write 请求后,等待发送完成的超时时间
server_names_hash_bucket_size size --- 服务器名称(server_name)hash 表的申请空间大小
server_names_hash_max_size size 512 服务器名称(server_name)hash 表的上限大小

负载均衡轮询算法

轮询算法:如何把请求发送到后端节点

算法 说明 应用
轮询 rr 轮询 nginx 默认算法
加权轮询 wrr 轮询 增加了权重;修改权重让服务器增加或减少请求。修改权重进行更新测试.
ip 哈希ip_hash ip_hash 对客户端 ip 地址进行 hash 计算,只要 ip 地址一样,相同的 web 处理. 容易导致负载不均,可以解决会话保持 (登录保持) 问题. 只是临时的缓解手段.
url 哈希url_hash hash $request_uri; 对客户端请求的 url 进行哈希,访问相同的 url 就访问相同的缓存服务器.缓存的节点.
最小连接数 least_conn 动态算法,根据连接情况转发.
最小连接时间 least_time 动态算法,根据连接情况转发.
一致性哈希算法 hash $remote_addr consistent; ip_hash 的加强版,智能版本.

(1)加权轮询

web01/02节点设置

shell 复制代码
server {
	listen 80;
	server_name lb.csq.xyz;
	client_max_body_size 10M;
	access_log /var/log/nginx/access-blog.chenshiquan.xyz main;
	error_log /var/log/nginx/error-blog.chenshiquan.xyz notice;
	root /app/code/lb/;
	location / {
		index index.html;
	}
}
#创建站点目录
mkdir -p /app/code/lb/
#创建首页文件
echo `hostname` > /app/code/lb/index.html

负载均衡节点设置

shell 复制代码
upstream web01_web02_lb01{
        server 10.0.0.103:80 weight=1;
        server 10.0.0.104:80 weight=2;
}
server {
        listen 80;
        error_log /var/log/nginx/error-lb.log notice;
        access_log /var/log/nginx/access-lb.log main;
        server_name lb.csq.xyz;
        location / {
                #指定客户端请求转发的后端目标服务器组
                proxy_pass http://web01_web02_lb01;
                #向后端服务器传递客户端请求的原始Host头(即客户端访问的域名 / IP)
                proxy_set_header Host $host;
                #添加客户端IP和反向代理服务器IP到请求报文头部
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                #只添加客户端IP到请求报文头部,转发至后端服务器
                proxy_set_header X-Real-Ip $remote_addr;
        }
}
[root@lb01 /etc/nginx/conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 /etc/nginx/conf.d]# systemctl reload nginx

windows做hosts解析,浏览器访问,请求3次2次请求到web02,1次请求到web01

ip_hash

对客户端 ip 地址进行 hash 计算,只要 ip 地址一样,相同的 web 处理.

shell 复制代码
upstream web01_web02_lb01{
        ip_hash;
        server 10.0.0.103:80 weight=1;
        server 10.0.0.104:80 weight=2;
}

一致性hash

shell 复制代码
upstream web01_web02_lb01{
        hash $remote_addr consistent;
        server 10.0.0.103:80 weight=1;
        server 10.0.0.104:80 weight=2;
}

一致性哈希环,4个节点9条数据

新增node5节点,不影响其他节点

如果删除node5,相邻的5条数据会传到node4

节点数较少时,数据分布不均匀=>引入虚拟节点

实现FastCGI

Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理,其配置指令如下

指令名称 指令值格式 默认值 指令说明
fastcgi_pass address(或 upstream 服务器组) --- FastCGI 核心指令:指定后端 FastCGI 服务地址(IP: 端口 / 套接字 /upstream 组),如127.0.0.1:9000
fastcgi_param parameter value [if_not_empty] --- 向 FastCGI 传递自定义参数;if_not_empty表示值为空时不传递;常用子参数如HTTPSX-Forwarded-Proto
fastcgi_param HTTPS on|off 无默认值 告知后端 FastCGI "客户端与 Nginx 的通信协议":HTTPS 场景设on,HTTP 场景设off;核心用于后端程序识别访问协议
fastcgi_buffers number size 8k 或 4k 单个连接的 FastCGI 响应数据缓冲区(数量 + 单缓冲区大小),至少分配 2 个,如4 32k
fastcgi_buffer_size size 4k 或 8k 读取 FastCGI 响应第一部分(响应头)的缓冲区大小,建议与fastcgi_buffers单缓冲区大小一致
fastcgi_connect_timeout time 60s Nginx 与 FastCGI 服务建立连接的超时时间,超时返回 504 错误,如10s
fastcgi_read_timeout time 60s 从 FastCGI 服务接收响应数据的间隔超时时间(非总超时),超时关闭连接
fastcgi_send_timeout time 60s 向 FastCGI 服务发送请求数据的间隔超时时间,超时关闭连接
fastcgi_index name --- FastCGI 默认索引文件,如index.php(后端无索引时需指定)
fastcgi_pass_request_body on|off on 是否将客户端请求体(如 POST 数据)传递给 FastCGI,PHP 等场景需开启
fastcgi_pass_request_headers on|off on 是否将客户端请求头(如 Cookie、User-Agent)传递给 FastCGI,业务依赖时需开启
fastcgi_param SCRIPT_FILENAME doc um en troo**tfastcgi_script_name --- 必配参数:告知 FastCGI 当前请求的 PHP 文件绝对路径,避免文件找不到错误
shell 复制代码
fastcgi_pass address:port;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in location

fastcgi_index name;
#fastcgi默认的主页资源,示例:fastcgi_index index.php;

fastcgi_param parameter value [if_not_empty];
#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义key

fastcgi_param REMOTE_ADDR        $remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT        $remote_port; #客户端源端口
fastcgi_param SERVER_ADDR        $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT        $server_port; #请求的服务器端口
fastcgi_param SERVER_NAME        $server_name; #请求的server name

#Nginx默认配置示例:
   location ~ \.php$ {
     root           /scripts;
     fastcgi_pass   127.0.0.1:9000;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #默认脚本路径
     include       fastcgi_params;    #此文件默认系统已提供,存放的相对路径为prefix/conf
}

FastCGI案例 : Nginx与php-fpm在同一服务器

shell 复制代码
server {
        listen 80;
        server_name myblog.csq.xyz;
        client_max_body_size 10M;
        access_log /var/log/nginx/access-myblog.csq.xyz main;
        error_log /var/log/nginx/error-myblog.csq.xyz notice;
        root /app/code/blog/;
        location / {
                index index.php index.html;
        }
        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
        }
}

四层负载

ngx_stream_proxy_module模块实现tcp负载

ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、调度算法等功能

使用案例

shell 复制代码
stream {
    #定义访问日志格式
    log_format l4 '$remote_addr [$time_local] "$protocol" '
                      '$status $bytes_sent $bytes_received $session_time ';
        #定义后端服务器
        upstream  xzs_group {
                #使用一致性hash
                hash $remote_addr consistent;
                server 10.0.0.108:8000;
                server 10.0.0.109:8000;
        }
        server {
                listen 8000;
                access_log /var/log/nginx/access-xzs.chenshiquan.log l4;
                error_log /var/log/nginx/error-xzs.chenshiquan.log notice;
                #转发到具体服务器组
                proxy_pass xzs_group;
        }
}

Nginx反向代理和负载均衡的区别

四层负载均衡七层负载均衡

负载均衡 四层负载均衡 七层负载均衡
区别 4层传输层 7层应用层
详细区别 端口转发 处理http,https请求,UA,Host,URL,域名

Nginx,haproxy,lvs区别

软件 nginx haproxy lvs
区别 4层/7层 4层/7层 4层
原理 反向代理 反向代理 负载均衡
功能 简单易上手 性能OK,负载均衡检查模块(商业版本才有) 开源版本需要添加第3方upstream_check才有 nginx动态加载(热加载)功能,修改配置立刻生效 配置不难,支持监控检查功能 动态热加功能 性能最高 配置与维护负载

雪崩

雪崩:某个(些)机器挂了,导致其他机器也挂了

会话保持/会话共享方案

特点 cookie session
共同点 存放用户信息 存放用户信息
位置 浏览器中 (客户端) 文件,数据库.redis (服务端)
怎么来的 响应报文中包含与设置 登录后创建
搭配 可以只用 cookie 记录登录信息.使用 cookie+session 搭配记录登录信息.cookie 钥匙 锁头.
方案 说明
直接使用cookie 类似于wordpress
ip_hash或一致性hash 登陆固定节点
使用会话保持服务 redis存放用户的会话信息
使用Oauth认证 不需要存放会话信息,生成令牌

Nginx Rewrite

Nginx 的 rewrite 功能由 ngx_http_rewrite_module 模块实现,核心是实现 URL 重写。其重要作用包括:网站结构变更时,无需客户端或其他网站修改原有链接即可正常访问;同时能在一定程度上提升网站安全性

nginx_http_rewrite_module模块指令

nginx-rewrite模块 说明 应用场景
rewrite 实现跳转功能,正则,更加灵活跳转 URI改变加工处理
return 实现跳转功能,变量,简单 301,302,http/https,新旧域名
if 判断与nginx变量 单分支判断 简单判断使用if即可,过于复杂请求的处理交给lua模块(openresty自带lua模块)
set 创建/修改变量

伪静态:动态资源/页面伪装为静态.搜索引擎喜欢缓存(收入)

shell 复制代码
伪静态地址:
myblog.csq.xyz/csq-1.html
rewrite 还原动态地址交给网站处理
myblog.csq.xyz/csq/1.php

return指令

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置

shell 复制代码
return code; #返回给客户端指定的HTTP状态码
return code [text]; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号
return code URL; #返回给客户端的URL地址

实现http临时跳转https

shell 复制代码
server {
    listen 80;
    server_name ssl.chenshiquan.xyz;
    return 302 https://ssl.chenshiquanx.xyz$request_uri;
}
server {
    listen 443 ssl;
    server_name ssl.chenshiquan.xyz  ;
    ssl_certificate     /etc/nginx/keys/ssl.chenshiquan.xyz.pem;
    ssl_certificate_key /etc/nginx/keys/ssl.chenshiquan.xyz.key;
    root /app/code/ssl;
    location / {
        index index.html;
    }
}

if指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

shell 复制代码
if (条件匹配) {
  action
}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接

shell 复制代码
= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=  #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假
~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真
-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)

范例1:网站只支持GET/POST/HEAD请求方法,其他方法都拒绝405

shell 复制代码
server {
	listen 80;
	server_name test.csq.xyz;
	root /app/code/test;
	if ( $request_method !~ "GET|POST" ){
		return 405;
	}
	location / {
		index index.html
	}
}
#测试
curl -I -H Host:test.csq.xyz http://10.0.0.104
HTTP/1.1 405 Not Allowed
Server: nginx/1.28.0
Date: Sun, 02 Nov 2025 01:49:43 GMT
Content-Type: text/html
Content-Length: 157
Connection: keep-alive

set指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合

范例2:网站维护中显示503

shell 复制代码
server {
        listen 80;
        server_name test.csq.xyz;
        root /app/code/test;
        set $file "/etc/nginx/csq.txt";
        if ( -f $file ){
                return 503;
        }
        if ( $request_method !~ "GET|POST" ){
                return 405;
        }
        location / {
                index index.html;
        }
}
#测试
#创建文件
touch /etc/nginx/csq.txt
#访问
curl -I -H Host:test.csq.xyz http://10.0.0.104
HTTP/1.1 503 Service Temporarily Unavailable
Server: nginx/1.28.0
Date: Sun, 02 Nov 2025 01:55:43 GMT
Content-Type: text/html
Content-Length: 197
Connection: keep-alive

break指令

Nginx 的 break 指令可在 server、location、if 块中使用,作用是中断当前作用域中后续的 ngx_http_rewrite_module 模块指令(同一作用域中其前面的配置生效),但不影响其他模块指令;遇到该指令后,Nginx 会回到上一层作用域继续处理配置。

注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行

nginx 复制代码
server {
        listen 80;
        server_name test.csq.xyz;
        root /app/code/test;
        set $file "/etc/nginx/csq.txt";
        if ( -f $file ){
                break;     #在此处添加break
                return 503;
        }
        if ( $request_method !~ "GET|POST" ){
                return 405;
        }
        location / {
                index index.html;
        }
}

#测试
#创建文件
touch /etc/nginx/csq.txt
#访问
curl -I -H Host:test.csq.xyz http://10.0.0.104
HTTP/1.1 200 OK
Server: nginx/1.28.0
Date: Sun, 02 Nov 2025 02:12:50 GMT
Content-Type: text/html
Content-Length: 6
Last-Modified: Sun, 02 Nov 2025 01:43:48 GMT
Connection: keep-alive
ETag: "6906b754-6"
Accept-Ranges: bytes

rewrite指令

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

rewrite可以配置在 server、location、if

Nginx 的 rewrite 指令通过正则表达式匹配用户请求的 URI,匹配时替换为新 URI;同一级配置块中多个 rewrite 规则自下而上逐个检查,替换后会重新循环检查(最多 10 次,超次返回 500),flag 可控制该循环;若替换后的 URL 以 http:// 或 https:// 开头,会直接返回 301 永久重定向。

shell 复制代码
. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W  #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^magedu] #匹配除了magedu 这几个字母以外的任意字符

动态网站架构

网络架构 特点 说明
动态资源 服务端处理与加工,设计动态语言php,java,python,golang,rust...(后台,后端) 一般需要数据库(URI带有?或&就是动态请求)
静态资源 服务端发送,客户端解析(html,css,js)前端 功能简单,业务逻辑(URI是.html/png...结尾的就是静态请求)
混合 静态(前端开发),动态(后端) 全栈开发(前+后)
  • 上面部署的小鸟飞飞静态网站
常见的动态网站架构 说明
lnmp Linux系统,nginx(web服务),mysql(数据库,postgresql),php环境(动态语言)
lnmt Linux系统,nginx(web服务),mysql(数据库,postgresql),tomcat(java)
lnm? Linux系统,nginx(web),mysql(数据库,postgresql),什么语言(python,golang)

网站无法访问排查流程

shell 复制代码
1. 服务启动
   看提示
   看日志
   看systemctl status 服务名
   看journalctl -xe -u xxx
2.直接显示状态码 403(权限,首页文件),404,500,502(请求通过ngx进行转发,后面没有人接
着.),504,xxxxx    
	根据状态码分析,可能原因  
	看日志错误日志,访问日志.
	找出对应的日志进行分析

3.浏览器页面有些错误提示,不是状态提示. 
	浏览器是否加上https
	根据浏览器提示翻译与分析  
	ERR_CONNNECTION_REFUSED连接拒绝. 
		windows curl/ping/telnet 

4.无法访问,没有提示.类似于白屏. 
	F12开启调试模式,查看页面对应的状态码. 	
		windows curl/ping   
		linux curl 检查  
	根据ngx处理用户请求流程检查.   
5.网站访问慢,比较复杂

Nginx优化

性能优化

性能优化 说明 应用
expires 浏览器缓存缓存静态资源. location 区域
io 模型 使用 epoll(异步) events 区域 use epoll;
修改工具人进程数量与进程处理连接数 worker_processes auto; worker_connections 102400; 修改系统限制:文件描述符 核心区域events 区域
让每个 worker 进程可以同时处理多个请求。 multi_accept on; events 区域
gzip 压缩 (gzip) 对静态资源压缩,一般常用资源压缩 http/server
brotli 压缩 (br) 第三发插件 对静态资源压缩,针对 https 优化压缩效果 http/server
cpu 亲和力 多核心系统中,尽可能把所有 cpu 核心都用上.worker_cpu_affinity auto 核心区域
各种缓存 xxxx_bufferxxxx_cache -

expires优化

shell 复制代码
#静态资源缓存配置
	location ~* \.(js|css)$ {
		expires 1d;	
	}
#动态资源缓存配置
	location ~* \.(png|jpg|jepg|bmp)$ {
		expires 1h;
	}

让每个worker进程可以同时处理多个请求

shell 复制代码
#1.首先不设置multi_accept off;改为off
#以测试 Nginx 默认首页为例,使用ab工具压测
ab -n 100000 -c 1000 http://localhost/
#输出关键指标
Time taken for tests:   2.538 seconds      #平均响应时间
Requests per second:    39398.39 [#/sec] (mean)  #每秒处理的请求数,数值越高说明性能越强

#2.设置multi_accept on;
#以测试 Nginx 默认首页为例,使用ab工具压测
ab -n 100000 -c 1000 http://localhost/
#输出关键指标
Time taken for tests:   2.435 seconds  #平均响应时间
Requests per second:    41072.96 [#/sec] (mean) #每秒处理的请求数,数值越高说明性能越强

gzip压缩

shell 复制代码
gzip on;            #开启GZIP压缩
gzip_min_length 1k; #设置大于1k才进行压缩
gzip_buffers 4 16;  #设置压缩缓存4个每个16k
gzip_comp_level 2;  #压缩级别 数字越大 压缩率(占用空间)越小 占用CPU越多
gzip_types text/plain application/x-javascript... #哪些类型的文件需要进行压缩 这些类型需要mime type 媒体类型 
#媒体类型 == 文件类型

brotli压缩

shell 复制代码
#google弄的nginx插件 第三方插件 编译安装才能使用
brotli   on;
brotli_comp_level 6;  #压缩级别 
brotli_types    ....; #哪些类型的文件需要进行压缩 

proxy_cache缓存

  • proxy_cache为例
shell 复制代码
http区域
#/dev/shm/目录,内存
proxy_cache_path /dev/shm/nginx_cache/ levels=1:2 keys_zone=chenshiren:10m;
#proxy_cache_path 缓存文件路径
#levels 设置缓存文件目录的层次 levels=1:2表示两级目录
#keys_zone 设置缓存名字和共享内存大小

#http或server或location配置
proxy_pass http://blog_pools;
proxy_cache chenshiren; #cache区域命中,名字要和keys_zone名字一样
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;

#nginx必有3个进程
master进程管理
worker工作进程
cache缓存进程
  • proxy_buffer
shell 复制代码
#开启 buffer 功能
proxy_buffering on;
proxy_buffers 8 4k|8k; #默认8*4k 32k 8*8k 64k
proxy_buffers 128 64k;
proxy_busy_buffers_size 128k;

安全优化

安全优化 具体操作 位置
隐藏 nginx 版本号 server_tokens off; http
修改用户 user www; 核心区域
优化 nginx 服务上传文件限制 client_max_body_size 默认是 1MB;php 限制大小 /etc/php.ini post_max_size upload_max_filesize http
Nginx 防爬虫优化 (bot/spider) 希望搜索引擎爬取我们的网站,其他人写的爬虫恶意收集信息。1. 君子协议 robots.txt 协议站点目录下。2. ngix + ua 头控制 3. 加入登录验证机制,访问频率限制 可配置在 server 或 location 中
防盗链 某网站盗取其他网站的资源的链接:1. 通过 referer 控制与限制 2. 加入登录验证机制,访问频率限制 -
dos,ddos,cc 1. 控制访问频率 (访问处理) 2.CDN (流量,带宽预警) 3.DDOS 高防 ip (加钱) 尽全力防护. 使用 limit_req 和 limit_conn 模块控制频率

隐藏nginx版本号

shell 复制代码
#http区域添加
server_tokens off;

修改nginx用户

shell 复制代码
#nginx主配置文件修改
user www;

优化nginx服务上传文件限制

shell 复制代码
#http区域修改或子配置文件修改
client_max_body_size
#php 限制大小 /etc/php.ini 
post_max_size 
upload_max_filesize

Nginx 防爬虫优化 (bot/spider)

shell 复制代码
#1. 君子协议 robots.txt 协议站点目录下
站点根目录下放置rebots.txt君子协议
#2. ngix + ua 头控制 
##黑名单机制
if ($http_user_agent ~* "Mozilla|Chrome|Edge|Safari|Firefox|Opera|Brave|SamsungBrowser|MIUI|HuaweiBrowser|QQBrowser|BaiduSpider|Googlebot|Bingbot|SogouSpider|360Spider|YandexBot"){
	return 403;
}
##白名单 误杀的风险 很难列全 容易误杀
if ($http_user_agent !~* "Mozilla|Chrome|Edge|Safari|Firefox|Opera|Brave|SamsungBrowser|MIUI|HuaweiBrowser|QQBrowser|BaiduSpider|Googlebot|Bingbot|SogouSpider|360Spider|YandexBot") {
	return 403;
}
#3. 加入登录验证机制,访问频率限制

防盗链

shell 复制代码
#某网站盗取其他网站的资源的链接:
#1. 通过 referer 控制与限制 
##如果用户是直接访问 ok $http_referer空
##如果通过baidu,google搜索到网站 $http_referer是百度或google.OK
#其他referer 都拒绝
if ($http_referer !~* "^(https?://blog\.chenshiquan\.xyz|https?://baidu\.com|https?://google\.com|^$)") {
            return 403;
}
#2. 加入登录验证机制,访问频率限制

dos,ddos,cc

  • dos拒绝式服务攻击,单个IP不断访问与攻击
shell 复制代码
分析访问日志,secure日志获取IP次数
交给防火墙,安全组拒绝即可
  • ddos,cc分布式拒绝服务攻击 1000w人每个发送200请求
shell 复制代码
ddos 4层
cc   7层
## 预防方案
#1. 控制访问频率 (访问处理) 
#2.CDN (流量,带宽预警) 
#3.DDOS 高防 ip (加钱) 尽全力防护.
  • limit_req和limit_conn
shell 复制代码
limit_conn_module(connection) #连接频率限制(服务端)
limit_req_module(requst)      #请求频率限制(客户端)

http区域
   limit_conn_zone $binary_remote_addr zone=conn_zone:10m
      #limit_conn_zone 创建木桶
      #$binary_remote_addr 根据客户端IP进行限制. ipv4 4字节 ipv6 16字节
      #zone=木桶名字:大小;
   limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
      #rate=1r/s 每秒只允许通过 1 个请求
server{
	limit_conn conn_zone 10;
	#1个IP地址连接并发数是10;并发10个链接
	limit_req zone=req_zone burst=5;  #并发5个 5个洞
	
	location / {
		root /app/nginx/html;
		index index.html;
	}
}

Nginx二次开发版本

Tengine

官网:https://tengine.taobao.org/

官方文档:https://tengine.taobao.org/documentation_cn.html

由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性

shell 复制代码
#1.安装编译依赖
yum install -y gcc-c++  pcre-devel openssl-devel
#2.添加nginx系统用户
useradd -r nginx
#3.下载tengine源码包
cd /usr/local/src/
wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz
#4.解压并进入编译目录
tar xf tengine-3.1.0.tar.gz
cd tengine-3.1.0
#5.(1)运行configure脚本,生成Makefile文件
./configure --prefix=/apps/tengine-3.1.0 \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre
#(2)make根据Makefile文件,检查依赖的环境,构建应用程序
make -j `proc`
#(3)make install 复制文件到相应目录
make install
#6.设置命令软链接
ln -s /apps/tengine-3.1.0/sbin/* /usr/sbin/
#7.查看tengine版本
nginx -V
#8.配置tengine systemd文件
cat > /usr/lib/systemd/system/nginx.service <<'EOF'

[Unit]
Description=NGINX Web Server
After=network.target

[Service]
Type=forking
ExecStart=/apps/tengine-2.1.2/sbin/nginx
ExecReload=/apps/tengine-2.1.2/sbin/nginx -s reload
ExecStop=/apps/tengine-2.1.2/sbin/nginx -s quit
PIDFile=/apps/tengine-2.1.2/logs/nginx.pid

[Install]
WantedBy=multi-user.target
EOF
#9.启动tengine
systemctl daemon-reload && systemctl enable --now nginx

OpenResty

官方文档:OpenResty® - 开源官方站

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关,从而将 Nginx 有效地变成一个强大的通用 Web 应用平台

shell 复制代码
#0.创建nginx用户,并创建openresty根目录
useradd -r -s /sbin/nologin nginx
mkdir -p /apps/openresty
#1.安装编译依赖
yum install pcre-devel openssl-devel curl zlib-devel  perl make gcc-c++
#2.下载Openresty源码包
tar xf openresty-1.27.1.2.tar.gz  -C /opt/
#3.进入编译目录
cd /opt/openresty-1.27.1.2/
##开始编译
./configure --prefix=/apps/openresty \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module  \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
###根据生产的makefile文件生成二进制文件,并复制到指定目录
make  -j `nproc`  && make install

#4.设置openresty环境变量
echo 'PATH=${PATH}:/apps/openresty/bin' >> /etc/profile
source  /etc/profile

#5.查看openresty版本
openresty -version

#6.书写openresty启动配置文件
cat > /usr/lib/systemd/system/openresty.service <<'EOF'
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
# 指定PID文件的路径,确保与Nginx配置中的路径一致
PIDFile=/apps/openresty/nginx/logs/nginx.pid
# 指定Nginx可执行文件的路径
ExecStartPre=/apps/openresty/nginx/sbin/nginx -t
ExecStart=/apps/openresty/nginx/sbin/nginx
# 重新加载Nginx配置时使用的命令
ExecReload=/bin/kill -s HUP $MAINPID
# 停止Nginx服务时使用的命令
ExecStop=/bin/kill -s QUIT $MAINPID
# 设置PrivateTmp为true,以确保每个服务有自己的临时空间
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

#7.启动openresty
systemctl daemon-reload  && systemctl enable --now openresty.service

Openresty tengine nginx区别

对比维度 Nginx(原生) OpenResty Tengine(阿里开源)
核心定位 轻量级高性能 Web 服务器 / 反向代理 / 负载均衡器 基于 Nginx 的「动态扩展开发平台」(Nginx+Lua 生态) 基于 Nginx 的「企业级 Web 服务器」(优化运维 + 性能)
核心本质 原生 C 语言开发,独立开源软件 「Nginx 核心 + LuaJIT + 大量 Lua 扩展模块」的集成包 对 Nginx 源码二次开发,保留核心,新增企业级功能
开发维护方 Igor Sysoev(俄罗斯),后被 F5 收购 章亦春(agentzh)主导,OpenResty Inc. 维护 阿里巴巴集团,兼容 Nginx 社区版本迭代
核心增强特性 1. 静态资源服务、反向代理、负载均衡;2. 基础 SSL/TLS、缓存;3. 模块化架构(需手动编译扩展) 1. 内置 LuaJIT(即时编译),支持 Lua 脚本开发;2. 丰富 resty 系列模块(如 resty.http、resty.redis);3. 可通过 Lua 实现 API 网关、WAF、动态路由等 1. 异步 IO、连接池优化;2. 内置健康检查、动态配置(无需重启);3. 压缩优化(Brotli/Gzip)、防盗链、访问控制;4. 运维友好(日志切割、状态监控)
性能特点 极致轻量,内存占用低,并发处理能力强(原生 C 实现) 动态场景性能优(LuaJIT 编译加速),兼顾 Nginx 原生性能 高并发场景稳定,针对大流量(如阿里双 11)优化,资源利用率更高
适用场景 1. 纯静态资源部署(HTML/CSS/JS/ 图片);2. 基础反向代理 / 负载均衡;3. 对功能无复杂扩展需求的场景 1. API 网关(鉴权、限流、路由转发);2. 动态业务逻辑(如用户认证、数据过滤);3. WAF、缓存穿透防护;4. 需快速开发定制化功能的场景 1. 大型网站 / APP 后端服务(高并发、高可用需求);2. CDN 节点(压缩、缓存优化);3. 企业级运维场景(需动态配置、详细监控)
生态与兼容性 1. 社区成熟,第三方模块丰富(如 ngx_lua、ngx_cache_purge);2. 无内置扩展,需手动编译 1. 兼容所有 Nginx 原生模块;2. 侧重 Lua 生态,提供大量开箱即用的 Lua 库;3. 支持 Nginx 配置语法无缝迁移 1. 兼容 Nginx 99% 的配置和模块;2. 新增自有模块(如 ngx_http_upstream_check_module);3. 同步 Nginx 社区安全补丁和功能迭代
学习成本 低,核心配置简单,只需掌握 Nginx 配置语法 中,需额外学习 Lua 语言和 resty 模块使用 低 - 中,配置语法与 Nginx 一致,新增功能需熟悉专属指令
典型用户 / 案例 全球绝大多数企业(小型网站、中型服务集群) 淘宝、京东、字节跳动、Cloudflare(API 网关 / 动态服务) 阿里巴巴、字节跳动、腾讯、百度(大流量网站 / CDN)
扩展方式 需下载第三方模块源码,重新编译 Nginx 1. 直接通过 Lua 脚本扩展(无需编译);2. 支持 Nginx 原生模块编译集成 1. 内置企业级模块(无需额外安装);2. 支持 Nginx 第三方模块编译
相关推荐
阿珊和她的猫1 小时前
表单数据验证:HTML5 自带属性与其他方法的结合应用
前端·状态模式·html5
谷粒.2 小时前
Cypress vs Playwright vs Selenium:现代Web自动化测试框架深度评测
java·前端·网络·人工智能·python·selenium·测试工具
小飞侠在吗8 小时前
vue props
前端·javascript·vue.js
DsirNg9 小时前
页面栈溢出问题修复总结
前端·微信小程序
小徐_23339 小时前
uni-app 也能远程调试?使用 PageSpy 打开调试的新大门!
前端·微信小程序·uni-app
大怪v9 小时前
【Virtual World 03】上帝之手
前端·javascript
别叫我->学废了->lol在线等11 小时前
演示 hasattr 和 ** 解包操作符
开发语言·前端·python
霍夫曼11 小时前
UTC时间与本地时间转换问题
java·linux·服务器·前端·javascript
DARLING Zero two♡11 小时前
浏览器里跑 AI 语音转写?Whisper Web + cpolar让本地服务跑遍全网
前端·人工智能·whisper