Nginx 反向代理配置实战指南:从入门到进阶

举报
yd_239025793 发表于 2026/10/17 00:47:35 2026/10/17
【摘要】 本文面向 Linux 运维人员,详细介绍 Nginx 反向代理的核心概念与应用场景。通过实操步骤与可复制的配置示例,讲解基础代理、负载均衡、Header 传递等进阶配置,并总结常见问题与避坑指南,助你快速掌握 Nginx 代理技术。

一、反向代理背景与用途

在云原生与微服务架构盛行的今天,Nginx 作为高性能的 Web 服务器与反向代理软件,是运维工程师必备的技能。反向代理(Reverse Proxy)是指代理服务器接收客户端的请求,然后将请求转发给内部网络上的后端服务器,并将后端服务器的响应结果返回给客户端。代理服务器对外表现为一个独立的服务器。

其主要用途包括:

  • 负载均衡:将请求分发到多台后端服务器,提升系统吞吐量与高可用性。
  • 安全隔离:隐藏后端真实服务器 IP,保护内网安全。
  • 缓存加速:代理服务器缓存静态资源,减轻后端压力。
  • SSL 卸载:在代理层处理 HTTPS 加密解密,后端使用 HTTP 明文传输。

二、环境准备与常用命令

本文以 CentOS 7/8 和 Ubuntu 20.04/22.04 环境为例。首先确保系统已安装 Nginx。

1. 安装 Nginx

# CentOS 系统
sudo yum install epel-release -y
sudo yum install nginx -y

# Ubuntu 系统
sudo apt update
sudo apt install nginx -y

2. 常用管理命令

# 启动 Nginx
sudo systemctl start nginx

# 停止 Nginx
sudo systemctl stop nginx

# 重载配置(平滑生效,不中断服务)
sudo systemctl reload nginx

# 检查配置文件语法是否正确
sudo nginx -t

三、基础反向代理配置实操

1. 单节点反向代理

假设我们有一台后端业务服务器运行在 8080 端口,我们希望通过 Nginx 的 80 端口代理该服务。编辑 Nginx 配置文件(通常位于 /etc/nginx/conf.d/default.conf 或 /etc/nginx/nginx.conf)。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
    }
}

配置完成后,执行 sudo nginx -t 检查语法,无误后执行 sudo systemctl reload nginx 生效。

2. 多节点负载均衡代理

当业务量增大时,通常会部署多台后端服务。Nginx 的 upstream 模块可以实现负载均衡。

# 定义后端服务器组
upstream backend_servers {
    # 默认轮询
    server 192.168.1.101:8080 weight=3; # 权重为3
    server 192.168.1.102:8080 weight=1; # 权重为1
    server 192.168.1.103:8080 backup;   # 备用服务器,当其他全挂时才启用
}

server {
    listen 80;
    server_name example.com;

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

四、进阶配置:Header 传递与 WebSocket

1. 传递真实客户端 IP 与协议

由于经过反向代理,后端服务器获取到的 IP 将是 Nginx 的 IP。为了让后端获取真实客户端信息,需要设置请求头。

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        
        # 传递真实客户端 IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        # 传递真实协议 (http 或 https)
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

2. 支持 WebSocket 代理

若后端服务使用了 WebSocket(如实时聊天、通知系统),需在 Nginx 中配置 Upgrade 头。

location /ws/ {
    proxy_pass http://backend_servers;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400; # 保持长连接时间
}

五、注意事项与常见问题

  • 502 Bad Gateway:通常是因为后端服务未启动,或 SELinux/防火墙阻止了 Nginx 访问后端端口。可使用 getenforce 检查 SELinux 状态,或检查后端服务日志。
  • URI 转发路径差异:proxy_pass http://backend/; 与 proxy_pass http://backend; 的区别。带斜杠会替换 location 匹配的路径,不带斜杠则会将完整 URI 传递给后端。配置时需根据后端路由逻辑仔细测试。
  • 大文件上传超时:默认代理超时时间可能较短。若涉及大文件上传或长耗时任务,需增加 proxy_read_timeout、proxy_send_timeout 和 client_max_body_size 的值。
  • 缓存与缓冲:默认 proxy_buffering 为 on,对于流式响应(如 SSE)需关闭:proxy_buffering off;。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。