概述
Nginx 配置由全局块、events 块、http 块、server 块、location 块五层嵌套组成,
层级关系为:
# 全局块(顶层,不属于任何块)
events { ... } # 连接、IO、进程模型配置
http { # 所有HTTP服务总入口
# http全局配置
server { # 虚拟主机(站点)
# server站点配置
location / { # 路由匹配规则
# 路由处理配置
}
}
}
默认主配置文件路径:
- CentOS/RHEL:/etc/nginx/nginx.conf
- Debian/Ubuntu:/etc/nginx/nginx.conf
nginx配置文件
全局块
作用:配置 Nginx 全局运行参数,影响所有子模块。
-
user
user nginx nginx
语法:user [用户名] [用户组];
作用:worker进程运行身份,生产禁止root,防止权限泄露
不写默认nobody,CentOS默认nginx用户,ubuntu系列默认www-data
-
worker_processes
worker_processes auto;
语法:worker_processes 数字 | auto;
auto:自动匹配CPU核心数(推荐生产)
例:4核CPU写4;最大不超过CPU核心*2
原理:每个worker单进程单线程,无锁,高并发核心
-
worker_cpu_affinity CPU 亲和绑定
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity auto;4核CPU绑定示例,0001 0010 0100 1000 分别对应4个核心
作用:固定worker进程跑在指定CPU,减少CPU切换损耗,高并发优化
生产环境建议使用worker_cpu_affinity auto;
-
error_log 全局错误日志
error_log /var/log/nginx/error.log warn;
语法:error_log 路径 日志级别;
级别(从低到高):debug | info | notice | warn | error | crit | alert | emerg
生产推荐warn/error,debug会大量打印日志,仅调试使用
可写多个error_log分文件存储不同级别日志
-
pid 进程 PID 文件
pid /run/nginx.pid;
存储master主进程PID,nginx stop/reload会读取此文件
-
worker_rlimit_nofile 进程最大文件句柄
worker_rlimit_nofile 65535;
单个worker能打开的最大文件数,必须大于并发连接数
系统内核也要同步修改 /etc/security/limits.conf nofile
-
worker_rlimit_core
worker_rlimit_core 500M;
core转储文件最大大小,崩溃调试使用
events模块
所有网络 IO、连接数、事件驱动都在这里,决定并发承载能力
events {
# 1. 单worker最大连接数
worker_connections 10240;
# 计算公式:理论最大并发 = worker_processes * worker_connections
# 注意:一条HTTP连接会占用2个fd(客户端+后端),实际并发减半
# 建议设置为10240:worker_connections 10240;,注意不能超过系统最大文件句柄数限制
# worker_connections 上限受 worker_rlimit_nofile 限制
# 2. IO多路复用模型(linux推荐epoll,freebsd kqueue,windows select)
use epoll;
# 3. 批量接收连接,性能优化
multi_accept on;
# on:一次性接收所有等待连接;off:一次只接收1个
# 4. 事件通知方式,减少系统调用
epoll_events 1024;
# 5. 锁优化,多核防惊群
#是否启用连接分配互斥锁,防止惊群现象
accept_mutex on;
# 互斥锁等待时间
accept_mutex_delay 500ms;
}
http模块
所有虚拟主机共享配置,包含 mime、缓存、超时、压缩、反向代理、日志、长连接等
http {
# ===================== 1. 文件类型MIME配置 =====================
# 引入媒体类型映射文件,定义后缀对应Content-Type
include /etc/nginx/mime.types;
# 未知文件默认二进制下载,不解析
default_type application/octet-stream;
# ===================== 2. 访问日志格式定义 =====================
# log_format 自定义日志模板,main为格式名称,变量见文末变量大全
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# buffer:日志缓冲区,满了再落盘;flush:超时强制刷盘,减少IO
access_log /var/log/nginx/access.log main buffer=64k flush=5s;
# 日志文件缓存,减少打开关闭文件的开销
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
# ===================== 3. 高效文件传输优化 =====================
# 零拷贝,内核直接发送文件,不经过用户态,静态文件必开
sendfile on;
# sendfile配套,攒满数据包一次性发送,减少小包
tcp_nopush on;
# 动态接口可on降低延迟
tcp_nodelay on;
# ===================== 4. 长连接超时 =====================
# 客户端空闲连接65秒断开
keepalive_timeout 65;
# 单条长连接最多处理1000次请求,防止单连接占资源
keepalive_requests 1000;
# ===================== 5. Gzip静态资源压缩 =====================
gzip on;
gzip_min_length 1k; # 小于1k不压缩
gzip_buffers 4 16k; # 压缩缓冲区
gzip_http_version 1.1; # 兼容http1.1
gzip_comp_level 4; # 压缩等级1-9,越高越耗CPU,4平衡
# 仅压缩文本类,图片/视频不压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
gzip_vary on; # 响应头添加Vary: Accept-Encoding
gzip_proxied any; # 反向代理后端返回内容也压缩
# ===================== 6. 隐藏Nginx版本号(安全) =====================
# 关闭后错误页、响应头不再显示nginx版本,防止漏洞针对性攻击
server_tokens off;
# ===================== 7. 客户端请求限制 =====================
# 客户端上传文件最大100M,超过返回413 Request Entity Too Large
client_max_body_size 100M;
# 请求体内存缓冲区,超过写入临时磁盘
client_body_buffer_size 128k;
client_header_buffer_size 1k;
# 超大请求头缓冲区(如长cookie、JWT)
large_client_header_buffers 4 8k;
# 请求头读取超时
client_header_timeout 10;
client_body_timeout 10;
send_timeout 30; # 响应发送超时,默认值60
# ===================== 8. 连接限速、IP限流 =====================
# 全局定义限流规则,server/location中调用
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s burst=20 nodelay;
# ===================== 9. 文件缓存(静态文件元数据缓存) =====================
open_file_cache max=10000 inactive=60s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# ===================== 10. 反向代理全局公共参数 =====================
proxy_connect_timeout 60s;
proxy_read_timeout 60s;
proxy_send_timeout 60s;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
proxy_temp_file_write_size 16k;
# 透传真实客户端IP给后端服务
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 传递http/https协议
# 安全相关
add_header X-Frame-Options "SAMEORIGIN" always; # 防止点击劫持
add_header X-Content-Type-Options "nosniff" always; # 防止MIME类型嗅探
add_header X-XSS-Protection "1; mode=block" always; # 启用XSS防护
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" always; # CSP策略,根据业务调整
# ===================== 11. 负载均衡上游集群(反向代理后端组) =====================
upstream backend_server {
server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 weight=2 backup;
server 127.0.0.1:8082 down;
# 负载均衡策略
ip_hash; # 同一IP固定后端,解决session共享
# least_conn; 最少连接优先
# url_hash; 按url哈希
# fair; 响应时间优先(第三方模块)
}
# ===================== 12. 引入独立站点配置(分文件管理) =====================
include /etc/nginx/conf.d/*.conf;
# 所有conf.d下的配置文件会自动加载,多站点分离,便于维护
}
server块
一个 server{} 代表一个网站,通过 listen 端口 + server_name 域名区分,支持多域名、泛域名、HTTPS 证书配置。
# HTTP 80端口:所有域名统一301跳转HTTPS
server {
listen 80;
# 兼容IPv6
listen [::]:80;
# 同步把泛域名加上,所有http域名统一跳转
server_name www.example.com example.com *.example.com;
# 直接跳转,本块无需静态资源、限流、日志等配置(不会走到location)
return 301 https://$host$request_uri;
# 如需单独记录http跳转日志可保留,不需要直接删掉
access_log /var/log/nginx/example_http_redirect.log main;
}
# HTTPS 443主站点(整合所有业务逻辑:证书、缓存、限流、黑白名单、SPA路由)
server {
# http2多路复用,提升页面加载速度
listen 443 ssl http2;
listen [::]:443 ssl http2;
# 补齐泛域名,统一管理所有域名
server_name www.example.com example.com *.example.com;
# ==================== SSL证书与安全加密 ====================
# ssl证书
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
ssl_trusted_certificate /etc/nginx/ssl/ca.crt;
# SSL安全加密套件(防中间人、弱加密)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
# SSL会话缓存优化,减少握手耗时
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# ==================== 安全响应头 ====================
# HSTS强制浏览器使用HTTPS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options nosniff always;
# ==================== 站点基础配置 ====================
root /data/www/example;
index index.html index.htm index.php;
# 站点独立日志
access_log /var/log/nginx/example_access.log main;
error_log /var/log/nginx/example_error.log error;
# ==================== 限流、IP黑白名单 ====================
limit_conn conn_limit 20;
limit_req zone=req_limit burst=10;
deny 192.168.1.100;
allow all;
# ==================== SPA前端路由兜底 ====================
location / {
try_files $uri $uri/ /index.html;
}
}
location模块
location 匹配语法与优先级
匹配符号优先级从高到低:
- = 精准完全匹配(最高)
- ^~ 前缀匹配,匹配成功后不再检索正则
- ~ 区分大小写正则匹配
- ~* 不区分大小写正则匹配
- 无符号普通前缀匹配(最低)
示例:
# 1. 精准匹配,仅访问 / 命中
location = / {
return 200 "home page";
}
# 2. ^~ 静态资源前缀匹配,匹配后跳过正则,性能更高
location ^~ /static/ {
root /data/www;
expires 30d; # 静态资源浏览器缓存30天
}
# 3. 区分大小写正则,匹配图片后缀
location ~ \.(jpg|png|gif|jpeg)$ {
expires 7d;
}
# 4. 不区分大小写正则
location ~* \.(css|js)$ {
expires 1d;
}
# 5. 通用兜底匹配,所有未匹配路由
location / {
proxy_pass http://backend_server;
}
-
alias指令
root:拼接 root + location路径
location /static/ {
root /data/www;
# 访问 /static/a.jpg 实际文件 /data/www/static/a.jpg
}alias:直接替换location路径
location /static/ {
alias /data/www/static_files/;
# 访问 /static/a.jpg 实际访问文件 /data/www/static_files/a.jpg
}注意alias末尾必须带/,否则路径错乱
-
expires 浏览器缓存(静态资源性能优化)
location ~* .(png|jpg|css|js)$ {
expires 30d; # 缓存30天
# expires -1; 禁止缓存
# expires epoch; 立即过期
add_header Cache-Control "public, no-transform";
} -
proxy_pass 反向代理(后端转发)
location /api/ {
# 转发到上游负载均衡集群
proxy_pass http://backend_server/;
# 末尾/作用:替换匹配前缀
# proxy_pass http://127.0.0.1:8080 无/:/api/xxx -> /api/xxx
# proxy_pass http://127.0.0.1:8080/ 有/:/api/xxx -> /xxx# 继承http块proxy参数,可单独覆盖超时 proxy_read_timeout 120s;}
-
try_files 文件存在性判断(SPA、静态站点必备)
依次查找uri文件、uri/目录,都不存在则跳转最后参数
location / {
try_files uri uri/ /index.html;
} -
PHP-FPM 解析配置(PHP 站点专用)
location ~ .php { fastcgi_pass 127.0.0.1:9000; # php-fpm地址 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME document_root$fastcgi_script_name;
include fastcgi_params;
} -
valid_referers
location ~* .(jpg|png) { valid_referers none blocked server_names *.example.com; if (invalid_referer) {
return 403; # 非法外链图片返回403
}
} -
deny/allow IP 访问控制
location /admin {
allow 192.168.1.0/24;
deny all; # 仅内网可访问后台
} -
limit_conn /limit_req 单路由限流
location /login {
limit_req zone=req_limit burst=5 nodelay;
}