遇到这个需求,我不会直接翻开 Nginx 配置就开始写 server 块。先想清楚:本地 8080 端口上跑的服务是不是只允许本机访问?对外是不是只开放了 80 端口?如果两个答案都是“是”,反向代理就是一条合适的路径。
先确认现象,再动配置
判断是否真的需要反向代理,可以先在服务器上执行 curl 127.0.0.1:8080,看看能不能返回后端服务的页面。能返回,说明后端进程在跑。接着再从另一台机器上访问服务器公网 IP 的 80 端口,如果没响应,而 8080 又只在 127.0.0.1 上监听,这时就需要加一个 Nginx 代理入口。注意不要用本机 curl 公网 IP 来验证,很多服务器的安全组不会把公网流量回环到本机,容易产生“公网明明打不开”的误判。
这个步骤做完后,你至少能区分两类问题:一类是后端服务没起来,一类是流量没有入口。前者的责任在应用进程,后者的责任在 Nginx 或防火墙。
建议的处理顺序:写一个最小配置
先确认 Nginx 已安装,并在 /etc/nginx/nginx.conf 的 http 块中确认 include 了 sites-enabled 目录。然后在 /etc/nginx/sites-available/ 下新建一个文件,例如 rp.conf,写入以下核心内容:server { listen 80; server_name your.domain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }。保存后执行 sudo ln -s /etc/nginx/sites-available/rp.conf …
省略号后面的是建立符号链接、检查语法并重载服务的动作。在 Debian 系系统里,sites-available 只是存放目录,真正生效需要链接到 sites-enabled;CentOS 等其他发行版多半直接使用 /etc/nginx/conf.d/*.conf。执行完 sudo nginx -t 显示 syntax is ok 后,再用 systemctl reload nginx 让配置生效。这里有一点容易忽略:如果 Nginx 里原本有 default_server 或监听 80 的其他 server 块,新配置的 server_name 和你的访问域名不一致,请求很可能被旧站点接走。
验证方法:从本机 Host 头开始测
配置完成后,先在本机用 curl -H "Host: your.domain.com" http://127.0.0.1/ 进行测试,观察返回内容是否为后端 8080 服务的响应。如果返回的是 Nginx 默认欢迎页,说明 location 没有匹配成功,检查 server_name 和请求的 Host 头是否一致。接着查看 /var/log/nginx/access.log,确认请求确实到达了 Nginx 并转发至 8080 地址。也可以临时用 proxy_pass 指向一个明显错误的端口,再观察错误日志,能很快定位配置是否生效。注意防火墙若开启,需放行 80 端口,否则外部请求无法到达 Nginx。
这种测试方法的关键在于“用一个不存在的端口”做对照。把 proxy_pass 临时改成 http://127.0.0.1:9999,然后再次发起请求,如果错误日志里出现 connect() failed,说明前面的转发逻辑已经走通,只是目标端口不对。测完之后记得把配置改回来。
一个容易忽略的地址解析问题
如果 proxy_pass 里写的是 http://localhost:8080,Nginx 解析 localhost 时可能优先使用 IPv6 的 ::1,而后端服务只监听 127.0.0.1,结果就是 502。遇到这种情况,统一把代理地址写成 127.0.0.1 再试。另外,CentOS 7 的 firewalld 默认会挡掉 80 端口,即使 Nginx 配置正确,外部请求也进不来;可以先从内网 curl 一次,再把 firewalld 规则打开。SELinux 处于 Enforcing 状态时也可能阻止 Nginx 发起网络连接,执行 getenforce 确认后,再根据实际策略决定是否调整。
回滚和风险边界
反向代理配置会改变流量路径,涉及几个边界。一是 Nginx 与后端服务在同一主机时,必须确保后端服务监听在 127.0.0.1 上,若监听 0.0.0.0 则容易被绕过 Nginx 直接访问。二是代理时 Nginx 默认会把请求的相对路径直接转发,location 使用 / 不会改写 URI,但若 location 使用 /api/ 则 proxy_pass 的末尾斜杠会改变路径,容易导致 404。三是某些响应头如 Location 或 Set-Cookie 中的域名可能不匹配,需要 proxy_redirect 调整,涉及业务逻辑。四是若后端服务需要频繁推送 WebSocket,必须额外配置 Upgrade 和 Connection 头,否则连接会超时。这些边界应在变更前明确。
改配置前,先把 /etc/nginx 整个目录做一份时间戳备份,比如 cp -a /etc/nginx /etc/nginx.bak。万一新配置把原有站点挤掉或出现循环重定向,用备份覆盖回来再 reload,能在两分钟内恢复。不要只备份单个文件,因为 Nginx 配置经常跨目录引用。至于公网访问是否成功,最后应从外部网络测一次,不能只看本机返回结果。