Nginx 反向代理配置入门:从零搭建网站流量转发

举报
yd_286077367 发表于 2026/11/10 20:42:49 2026/11/10
【摘要】 Nginx 反向代理配置入门:从零搭建网站流量转发 什么是反向代理反向代理(Reverse Proxy)是指以代理服务器(如 Nginx)代表真实后端站点接收客户端请求,再由代理把请求转发到后端的 Web 服务,最后把后端的响应原样返回给客户端。对客户端而言,它只和代理打交道,看不到后端的 IP 与端口。与正向代理不同,正向代理代替的是客户端,而反向代理代替的是服务端。在实际项目中,反向代...

Nginx 反向代理配置入门:从零搭建网站流量转发

什么是反向代理

反向代理(Reverse Proxy)是指以代理服务器(如 Nginx)代表真实后端站点接收客户端请求,再由代理把请求转发到后端的 Web 服务,最后把后端的响应原样返回给客户端。对客户端而言,它只和代理打交道,看不到后端的 IP 与端口。与正向代理不同,正向代理代替的是客户端,而反向代理代替的是服务端。

在实际项目中,反向代理常用于负载均衡、隐藏后端真实地址、统一入口域名、TLS 终结(HTTPS 解密由 Nginx 完成,后端仅用 HTTP)以及按路径将请求分发给不同的微服务。

为什么要用反向代理

  • 安全隔离:后端服务不需要对外暴露端口,只暴露 Nginx 的 80/443。
  • 负载均衡:把流量分摊到多台后端实例,提高可用性和吞吐。
  • 协议转换:对外提供 HTTPS,内部用 HTTP 与后端通信,降低后端 TLS 开销。
  • 按路径/域名路由:同一台 Nginx 可以把 /api 发给 A 服务,/admin 发给 B 服务。
  • 静态资源加速与压缩:Nginx 处理 gzip、缓存、Range 请求,后端只负责业务逻辑。

环境准备

本文示例在一台 Linux 服务器上完成,已安装 Nginx 与一台后端应用。操作要点如下:

  1. 安装 Nginx(以 Ubuntu/Debian 为例使用 apt,CentOS/AlmaLinux 使用 yum/dnf)。
  2. 确认 Nginx 服务已启动并监听 80 端口。
  3. 准备一台后端应用,监听在本地回环地址的某个端口上(例如 8080),可用任何 Web 框架或静态目录模拟。
  4. 确保防火墙/安全组放行 80 端口(以及 443 若启用 HTTPS)。

最简反向代理配置

打开 Nginx 主配置或站点配置文件(通常在 sites-enabled 目录下),在 server 块内使用 proxy_pass 指令将请求转发给后端。

server {
    listen 80;
    server_name 你的域名;

    location / {
        proxy_pass http://后端地址:后端端口;
        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_pass:指定后端目标地址。写 http:// 开头,后面跟上后端地址与端口。
  • proxy_set_header Host $host:把客户端请求中的 Host 原样传给后端,避免后端拿不到正确域名。
  • X-Real-IP / X-Forwarded-For:把真实客户端 IP 透传给后端,方便后端记录日志和做限流。
  • X-Forwarded-Proto:告知后端客户端最初使用的是 http 还是 https。

配完后执行配置语法检查(nginx -t),无误后重载服务(systemctl reload nginx)即可生效。

按路径分发到不同后端

当多个服务共用同一域名时,可以用 location 前缀把不同路径路由到不同后端。

server {
    listen 80;
    server_name 你的域名;

    location /api {
        proxy_pass http://api后端地址:api后端端口;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /admin {
        proxy_pass http://admin后端地址:admin后端端口;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location / {
        proxy_pass http://默认后端地址:默认后端端口;
        proxy_set_header Host $host;
    }
}

注意:location 前缀匹配时,/api 会命中所有以 /api 开头的路径。如果不想影响 /api-docs 这类路径,可改用正则 location ~ ^/api(/.*)?$ 或借助 try_files 与精确匹配 location = /api。

另外,proxy_pass 末尾是否带斜杠会影响 URI 的改写规则:不带斜杠时,匹配的 location 前缀会被拼接到后端 URI 中;带斜杠时,前缀会被丢弃。实际使用时建议在测试环境先用 curl 验证转发后的 URI 是否符合预期。

启用 HTTPS 与自动续期

对外提供 HTTPS 时,Nginx 作为 TLS 终结代理,证书放在 Nginx 层即可,后端仍然只用 HTTP。

server {
    listen 443 ssl;
    server_name 你的域名;

    ssl_certificate     /etc/ssl/certs/域名.crt;
    ssl_certificate_key /etc/ssl/private/域名.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 推荐的安全密码套件;

    location / {
        proxy_pass http://后端地址:后端端口;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name 你的域名;
    return 301 https://$host$request_uri;
}

证书可通过 Let’s Encrypt 的 certbot 申请,并配置 systemd 定时任务或 cron 自动续期。续期完成后重载 Nginx 即可无缝更新。

常见坑与排错

  1. 502 Bad Gateway:通常是后端没有监听配置的地址/端口,或后端地址写错。用 ss -tlnp 或 netstat 确认后端确实在监听目标端口,并用 curl 从 Nginx 所在机器直接请求后端地址验证。
  2. 后端拿到的 Host 是后端地址而非用户域名:漏配 proxy_set_header Host $host,或者后端框架忽略了 Host 头。
  3. 客户端真实 IP 全是代理服务器 IP:未透传 X-Real-IP / X-Forwarded-For,或后端未从这些头中取 IP。
  4. 大文件上传 413 Request Entity Too Large:Nginx 默认 client_max_body_size 为 1M,需在 server 或 location 中调大,例如 client_max_body_size 100M。
  5. 长连接/WebSocket 被 10054 断开:需配置 proxy_read_timeout 与 proxy_send_timeout,WebSocket 还需加上 Upgrade 与 Connection 头的透传。

小结

Nginx 反向代理是把流量分发、安全隔离和协议转换统一到入口层的常用做法。掌握 proxy_pass 与四个基础头(Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto)后,按路径路由、HTTPS 终结、负载均衡等场景都可以在此基础上组合。首次上线前建议用 curl 从代理机器直连后端验证,用浏览器访问入口域名观察响应,并检查后端日志中的真实客户端 IP 与 Host 是否符合预期。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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