Nginx 实战配置精要
Nginx 基本概念和架构
Nginx 是一款高性能 HTTP / 反向代理服务器,特点是占用资源少、并发能力强。常见使用场景:
- 静态 Web 服务器
- 反向代理
- 负载均衡
- SSL/TLS 终端
- 缓存和 Gzip 压缩
架构上 Nginx 采用主进程(master)+ 多个工作进程(worker)模型。master 负责管理配置和 worker 进程,worker 处理实际请求。通过 nginx -s reload 可以平滑重载配置而不中断服务。
常用配置模板
1. 静态文件服务器
server {
listen 80;
server_name static.example.com;
root /var/www/static;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(jpg|jpeg|png|gif|css|js|svg|woff|woff2)$ {
expires 30d;
access_log off;
}
}
2. 反向代理
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
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;
}
}
3. SSL / HTTPS 配置
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers off;
location / {
root /var/www/html;
index index.html;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
4. 缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 301 302 10m;
proxy_cache_valid 404 1m;
proxy_pass http://backend;
}
}
5. Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
性能优化建议
- 启用 Gzip 和 Brotli(需编译模块)减少传输体积。
- 为静态资源设置长期缓存头(
expires、Cache-Control)。 - 使用
sendfile、tcp_nopush、tcp_nodelay提升文件发送效率。 - 开启 HTTP/2 或 HTTP/3,减少连接开销。
- 合理设置 worker 进程数:
worker_processes auto;通常即可。 - 限制大文件上传:
client_max_body_size 50m;。 - 使用
access_log off;关闭静态资源访问日志,降低磁盘 I/O。 - 配置
open_file_cache缓存文件描述符。
示例:
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
gzip on;
gzip_vary on;
gzip_min_length 1024;
}
常见问题排查
1. 配置语法检查
nginx -t
2. 重新加载配置
nginx -s reload
3. 查看错误日志
tail -f /var/log/nginx/error.log
4. 403 Forbidden
- 检查
root路径是否正确。 - 检查文件权限和所属用户。
- 确认是否启用
autoindex或正确配置try_files。
5. 502 Bad Gateway
- 后端服务是否运行。
proxy_pass地址和端口是否正确。- 防火墙是否允许通信。
6. 端口被占用
sudo ss -tlnp | grep 80
7. 域名解析不生效
- 检查 DNS 解析。
- 检查
server_name是否包含正确域名。 - 使用
curl -H "Host:example.com" http://ip/测试。
8. 高并发下连接数不足
- 调整
worker_connections。 - 增加
worker_rlimit_nofile。
events {
worker_connections 4096;
use epoll;
}
9. 安全建议
- 隐藏版本号:
server_tokens off;。 - 限制敏感目录访问。
- 配置 fail2ban 或 WAF 防止暴力攻击。
server_tokens off;
location ~ /\. {
deny all;
}
评论功能基于 Giscus(GitHub Discussions)——在 repo 启用 Discussions 后,到 giscus.app 获取仓库 ID 填入
src/_data/site.json即可启用。