Nginx反向代理实操完整配置|站长落地避坑整理

Nginx反向代理实操完整配置|站长落地避坑整理

Nginx反向代理全套教程,配置可直接复制部署,附带线上踩坑经验

正向代理和反向代理,简单分清

很多教程概念写得偏理论,上手很容易混淆。

正向代理代理的是客户端,替访问者去请求外部网络资源,普通建站场景很少用到。

反向代理代理后端业务服务。用户访问Nginx,请求由Nginx接收,再转发给后端程序,后端服务器地址对访客不可见,这也是我们建站最常用的模式。

反向代理带来的实际收益:

  • 隐藏后端真实IP,减少后端直接暴露公网带来的安全风险
  • 多个业务共用80/443端口,依靠域名、URL路径区分业务,不用记忆大量端口
  • 多台后端节点做负载均衡,分摊访问压力
  • 在代理层统一处理HTTPS、Gzip压缩、限流、缓存,后端业务无需重复开发

Nginx快速安装(CentOS / Ubuntu两套命令)

部署配置前,先完成Nginx安装,两套系统命令分开,直接复制执行。

CentOS/RHEL系列

yum install -y nginx
systemctl start nginx
systemctl enable nginx

Ubuntu / Debian系列

apt update
apt install -y nginx
systemctl start nginx
systemctl enable nginx

执行完成后,浏览器访问服务器公网IP,出现Nginx默认欢迎页即代表安装正常。

注意:服务器安全组、防火墙需要放行80端口,否则外部无法访问。

配置文件存放位置

不建议直接修改主配置nginx.conf,后期维护、排障麻烦。推荐单独编写业务配置,放在 /etc/nginx/conf.d/*.conf,Nginx会自动加载这个目录下所有conf文件。

  • /etc/nginx/nginx.conf:Nginx主配置文件,存放全局参数
  • /etc/nginx/conf.d/:业务子配置目录,新建conf文件存放站点代理规则

几种高频反向代理完整配置

①最简单服务反向代理

适合将域名全部流量转发到本机另一个端口,新建配置文件 /etc/nginx/conf.d/proxy.conf。

server {
    listen 80;
    server_name demo.example.test;

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

        # 这组请求头务必带上,用于获取访客真实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;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

逻辑:访客访问 demo.example.test,Nginx接收请求,全部转发至本机127.0.0.1:8080后端服务。

踩坑提示:很多人复制配置时漏掉proxy_set_header这几行,后端日志拿到的全是Nginx本机IP,无法获取用户真实访问IP。

②按路径分发,不同路径交给不同后端

单服务器部署多个业务,依靠URL路径区分转发。重点留意proxy_pass末尾斜杠/,有无斜杠,转发逻辑完全不同,是高频踩坑点。

末尾带/:剥离匹配到的路径前缀再转发;不带/:完整路径一并传给后端。

server {
    listen 80;
    server_name demo.example.test;

    # 主业务前台
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 接口服务,访问 /api/xxx,转发后后端拿到 /xxx
    location /api/ {
        proxy_pass http://127.0.0.1:9090/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # 后台管理服务
    location /admin/ {
        proxy_pass http://127.0.0.1:7070/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

③多后端负载均衡配置

访问量上涨,单实例压力过大,配置upstream集群分摊请求。支持权重分配、备用节点,某后端宕机自动切换其他实例。

# 定义后端服务集群组
upstream backend_servers {
    server 127.0.0.1:8080;
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
    # server 127.0.0.1:8083 backup; # backup标记为备用节点,其余全部故障才启用
}

server {
    listen 80;
    server_name demo.example.test;

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

④WebSocket长连接反向代理

后端业务用到WebSocket长连接通信时,普通代理配置无法维持连接,会频繁断开。需要额外增加Upgrade相关头部配置。

server {
    listen 80;
    server_name demo.example.test;

    location /ws/ {
        proxy_pass http://127.0.0.1:8787;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

生产环境可直接落地完整配置

整合前端网页、API接口、WebSocket长连接,增加代理超时参数,正式业务环境修改域名和后端地址即可上线。

upstream api_server {
    server 127.0.0.1:9090;
}

upstream web_server {
    server 127.0.0.1:80;
}

server {
    listen 80;
    server_name demo.example.test;

    # API接口转发
    location /api/ {
        proxy_pass http://api_server/;
        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_connect_timeout 60s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }

    # 静态网页前端
    location / {
        proxy_pass http://web_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # WebSocket服务
    location /ws {
        proxy_pass http://api_server;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

修改配置后必执行命令

重要提醒:修改Nginx配置,不要直接重启服务。配置语法错误直接重启,会导致Nginx停止,网站全部无法访问。

先校验配置语法,输出test is successful代表配置没问题。

nginx -t

校验通过,平滑重载配置,业务不会中断。

nginx -s reload

需要完整重启服务时执行:

systemctl restart nginx

日常调试常见故障总结

  • 返回502 Bad Gateway:后端程序未启动、端口监听地址错误、防火墙阻止Nginx访问后端端口
  • 403 /404报错:大多是proxy_pass末尾斜杠/配置出错,路径匹配逻辑异常
  • 后端日志拿不到访客真实IP:缺少X‑Real‑IP请求头配置
  • 域名访问无效:确认域名DNS解析生效,服务器安全组开放80端口

实操小结:每次调整Nginx代理配置,优先执行nginx -t校验,确认无误再重载。很多线上故障都是跳过校验,写错配置直接重启造成业务断流。

💡 提示:文中所有Nginx配置可直接复制使用,记得替换域名与后端IP端口。上线前务必执行nginx -t语法校验,避免配置错误导致站点离线。

免责声明:本文仅为技术教程演示,所有配置上线前请自行测试验证,本站不对使用该配置产生的任何故障、业务损失承担责任。

文章广告横幅
网络违法犯罪举报平台 广告
© 版权声明
THE END
喜欢就支持一下吧
点赞139 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容