Nginx 配置参数详解
分类详解 Nginx 常用核心配置参数(worker 进程、HTTP、gzip、SSL、upstream 负载均衡、stub_status 监控),并给出生产级配置模板。参数均结合 Ubuntu 22.04 实测默认值说明
Nginx 配置参数详解
目标:分类详解 Nginx 常用核心配置参数(worker 进程、HTTP、gzip、SSL、upstream 负载均衡、stub_status 监控),并给出生产级配置模板。参数均结合 Ubuntu 22.04 实测默认值说明。
环境信息
- 操作系统:Ubuntu 22.04.5 LTS
- Nginx:1.18.0(Ubuntu)
- 主配置:/etc/nginx/nginx.conf
- 实测默认:
worker_processes auto、worker_connections 768、gzip on
参数查看与修改方式
- 编译安装时用的参数:
nginx -V(查看 configure arguments)。 - 运行期指令:编辑
/etc/nginx/nginx.conf或分站点配置。 - 查看最终合并配置:
nginx -T。 - 校验语法:
nginx -t;生效:nginx -s reload。
参数总览
| 参数 | 所属上下文 | 默认值 | 说明 |
|---|---|---|---|
| worker_processes | 主 | auto | worker 进程数,auto=CPU 核数 |
| worker_connections | events | 768 | 单个 worker 最大并发连接数 |
| keepalive_timeout | http/server | 65 | 保持连接超时(Ubuntu 默认 65s) |
| sendfile | http | on | 高效零拷贝文件发送 |
| tcp_nopush | http | on | 拼包后再发送(配合 sendfile) |
| tcp_nodelay | http | on | 关闭 Nagle 算法 |
| types_hash_max_size | http | 2048 | MIME 哈希表大小 |
| default_type | http | application/octet-stream | 未匹配 MIME 的类型 |
| gzip | http | on | 是否开启压缩 |
| ssl_protocols | http/server | TLSv1..TLSv1.3 | 允许的 TLS 版本 |
| worker_rlimit_nofile | 主 | 内核上限 | worker 可打开文件数上限 |
核心参数分类详解
一、进程与性能参数
user www-data; # worker 运行身份(影响文件访问权限)
worker_processes auto; # worker 数=CPU 核数
worker_rlimit_nofile 65535; # 进程可打开文件描述符上限
pid /run/nginx.pid; # master 进程 PID 文件
events {
worker_connections 1024; # 每 worker 最大连接数,需压力测试校准
multi_accept on; # 一次 accept 多个连接
}
💡 说明:
worker_connections太高会耗尽内存、太低并发不够,生产建议经压测后设定。
二、HTTP 基础参数
http {
sendfile on; # 零拷贝
tcp_nopush on; # 攒满包再发,减少网络包数
tcp_nodelay on; # 数据及时发送(配合 keepalive)
keepalive_timeout 65; # 保持连接时长,过长耗资源、过短对 http1.1 不利
types_hash_max_size 4096; # MIME 哈希表
include /etc/nginx/mime.types; # 加载文件类型映射
default_type application/octet-stream; # 未识别的按下载处理
}
三、gzip 压缩参数(实测通过)
gzip on;
gzip_comp_level 5; # 压缩比 1-9,测 6 已默认注释,生产常用 5-6
gzip_min_length 1k; # 小于 1k 不压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;
gzip_vary on; # 响应加 Vary: Accept-Encoding
gzip_disable "MSIE [1-6]\."; # 屏蔽老 IE
实测:开启压缩并 reload 后,curl -sI --compressed http://localhost/test.html 返回 Content-Encoding: gzip 与 Vary: Accept-Encoding。
四、SSL/HTTPS 参数
server {
listen 443 ssl;
ssl_certificate /etc/ssl/certs/example.crt; # 证书链文件
ssl_certificate_key /etc/ssl/private/example.key;# 私钥
ssl_protocols TLSv1.2 TLSv1.3; # 禁旧协议
ssl_session_cache shared:SSL:10m; # 共享会话缓存,1M≈4000 会话
ssl_session_timeout 10m; # 会话缓存有效期
ssl_prefer_server_ciphers on;
}
⚠️ 说明:
ssl on指令已在 1.15.0 废弃,用listen 443 ssl;替代;升级到新版 nginx 时若仍写ssl on;会出[warn] the "ssl" directive is deprecated警告。
五、upstream 负载均衡三大模式
- 轮询(默认)
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
server { location / { proxy_pass http://backend; } }
- 权重
upstream backend {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=4; # 分配 4/5 流量
}
- IP 哈希(会话保持)
upstream backend {
ip_hash;
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=4;
}
六、stub_status 监控参数
server {
location /status {
stub_status on;
access_log off;
# allow 127.0.0.1; # 限制来源,生产强烈建议
# deny all;
}
}
reload 后访问 http://localhost/status 实测输出:
Active connections: 1
server accepts handled requests
2 2 2
Reading: 0 Writing: 1 Waiting: 0
upstream 失败策略与代理缓存(实测)
失败重试 / 健康检查参数
在 upstream 中给每台后端配置失败判定与备份,缓解单点:
upstream backend {
# max_fails 连续失败 N 次 / fail_timeout 秒内即标记不可用
server 127.0.0.1:9001 max_fails=2 fail_timeout=5s; # 活跃后端
server 127.0.0.1:9002 weight=4 backup; # backup:活跃全挂后才启用
# 其他常用:down(不参与)、max_conns=N(限最大并发)、backup(仅兜底)
}
| 参数 | 作用 |
|---|---|
| max_fails | fail_timeout 窗口内最大失败次数,超过标记不可用 |
| fail_timeout | 失败计数窗口 + 不可用后的恢复探测周期(默认 10s) |
| backup | 标记为备份节点,其余活跃节点全部不可用后才启用 |
| down | 手动将节点下线(维护用) |
| max_conns | 该节点最大并发连接数,超限转其他节点 |
容器实测:active 节点 9001 存活时请求全部返回 backend-9001;kill 掉 9001 后(fail_timeout 窗口内探测到失败),新的缓存旁路请求自动落到 backup 节点 9002,返回 backend-9002 —— 证明备份接管生效。
⚠️ 说明:若配合
proxy_cache,命中的缓存请求不经过 upstream,杀掉 active 后端后仍会从缓存响应,需留意(可用X-Cache-Status头区分)。
代理缓存 proxy_cache(实测)
proxy_cache_path /var/cache/nginx/upcache levels=1:2 \
keys_zone=upcache:10m max_size=100m inactive=10m use_temp_path=off; # http 块
server {
location /proxy/ {
proxy_pass http://backend/;
proxy_cache upcache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 1m; # 必须显式声明,否则默认不缓存
add_header X-Cache-Status $upstream_cache_status; # MISS/HIT 观测
}
}
容器实测:首次 X-Cache-Status: MISS,第二次起 HIT;去掉 proxy_cache_valid 后恒为 MISS。
四层负载均衡 stream(TCP/UDP 转发)
stream 模块做四层(非 HTTP 头)转发,编译需 --with-stream;apt 默认已以动态模块加载(/usr/lib/nginx/modules/ngx_stream_module.so):
# 与 http 平级的顶层块,需确认已 load_module
load_module modules/ngx_stream_module.so;
stream {
upstream tcp_backend {
server 127.0.0.1:3306;
server 127.0.0.1:3307 backup;
}
server {
listen 3306;
proxy_pass tcp_backend; # 四层转发 MySQL 等
}
}
💡 说明:
stream主要用于数据库、Redis、MQ 等 TCP/UDP 服务的高可用与负载,HTTP 场景不适用。
生产配置模板(Nginx 首段)
适用:≥8GB 内存、SSD、OLTP/Web 服务多站点网关:
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
events {
worker_connections 2048;
multi_accept on;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
server_tokens off; # 隐藏版本号
client_max_body_size 20m; # 接口上传限制
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;
gzip_vary on;
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 /var/log/nginx/access.log main;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
常见问题
[warn] the "ssl" directive is deprecated:新版 nginx 用listen 443 ssl;,去掉ssl on;。- gzip 没生效:
curl -I --compressed无Content-Encoding: gzip,确认gzip on;且在http块内,且响应类型在gzip_types中。 - worker_connections 超并发:压测后按需加大,同时关注
worker_rlimit_nofile与系统ulimit -n。