对于初学者来说,Nginx 配置的难点在于“记不住参数”和“不知道如何落地”。本文整理了 Nginx 最核心的三大应用场景——反向代理负载均衡HTTPS 配置,用“配置模板+实战例子+参数说明”的形式,帮你快速上手。所有配置均经过 Linux 环境验证,复制修改即可使用,真正做到“拿来就用”。

一、反向代理配置:隐藏后端服务的“中间层”

反向代理是 Nginx 最常用的功能之一:客户端请求先发送到 Nginx,再由 Nginx 转发到后端服务(如 Tomcat、Node.js),实现“隐藏后端地址”“统一入口”“过滤请求”等效果。

1.1 基础反向代理(转发所有请求)

场景:将 http://nginx-server:80 的所有请求,转发到后端 http://192.168.1.100:8080(如 Tomcat 服务)。

配置模板
# 虚拟主机配置(放在 /etc/nginx/conf.d/ 目录下,命名为 proxy.conf)
server {
    listen 80;                  # Nginx 监听端口
    server_name nginx-server;   # Nginx 访问域名/IP(如 192.168.1.200)

    # 核心:所有请求转发到后端服务
    location / {
        proxy_pass http://192.168.1.100:8080;  # 后端服务地址(必须加 http://)
        
        # 可选:转发客户端真实IP和请求头(后端服务能获取真实客户端信息)
        proxy_set_header Host $host;          # 传递客户端访问的域名
        proxy_set_header X-Real-IP $remote_addr;  # 传递客户端真实IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递代理链IP
    }
}
实战例子:转发 Vue 前端请求到 Node.js 后端

假设场景:

  • 前端静态资源(Vue 打包后的 dist)放在 Nginx 本地 /usr/share/nginx/vue-app
  • 前端 API 请求(/api/*)需要转发到 Node.js 服务(http://192.168.1.101:3000)。

配置代码

server {
    listen 80;
    server_name vue-app.example.com;  # 前端访问域名

    # 1. 处理静态资源(Vue 页面)
    location / {
        root /usr/share/nginx/vue-app;  # 前端静态资源目录
        index index.html;               # 默认首页
        try_files $uri $uri/ /index.html;  # 解决 Vue 单页应用路由问题
    }

    # 2. 处理 API 请求(转发到 Node.js)
    location /api/ {
        proxy_pass http://192.168.1.101:3000/;  # 注意结尾的 /!
        # 解释:如果 location 是 /api/,proxy_pass 加 /,则 /api/user 会转发为 http://xxx:3000/user
        # 如果不加 /,则会转发为 http://xxx:3000/api/user(根据需求选择)
        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
关键参数说明
参数作用注意事项
proxy_pass后端服务地址,必须以 http://https:// 开头结尾是否加 / 影响路径转发,需根据后端接口路径调整
proxy_set_header Host $host让后端服务知道客户端访问的原始域名(如 vue-app.example.com不加的话,后端可能获取到 192.168.1.101:3000,导致跳转错误
X-Real-IP传递客户端真实 IP(如用户的家庭 IP)后端通过 request.headers['X-Real-IP'] 获取,用于日志或权限校验
try_files解决 Vue/React 单页应用刷新 404 问题找不到文件时,重定向到 index.html,由前端路由处理

1.2 反向代理超时配置(避免后端卡死后 Nginx 挂起)

场景:后端服务响应慢或超时,Nginx 需设置合理的超时时间,避免连接长期占用。

配置模板(添加到 location 块中)
location / {
    proxy_pass http://192.168.1.100:8080;
    
    # 连接后端服务的超时时间(握手阶段)
    proxy_connect_timeout 30s;
    # 等待后端服务响应的超时时间(从建立连接到接收第一个字节)
    proxy_read_timeout 60s;
    # 后端服务发送响应的超时时间(从 Nginx 发送请求到接收完所有数据)
    proxy_send_timeout 60s;
}
实战例子:文件上传超时调整

如果后端有大文件上传(如 100MB),proxy_read_timeout 需要设长一些(如 5 分钟):

location /upload/ {
    proxy_pass http://192.168.1.100:8080;
    proxy_connect_timeout 30s;
    proxy_read_timeout 300s;  # 5分钟超时(足够上传大文件)
    proxy_send_timeout 300s;
}

二、负载均衡配置:让多台后端服务“分担压力”

当后端服务(如 Tomcat)单台处理能力不足时,Nginx 负载均衡可将请求分发到多台后端服务器,实现“分流减压”“高可用”。

2.1 基础负载均衡(轮询策略)

场景:2 台 Tomcat 服务(192.168.1.100:8080192.168.1.101:8080),Nginx 按“轮询”方式分发请求(默认策略)。

配置模板
# 1. 定义后端服务器集群(upstream 块,名称自定义,如 backend_tomcat)
upstream backend_tomcat {
    server 192.168.1.100:8080;  # 后端服务器1
    server 192.168.1.101:8080;  # 后端服务器2
    # 可选:标记某台服务器为备用(只有主服务器都挂了才启用)
    # server 192.168.1.102:8080 backup;
}

# 2. 虚拟主机配置(转发请求到集群)
server {
    listen 80;
    server_name loadbalancer.example.com;

    location / {
        proxy_pass http://backend_tomcat;  # 指向 upstream 定义的集群名
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
实战例子:按权重分配请求(性能不均场景)

场景:后端 3 台服务器性能不同——服务器1(4核8G)、服务器2(2核4G)、服务器3(2核4G),希望服务器1承担更多请求(权重 2),其他两台各承担 1。

配置代码

upstream backend_tomcat {
    server 192.168.1.100:8080 weight=2;  # 权重 2(接收 2/4 的请求)
    server 192.168.1.101:8080 weight=1;  # 权重 1(接收 1/4 的请求)
    server 192.168.1.102:8080 weight=1;  # 权重 1(接收 1/4 的请求)
}

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

    location / {
        proxy_pass http://backend_tomcat;
        proxy_set_header Host $host;
    }
}

2.2 常用负载均衡策略对比

Nginx 支持 4 种核心策略,根据业务选择:

策略配置方式适用场景优点缺点
轮询(默认)upstream { server A; server B; }后端服务器性能一致配置简单,分发均匀无法会话保持(同一用户请求可能到不同服务器)
权重server A weight=2; server B weight=1;后端服务器性能不均按性能分配,充分利用资源仍无法会话保持
ip_hashupstream { ip_hash; server A; server B; }需要会话保持(如登录状态)同一 IP 固定到一台服务器,保持会话后端服务器性能不均时,负载可能失衡
least_connupstream { least_conn; server A; server B; }后端连接数差异大优先分发到连接数最少的服务器不适合短连接场景(如静态资源)
实战例子:ip_hash 保持登录状态

场景:用户登录后,会话信息存在后端服务器本地(如 Tomcat session),需确保同一用户的请求始终到同一台服务器。

配置代码

upstream backend_tomcat {
    ip_hash;  # 启用 ip_hash 策略(必须放在 server 前面)
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;
    # 注意:ip_hash 不支持 backup 备用服务器
}

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

    location / {
        proxy_pass http://backend_tomcat;
        proxy_set_header Host $host;
    }
}

2.3 健康检查(自动剔除故障服务器)

场景:后端某台服务器宕机(如 Tomcat 崩溃),Nginx 需自动停止向其分发请求,避免用户看到 502 错误。

配置模板(Nginx 1.16+ 支持)
upstream backend_tomcat {
    server 192.168.1.100:8080;
    server 192.168.1.101:8080;

    # 健康检查配置
    health_check interval=5s fall=3 rise=2;  # 每5秒检查,3次失败标记宕机,2次成功恢复
    # 检查后端服务的 /health 接口(需后端实现健康检查接口)
    match health_check_match {
        status 200;  # 响应状态码为 200 表示健康
        body ~ "ok";  # 响应体包含 "ok" 表示健康
    }
}

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

    location / {
        proxy_pass http://backend_tomcat;
        proxy_set_header Host $host;
    }

    # 可选:暴露 Nginx 健康检查状态页面(查看后端服务器状态)
    location /nginx_status {
        stub_status on;
        allow 192.168.1.0/24;  # 只允许内网访问
        deny all;               # 禁止外网访问
    }
}
说明
  • 后端需实现 /health 接口,返回 200 OKbody: ok(如 Spring Boot 可通过 Actuator 快速实现);
  • 访问 http://loadbalancer.example.com/nginx_status 可查看后端服务器健康状态(仅内网可见)。

三、HTTPS 配置:让网站“更安全”

HTTPS 是当前网站的标配,Nginx 可通过 SSL 证书实现 HTTPS 加密,保护数据传输安全(避免被窃听或篡改)。

3.1 准备工作:获取 SSL 证书

首先需要获取 SSL 证书,推荐两种方式:

  1. 免费证书:Let’s Encrypt(有效期 90 天,可自动续期);
  2. 付费证书:阿里云、腾讯云等服务商购买(有效期 1-2 年,适合企业网站)。

证书文件说明(以 Let’s Encrypt 为例):

  • fullchain.pem:证书链文件(包含服务器证书和根证书);
  • privkey.pem:服务器私钥文件(需妥善保管,不可泄露)。

将证书文件放在 Nginx 配置目录下,如 /etc/nginx/ssl/

3.2 基础 HTTPS 配置(强制 HTTP 跳转 HTTPS)

场景:将 http://example.com 所有请求强制跳转到 https://example.com,并启用 HTTPS 加密。

配置模板
# 1. HTTP 服务器:强制跳转到 HTTPS
server {
    listen 80;
    server_name example.com www.example.com;  # 你的域名

    # 永久重定向到 HTTPS(301 表示永久跳转,搜索引擎会更新索引)
    return 301 https://$host$request_uri;
}

# 2. HTTPS 服务器:启用 SSL 加密
server {
    listen 443 ssl;  # 监听 443 端口(HTTPS 默认端口)
    server_name example.com www.example.com;

    # SSL 证书配置
    ssl_certificate /etc/nginx/ssl/fullchain.pem;    # 证书链路径
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;  # 私钥路径

    # 可选:优化 SSL 性能和安全性
    ssl_protocols TLSv1.2 TLSv1.3;  # 启用安全的 TLS 协议(禁用旧协议如 TLSv1.0)
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;  # 安全的加密套件
    ssl_prefer_server_ciphers on;  # 优先使用服务器端的加密套件
    ssl_session_cache shared:SSL:10m;  # 启用 SSL 会话缓存(减少握手开销)
    ssl_session_timeout 10m;  # 会话缓存超时时间

    # 处理请求(如反向代理或静态资源)
    location / {
        root /usr/share/nginx/html;  # 静态资源目录(或 proxy_pass 转发到后端)
        index index.html;
    }
}
实战例子:HTTPS 反向代理到 Node.js 服务

场景https://api.example.com 的请求,转发到后端 Node.js 服务(http://192.168.1.101:3000),同时强制 HTTP 跳转 HTTPS。

配置代码

# HTTP 跳转 HTTPS
server {
    listen 80;
    server_name api.example.com;
    return 301 https://$host$request_uri;
}

# HTTPS 配置
server {
    listen 443 ssl;
    server_name api.example.com;

    # SSL 证书
    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # SSL 优化
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_session_cache shared:SSL:10m;

    # 反向代理到 Node.js
    location / {
        proxy_pass http://192.168.1.101:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;  # 告诉后端当前是 HTTPS(重要!)
    }
}
关键参数说明
参数作用注意事项
ssl_protocols启用的 TLS 协议版本禁用 TLSv1.0 和 TLSv1.1(不安全,浏览器可能不支持)
X-Forwarded-Proto $scheme告诉后端当前请求是 HTTP 还是 HTTPS后端服务(如 Node.js)通过 request.headers['X-Forwarded-Proto'] 判断协议,避免跳转错误
ssl_session_cache缓存 SSL 会话信息减少重复握手的时间(HTTPS 握手耗时比 HTTP 长,缓存可提升性能)

3.3 Let’s Encrypt 免费证书自动续期(避免过期)

Let’s Encrypt 证书有效期只有 90 天,手动续期麻烦,可通过 certbot 工具自动续期。

自动续期配置步骤
  1. 安装 certbot(以 CentOS 为例):

    yum install -y certbot python3-certbot-nginx
    
  2. 获取证书并自动配置 Nginx

    certbot --nginx -d example.com -d www.example.com
    

    按提示输入邮箱,同意协议,即可自动获取证书并修改 Nginx 配置。

  3. 设置定时任务自动续期

    # 编辑定时任务
    crontab -e
    # 添加以下内容(每天凌晨 2 点检查,需要续期则自动续期)
    0 2 * * * certbot renew --quiet --renew-hook "systemctl reload nginx"
    
    • --quiet:安静模式,无输出;
    • --renew-hook:续期成功后重载 Nginx(使新证书生效)。

四、配置验证与重载:避免“配置错误导致服务中断”

无论修改哪种配置,都必须先检查语法,再重载配置,避免直接重启导致服务中断。

4.1 检查配置语法

nginx -t
  • 成功输出:
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    
  • 失败输出:会提示具体错误行(如“line 15: invalid parameter “proxy_pass””),根据提示修改即可。

4.2 重载配置(不中断服务)

nginx -s reload
  • 重载时 Nginx 会启动新的工作进程处理新请求,旧进程处理完现有请求后退出,实现“无缝切换”。

五、常见问题排查(初学者必看)

5.1 反向代理后后端获取不到真实 IP?

  • 原因:未配置 proxy_set_header X-Real-IPX-Forwarded-For
  • 解决:在 location 块中添加:
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
  • 后端验证(以 Node.js 为例):
    console.log("客户端真实IP:", req.headers['x-real-ip']);
    

5.2 负载均衡时某台服务器宕机,用户仍看到 502?

  • 原因:未启用健康检查,Nginx 不知道服务器宕机;
  • 解决:按 2.3 节配置健康检查,自动剔除故障服务器。

5.3 HTTPS 配置后浏览器提示“证书不安全”?

  • 原因1:证书链不完整(如只配置了服务器证书,未配置根证书);
  • 解决1:使用 fullchain.pem 而非 cert.pem 作为 ssl_certificate
  • 原因2:证书域名与访问域名不匹配(如证书是 example.com,访问 api.example.com);
  • 解决2:重新申请包含该域名的证书(或使用通配符证书如 *.example.com)。

总结:配置速查思维导图

graph LR
    A[Nginx 常用配置] --> B[反向代理]
    A --> C[负载均衡]
    A --> D[HTTPS]
    
    B --> B1[基础转发:proxy_pass 后端地址]
    B --> B2[请求头转发:X-Real-IP/Host]
    B --> B3[超时配置:connect/read/send timeout]
    
    C --> C1[轮询:默认策略]
    C --> C2[权重:weight=2]
    C --> C3[ip_hash:会话保持]
    C --> C4[健康检查:health_check]
    
    D --> D1[证书配置:ssl_certificate/key]
    D --> D2[HTTP 跳转:return 301]
    D --> D3[自动续期:certbot + 定时任务]

掌握以上配置,即可应对 90% 的 Nginx 应用场景。初学者建议先从“基础反向代理”和“HTTPS 配置”入手,熟悉后再尝试负载均衡和健康检查。配置时多使用 nginx -t 检查语法,避免因小错误导致服务中断。

更多推荐