文章目录
- Nginx变量使用
- Nginx负载均衡
- 会话保持/会话共享方案
- [Nginx Rewrite](#Nginx Rewrite)
- 动态网站架构
- 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表示值为空时不传递;常用子参数如HTTPS、X-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 第三方模块编译 |