Nginx 完全指南:从入门到生产级实践

· 阅读约需27分钟

Nginx 完全指南:从入门到生产级实践

在当今的互联网架构中,Nginx 已然成为不可或缺的核心组件[reference:0][reference:1]。它不仅是高性能的 Web 服务器,更是承担反向代理、负载均衡、流量治理和安全防护的关键枢纽[reference:2][reference:3]。本文将系统梳理 Nginx 的核心价值、配置实践与优化策略,帮助你从入门到生产级应用全面掌握这一强大的工具。


1. Nginx 是什么?它的核心优势是什么?

Nginx (读作 “engine-x”) 是一款高性能的 HTTP 服务器与反向代理服务器,同时也支持 IMAP/POP3/SMTP 代理[reference:4][reference:5]。它的核心优势在于采用了异步非阻塞的事件驱动模型,使其能够在高并发场景下保持极低的内存占用[reference:6][reference:7]。单机即可轻松支撑数万甚至十万级别的并发连接[reference:8][reference:9]。

在现代化 Web 架构中,Nginx 凭借其卓越的性能,在静态资源服务、反向代理、负载均衡等场景展现出显著优势[reference:10]。


2. Nginx 核心配置:从结构到实战

Nginx 的配置文件(通常为 nginx.conf)采用嵌套块结构,主要分为三个层次[reference:11]:

  • 全局配置(Main):设置运行用户、工作进程数等全局参数[reference:12]。
  • events 配置:配置网络连接相关参数,如事件模型和最大连接数[reference:13]。
  • http 配置:最核心的部分,包含所有 Web 服务的配置,可包含多个 serverupstream 块[reference:14]。

2.1 生产级配置骨架

以下是一份可直接用于生产环境的 Nginx 配置骨架,涵盖了高性能调优和基本安全设置[reference:15][reference:16]:

# ========== 1. 全局配置 ==========
user nginx;                         # 使用专用低权限用户运行[reference:17][reference:18]
worker_processes auto;              # 自动匹配 CPU 核心数[reference:19][reference:20]
worker_rlimit_nofile 65535;         # 提升 worker 进程最大打开文件数[reference:21]
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

# ========== 2. events 配置 ==========
events {
    use epoll;                      # Linux 高性能事件模型[reference:22][reference:23]
    worker_connections 65535;       # 单个 worker 最大连接数[reference:24][reference:25]
    multi_accept on;                # 允许同时接受多个连接[reference:26][reference:27]
}

# ========== 3. http 核心配置 ==========
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    charset utf-8;

    # ---------- 日志格式 ----------
    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;

    # ---------- 性能调优 ----------
    sendfile on;                    # 启用零拷贝技术[reference:28][reference:29]
    tcp_nopush on;                  # 优化数据包发送[reference:30][reference:31]
    tcp_nodelay on;                 # 禁用 Nagle 算法[reference:32][reference:33]
    keepalive_timeout 65;           # 长连接超时时间[reference:34][reference:35]
    keepalive_requests 10000;       # 单个连接最大请求数[reference:36][reference:37]
    client_max_body_size 20M;       # 限制客户端请求体大小[reference:38]

    # ---------- 隐藏版本号 ----------
    server_tokens off;              # 隐藏 Nginx 版本信息[reference:39][reference:40]

    # ---------- 静态文件缓存 ----------
    open_file_cache max=65535 inactive=60s;
    open_file_cache_valid 80s;
    open_file_cache_min_uses 1;

    # ---------- Gzip 压缩 ----------
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;           # 1KB 以下不压缩[reference:41]
    gzip_comp_level 6;              # 平衡压缩率与 CPU 消耗[reference:42]
    gzip_types text/plain text/css text/javascript
               application/javascript application/json application/xml;

    # ---------- 引入其他配置 ----------
    include /etc/nginx/conf.d/*.conf;
}

3. 反向代理:统一入口与路由转发

反向代理是 Nginx 最核心的应用场景之一[reference:43]。它位于客户端和后端服务器之间,接收客户端请求后转发给后端,再将响应返回给客户端[reference:44]。这使得 Nginx 可以统一处理 SSL 证书、访问控制、缓冲和转发规则,减少后端服务直接暴露在公网的必要性[reference:45]。

3.1 基础反向代理配置

以下配置将 example.com 的请求转发到本地的 8080 端口[reference:46]:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        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;
    }
}

proxy_set_header 指令用于传递客户端真实信息给后端,在日志记录和安全校验中非常关键[reference:47]。

3.2 多服务路由(微服务网关)

当需要在一台服务器上托管多个服务时,可以根据 URL 路径将请求路由到不同的后端[reference:48][reference:49]:

server {
    listen 80;
    server_name api.example.com;

    # 用户服务
    location /user/ {
        proxy_pass http://user-service/;
    }

    # 订单服务
    location /order/ {
        proxy_pass http://order-service/;
    }

    # 支付服务
    location /pay/ {
        proxy_pass http://pay-service/;
    }
}

这种方式让你可以在一台服务器上运行不同技术栈(如 Node.js、Python、Java)的项目,由 Nginx 统一对外提供服务[reference:50]。


4. 负载均衡:高可用与流量分发

Nginx 通过 upstream 模块实现负载均衡,支持多种算法[reference:51][reference:52]。当后端有多个服务器时,Nginx 可以将请求均匀分发,避免单点故障[reference:53]。

4.1 定义后端服务器组

upstream backend {
    server 192.168.1.101:80;
    server 192.168.1.102:80;
}

4.2 负载均衡算法

算法配置方式适用场景
轮询(默认)不指定算法服务器性能相近[reference:54]
加权轮询server 192.168.1.101:80 weight=3;服务器性能差异大[reference:55][reference:56]
IP 哈希ip_hash;需要会话保持(如登录状态)[reference:57][reference:58]
最少连接least_conn;长连接场景(如文件上传、聊天)[reference:59]

4.3 完整负载均衡配置示例

upstream backend {
    # 加权轮询:性能好的服务器分配更多流量[reference:60]
    server 192.168.1.101:80 weight=3 max_fails=3 fail_timeout=30s;
    server 192.168.1.102:80 weight=2 max_fails=3 fail_timeout=30s;
    server 192.168.1.103:80 backup;          # 备份服务器[reference:61]
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 超时设置[reference:62]
        proxy_connect_timeout 5s;
        proxy_send_timeout 10s;
        proxy_read_timeout 30s;
    }
}

5. 性能优化:让 Nginx 发挥极致

Nginx 的性能优化涉及多个层面,包括内核参数、Nginx 配置和静态资源策略[reference:63]。优化顺序建议为:先网络与内核 → 再 Nginx 并发与传输 → 后静态资源与缓存[reference:64]。

5.1 关键性能配置

配置项推荐值说明
worker_processesauto 或 CPU 核心数充分利用多核 CPU[reference:65][reference:66]
worker_connections65535单机最大连接数[reference:67][reference:68]
worker_rlimit_nofile65535提升文件描述符限制[reference:69]
sendfileon零拷贝技术,提升传输效率[reference:70]
keepalive_requests10000单连接复用请求数[reference:71][reference:72]

5.2 Gzip 压缩优化

Gzip 压缩可以有效减少带宽消耗,实测可节省 20%-60% 的带宽[reference:73][reference:74]:

gzip on;
gzip_vary on;
gzip_min_length 1024;           # 1KB 以下不压缩,避免 CPU 浪费[reference:75]
gzip_comp_level 6;              # 6 级平衡压缩率与 CPU 消耗[reference:76]
gzip_types text/plain text/css text/javascript
           application/javascript application/json application/xml
           application/xml+rss text/xml;

5.3 静态资源缓存

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    root /var/www/assets;
    expires 30d;                # 强缓存 30 天[reference:77]
    add_header Cache-Control "public, no-transform";
    access_log off;             # 关闭日志减少磁盘 I/O[reference:78]
}

6. 安全加固:构建坚固的防线

Nginx 默认配置可能无法抵御所有安全威胁,对其进行安全加固至关重要[reference:79]。俗话说:”一个配置完善的 Nginx,胜过十台 WAF!”[reference:80]

6.1 基础安全配置

# 1. 隐藏版本号[reference:81][reference:82]
server_tokens off;

# 2. 禁用非必要 HTTP 方法[reference:83][reference:84]
location / {
    limit_except GET POST {
        deny all;
    }
}

# 3. 限制敏感文件访问[reference:85][reference:86]
location ~ /\.git {
    deny all;
}
location ~ /\.ht {
    deny all;
}

# 4. 限制请求体大小[reference:87]
client_max_body_size 10M;

6.2 HTTPS 与 SSL/TLS 配置

server {
    listen 443 ssl http2;               # 启用 HTTP/2[reference:88]
    server_name example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    # 仅启用安全的 TLS 协议[reference:89]
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;

    # HSTS:强制浏览器使用 HTTPS[reference:90]
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        proxy_pass http://backend;
    }
}

# HTTP 强制跳转 HTTPS[reference:91][reference:92]
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

6.3 安全响应头

# 防止点击劫持[reference:93]
add_header X-Frame-Options "SAMEORIGIN" always;

# 启用 XSS 保护[reference:94]
add_header X-XSS-Protection "1; mode=block" always;

# 防止 MIME 类型嗅探[reference:95]
add_header X-Content-Type-Options "nosniff" always;

6.4 限流与防攻击

# 限制请求速率:单个 IP 每秒 10 个请求[reference:96]
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

# 限制并发连接数:单个 IP 最多 100 个连接[reference:97]
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    location /api/ {
        limit_req zone=req_limit burst=20 nodelay;
        limit_conn conn_limit 100;
        proxy_pass http://backend;
    }
}

7. 常见问题与排查

7.1 502/504 错误

通常表示后端服务不可用或响应超时。检查:

  • 后端服务是否正常运行
  • proxy_connect_timeoutproxy_read_timeout 是否设置过小[reference:98]
  • 后端服务器资源是否耗尽

7.2 配置生效

nginx -t          # 检查配置语法[reference:99]
nginx -s reload   # 平滑重载配置[reference:100]
nginx -s stop     # 快速停止
nginx -s quit     # 优雅停止

8. 总结

Nginx 凭借其事件驱动的非阻塞架构,已成为现代 Web 架构中性能最高、最稳定的核心组件之一[reference:101][reference:102]。无论是作为 Web 服务器、反向代理、负载均衡器还是安全网关,Nginx 都能胜任[reference:103]。通过本文的系统梳理,希望你能够掌握 Nginx 的核心配置、性能优化和安全加固方法,在实际生产环境中充分发挥其强大能力。

架构稳不稳,先看 Nginx 配置狠不狠[reference:104]。立即检查你的 Nginx 配置,让每一份配置都发挥最大价值!


参考资源