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(需编译模块)减少传输体积。
  • 为静态资源设置长期缓存头(expiresCache-Control)。
  • 使用 sendfiletcp_nopushtcp_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 即可启用。