引言
Nginx 作为高性能的 Web 服务器和反向代理,其配置灵活性和强大功能备受开发者青睐。本文基于一份生产环境的 Nginx 配置文件,详细拆解其核心配置逻辑,涵盖性能优化、HTTPS 安全配置、反向代理及静态资源处理等关键环节,帮助读者理解如何构建高效可靠的 Nginx 服务。
一、全局配置:进程管理与日志系统
1. 进程管理
user nginx;
worker_processes auto;
pid /var/run/nginx.pid;
-
user nginx
:指定 Nginx 工作进程运行的用户,通常使用非 root 用户以增强安全性。 -
worker_processes auto
:自动根据服务器 CPU 核心数设置工作进程数,充分利用多核性能。生产环境建议设为 CPU 核心数或其 2 倍。
2. 日志系统
error_log /var/log/nginx/error.log notice;
access_log /var/log/nginx/access.log buffer=16k flush=1m main;
error_log /var/log/nginx/error.log error;
-
错误日志:
-
error_log /var/log/nginx/error.log notice;
:全局错误日志级别为notice
,记录普通警告信息。 -
error_log /var/log/nginx/error.log error;
:在http
块中覆盖为error
级别,仅记录严重错误,减少日志冗余。
-
-
访问日志:
-
buffer=16k flush=1m
:启用 16KB 缓冲区,每 1 分钟强制写入磁盘,减少 I/O 操作,提升高并发下的性能。 -
log_format main
:自定义日志格式,包含客户端 IP、请求时间、状态码、用户代理等关键信息,便于后续分析。
-
二、Events 模块:连接处理优化
events {
worker_connections 1024;
}
worker_connections 1024
:每个工作进程的最大连接数。计算公式:worker_processes * worker_connections
为 Nginx 最大并发连接数。生产环境可根据内存调整(如 4096),但需注意系统文件句柄限制(可通过ulimit -n
查看)。
三、HTTP 核心配置:性能与压缩
1. 基础性能优化
http {
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
}
-
sendfile on
:启用零拷贝传输,减少 CPU 消耗,提升静态文件传输效率。 -
tcp_nopush on
:配合sendfile
,将多个小数据包合并为一个大数据包发送,减少网络延迟。 -
keepalive_timeout 65
:长连接超时时间,避免无效连接占用资源。
2. Gzip 压缩配置
gzip on;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css application/javascript application/json;
gzip_disable "msie6|trident";
-
gzip on
:启用压缩,通常可将文本类资源压缩至原大小的 1/4。 -
comp_level 6
:压缩级别(1-9),6 为平衡压缩率与 CPU 消耗的推荐值。 -
min_length 256
:仅压缩大于 256 字节的资源,避免小文件压缩后体积反而增大。 -
gzip_types
:指定压缩的 MIME 类型,优先压缩 HTML、CSS、JS、JSON 等文本内容。 -
gzip_disable
:禁用对旧浏览器(如 IE6)的压缩,避免兼容性问题。
四、HTTPS 配置:安全通信与性能平衡
1. 强制 HTTPS 重定向
server {
listen 80;
server_name 域名或IP地址;
return 301 https://$host$request_uri;
}
- 通过 80 端口的
server
块,将所有 HTTP 请求永久重定向(301)至 HTTPS,确保通信安全。
2. HTTPS 核心配置
server {
listen 443 ssl http2;
server_name 域名或IP地址;
ssl_certificate ssl证书配置的pem;
ssl_certificate_key ssl证书配置的key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:...;
ssl_prefer_server_ciphers on;
}
-
协议与加密算法:
-
ssl_protocols
:仅启用 TLSv1.2 和 TLSv1.3,禁用不安全的旧协议(如 SSLv3、TLSv1.0)。 -
ssl_ciphers
:使用现代加密算法,优先选择 ECDHE 算法,提供前向保密(FS)。 -
ssl_prefer_server_ciphers on
:服务端优先选择加密算法,增强安全性。
-
-
性能优化:
-
ssl_session_cache shared:SSL:10m
:共享 SSL 会话缓存,减少重复握手开销。 -
ssl_session_timeout 10m
:会话缓存超时时间,合理设置可提升连接复用率。
-
3. 安全响应头
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
-
X-Content-Type-Options nosniff
:防止浏览器误判资源 MIME 类型,避免 XSS 攻击。 -
X-Frame-Options DENY
:禁止页面被嵌入到 iframe 中,防范点击劫持。 -
Strict-Transport-Security
:强制浏览器使用 HTTPS 连接,有效期 1 年(max-age=31536000
),包含子域名。
五、反向代理与动态服务
1. 反向代理至 FastAPI 服务
location / {
proxy_pass http://fastapi:8000;
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
-
请求头透传:
-
X-Real-IP
和X-Forwarded-For
:传递客户端真实 IP,便于后端服务记录和验证。 -
Upgrade
和Connection
:支持 WebSocket 协议升级,确保动态服务兼容性。
-
-
超时设置:
-
proxy_connect_timeout 30s
:连接上游服务器的超时时间。 -
proxy_read_timeout 86400s
:读取上游响应的超时时间(长连接场景可设为大值)。
-
六、静态资源处理
location /static/ {
expires 3h;
add_header Cache-Control "max-age=10800, public";
alias /path/to/static/files/; # 需替换为实际路径
try_files $uri =404;
}
-
缓存控制:
expires 3h
和Cache-Control: max-age=10800
:强制浏览器缓存静态资源 3 小时,减少重复请求。
-
路径映射:
alias
:将/static/
前缀替换为实际文件路径(如/var/www/static/
),避免root
导致的路径重复问题。
-
错误处理 :
try_files $uri =404
确保不存在的文件直接返回 404,提升响应速度。
七、配置验证与最佳实践
1. 语法检查
nginx -t # 验证配置文件语法正确性
2. 性能调优建议
-
连接数优化 :根据服务器内存调整
worker_connections
(公式:worker_processes * worker_connections <= 系统最大文件句柄数
)。 -
SSL 证书管理:使用 Let's Encrypt 自动续签证书,避免证书过期导致服务中断。
-
日志分析:结合 ELK Stack 或 Prometheus 分析访问日志,监控异常请求和慢响应。
八、示例nginx.conf文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log buffer=16k flush=1m main;
error_log /var/log/nginx/error.log error;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
# 压缩文件配置
gzip on;
gzip_comp_level 6;
gzip_min_length 256;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_vary on;
# 压缩文件类型
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
application/xml+rss
application/xhtml+xml;
# 禁用对旧浏览器的压缩
gzip_disable "msie6|trident";
include /etc/nginx/conf.d/*.conf;
# 关键配置
server {
listen 80;
server_name 域名或IP地址;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name 域名或IP地址;
# SSL 证书配置
ssl_certificate ssl证书配置的pem;
ssl_certificate_key ssl证书配置的key;
# SSL 安全配置(优化后)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
error_page 497 https://$host$request_uri;
# 安全头
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
# 反向代理
location / {
# 使用服务名或网络别名代替本地地址,不支持https
proxy_pass http://fastapi:8000;
# 基础请求头设置
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;
# WebSocket 支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 超时设置 (根据实际需求调整)
proxy_connect_timeout 30s;
proxy_read_timeout 86400s;
proxy_send_timeout 30s;
# 可选: 缓冲区设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
}
# 静态资源
location /static/ {
expires 3h
add_header Cache-Control "max-age=10800, public";
alias 文件路径
try_files $uri =404;
}
}
}
九、总结
本文拆解的 Nginx 配置涵盖了性能优化、HTTPS 安全、反向代理及静态资源管理的核心逻辑。关键亮点包括:
-
通过
sendfile
、Gzip 压缩和长连接配置提升性能; -
严格的 HTTPS 配置与安全响应头增强数据传输安全;
-
灵活的反向代理与 WebSocket 支持适配现代应用架构。
实际部署时,需根据业务场景调整参数(如超时时间、缓存策略),并定期进行安全审计和性能压测,确保 Nginx 服务稳定高效运行。