很多人第一次接触服务器部署,都是从“一个网站一个端口”开始的。等到服务多起来就发现,一台Linux服务器上可能同时跑着博客、接口服务、管理后台,每个服务各占一个端口,访问地址又长又难记,证书也得一个个配。其实只要在Nginx这一层做好反向代理,这些零散的服务就能统一收到80和443端口上,按域名和路径分发给后端不同的进程。用宝塔Linux面板来操作,很多步骤可以不碰命令行,但如果只会在界面里点保存,不懂背后生成的是什么,出了问题照样两眼一抹黑。
我这两年维护服务器的习惯是:所有外部流量都从Nginx进,后端服务只监听内网地址,对外只开必要的端口。这套玩法稳定省心,而且无论你是用宝塔还是纯命令行,原理都一样。下面我从方案选型、核心参数、实际操作到故障排查,把Nginx反向代理的配置方法完整过一遍。
1. 为什么要做反向代理:场景、原理与选型
1.1 一个前台接待员就说清了反向代理和正向代理的区别
反向代理听起来很玄,用公司前台来类比就特别清楚。访客到公司,不用知道技术部张工坐在哪个工位、分机是多少,只需要告诉前台“我要找技术部张工”,前台负责联系并把人带到对应位置。对访客来说,公司就是你面对的唯一入口,内部怎么分工和你无关。Nginx反向代理就是这个前台,它接收所有外部请求,再根据域名、路径、端口等条件,把请求转发给后面的具体服务。
与之对应的正向代理,角色相反:它代表客户端去访问目标服务。客户端告诉代理“我要访问某某地址”,代理帮你发起请求再把结果带回来,目标服务并不知道真正访问的是谁。所以两者的核心区别在于:正向代理隐藏的是客户端,反向代理隐藏的是服务端。从部署位置看,正向代理通常部署在客户端一侧,反向代理部署在服务端一侧。
| 对比项 | 正向代理 | 反向代理 |
|---|---|---|
| 使用方 | 客户端 | 服务端 |
| 隐藏对象 | 隐藏客户端身份 | 隐藏后端服务 |
| 典型角色 | 客户端的出口 | 服务端的统一入口 |
| 部署位置 | 客户端侧 | 服务端侧 |
对于一台服务器上跑着多个服务的情况,反向代理解决的不是“能不能访问”的问题,而是“如何统一、安全、规范地暴露服务”的问题。具体体现在这几点:第一,统一入口,无论后面是Java、Node还是Python进程,对外都走同一个域名;第二,统一证书,HTTPS证书只需要在Nginx这一层维护,不需要每个后端服务单独配置;第三,隐藏结构,外部访问者看到的只有Nginx,后端端口、地址、技术栈都不暴露;第四,顺便可以做负载均衡,同一个后端服务起多个实例时,用upstream就能按权重分发。
1.2 哪些场景要用反向代理,方案怎么选
我实际遇到需要使用反向代理的场景,基本就这几类:
- 服务器上部署了多个Web服务,比如一个博客、一个Python应用、一个监控面板,每个都想用独立域名访问。
- 前后端分离项目,前端是Vue/React打包出来的纯静态文件,后端是Spring Boot、Node或Flask接口,需要让两者同源、避免跨域。
- 后端服务没有独立域名,只想通过主站下的某个路径转发,比如 example.com/api/ 转到 127.0.0.1:8080。
- 对内网服务做统一HTTPS入口,或者多个后端实例需要负载均衡。
也有不需要反向代理的情况。比如你只有一个纯静态站点,那Nginx直接托管文件就行,没必要在上面再套一层转发。再比如服务本身对延迟和带宽极其敏感,虽然Nginx转发开销非常小,但多一跳总归多一层,这种场景就要慎重。
方案选型上,主流的无非Nginx、Apache、Caddy。宝塔Linux面板默认支持的就是Nginx,这也是我用得最顺手的方案。Nginx的优点在于稳定、并发能力强、配置成熟,社区资料多;Apache规则也丰富,但同样的场景配置起来更啰嗦;Caddy最大的亮点是自动申请和续期HTTPS证书,配置非常简洁,适合小项目,只是生态里很多老教程和插件都围绕Nginx,出了问题不好找参考。所以我的建议是:老老实实把Nginx搞明白,一劳永逸。宝塔面板的价值在于把Nginx安装、配置、证书、防火墙这些杂事可视化,但你看这里有个前提:即使界面生成了配置,你仍然要知道它生成的是什么,否则一旦碰到复杂的location规则,界面那点功能是不够用的。
2. 配置前的必修课:端口规划、proxy_pass和请求头
2.1 多服务端口如何规划,内网端口为什么只监听127.0.0.1
动手配置之前,先把服务器上的服务梳理清楚。我一般按这个思路规划:对外统一只暴露80和443端口,所有外部流量从这两个端口进来,Nginx再根据域名分发给内网不同端口。后端服务本身不直接对外,监听地址只写127.0.0.1,这样即使云服务器安全组或防火墙误放开了一些端口,外部也无法直接访问你的后端。
举个例子,一台服务器上可能有这样一个端口规划:
| 服务 | 监听地址 | 外部访问方式 |
|---|---|---|
| Nginx | 0.0.0.0:80 / 443 | 统一入口 |
| Vue前端静态资源 | Nginx托管文件 | example.com |
| Spring Boot后端 | 127.0.0.1:8080 | example.com/api/ |
| 内部工具面板 | 127.0.0.1:9090 | tools.example.com |
端口规划的核心原则是“不冲突、易辨认、不裸奔”。项目多了之后8080、9090这类端口一眼就能认出是哪个服务,省得每次都要查配置。而只监听127.0.0.1这个习惯,是我强烈推荐的,它从根上减少了后端被直接攻击的风险,也避免了多个服务抢端口的问题。宝塔面板的防火墙上,通常只需要放行80和443,以及你管理面板用的那个端口。
2.2 Nginx反向代理最核心的细节:proxy_pass 带不带斜杠
如果你翻过Nginx配置文件,一定见过这条指令:proxy_pass。它是反向代理的灵魂,把匹配到的请求原样或改写后转发给后端。这里有一个全网都在踩的坑,就是proxy_pass后面带不带斜杠、带不带路径,转发结果完全不同。
先看location匹配规则。比如:
location /api/ { proxy_pass http://127.0.0.1:8080; }配置里proxy_pass后面只写了协议和地址,没有带任何URI路径,那么请求 /api/users 会被原样转发给后端,后端收到的是 /api/users。
再比如:
location /api/ { proxy_pass http://127.0.0.1:8080/; }proxy_pass后面带了根路径斜杠,这种情况下Nginx会用proxy_pass的URI部分替换掉location匹配到的部分,请求 /api/users 转发到后端后变成 /users。
这个差异可以整理成一张对照表:
| 客户端请求 | location定义 | proxy_pass配置 | 后端实际收到 |
|---|---|---|---|
| /api/users | /api/ | http://127.0.0.1:8080 | /api/users |
| /api/users | /api/ | http://127.0.0.1:8080/ | /users |
| /api/users | /api/ | http://127.0.0.1:8080/api | /users |
我见过太多人在这上面栽跟头:后端说404,前端怎么看路径都对,实际就是proxy_pass里多了一个斜杠,把接口前缀吃掉了。因此配置前先想清楚:后端接口本身的路径是什么样的?要不要保留 /api 前缀?需要保留就不带斜杠,不需要就去掉。如果用了宝塔的可视化反向代理,填目标URL时同样要注意这一点,它生成配置时不会帮你判断业务路径,只会按你填的内容去套。
另外,location也有匹配优先级,常见的几种修饰符是:= 精确匹配,^~ 前缀匹配,~ 和 ~* 正则匹配,不带修饰则是普通前缀匹配。Nginx会先找前缀匹配中匹配最长的那个,如果是^~就用它不再看正则;如果不是^~,则继续看正则有没匹配的,有就用正则。这个规律在你配置多个location时会直接决定请求落到哪里,建议理解,把自己绕晕的概率会小很多。
2.3 请求头设置:把真实客户端IP传给后端
反代之后,后端收到的连接来自Nginx,所以默认情况下Nginx传给后端的Host头、客户端IP等都会变成代理自身的。很多应用依赖真实客户端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;逐行解释一下。Host $host 把浏览器请求的原始域名传给后端,后端生成跳转链接、做多域名判断时不会乱。$remote_addr是直接连Nginx的客户端地址,X-Real-IP就用来装它。更复杂的网络环境里请求可能经过多层代理,$proxy_add_x_forwarded_for会在原有X-Forwarded-For后面追加一层地址,这样后端能拿到完整链路。X-Forwarded-Proto告诉后端客户端用的是http还是https,否则有些框架看到内部是http,会强制跳转或生成错误链接。
还有一个容易忽略的参数是代理超时。默认的proxy_connect_timeout、proxy_read_timeout、proxy_send_timeout通常都可以用,但如果你有一个接口要跑很久,比如导出报表、调用第三方服务,默认的60秒很容易被掐断。这种情况要么把proxy_read_timeout调大,要么在业务上改成异步任务,不要光指望靠反代硬扛。
3. 实操:在宝塔面板中从零配置Nginx反向代理
3.1 5分钟快速配置:宝塔内置“反向代理”功能全流程
假设你已经装好了宝塔Linux面板,并且在软件商店里把Nginx装好了。这一套我在CentOS、Ubuntu以及一些国产Linux发行版上都跑过,宝塔的界面和配置文件位置基本一致。现在要给 example.com 配置反向代理,把请求转发到本机 8080 端口的后端服务。
第一步,在“网站”菜单里添加一个站点,域名填 example.com,PHP版本选“纯静态”就可以,数据库、FTP看情况创建。这里有个细节:如果域名还没做DNS解析,面板会提示创建成功但解析失败,没关系,你可以在自己的电脑上临时改hosts,把 example.com 指向服务器IP,先完成测试。
第二步,进入网站设置,点“反向代理”,再点“添加反向代理”。面板会让你填三样东西:代理名称、目标URL、发送域名。代理名称随便起,我习惯用后端服务的名字;目标URL填 http://127.0.0.1:8080;发送域名默认是 $host,意思是转发时保留客户端访问的原始域名,一般保持默认即可。
第三步,提交保存。宝塔会马上在网站的Nginx配置里生成一个 location / 的反向代理块,配置内容大致长这样:
location / { proxy_pass http://127.0.0.1:8080; 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_connect_timeout 60s; proxy_read_timeout 60s; proxy_send_timeout 60s; }到这里,一个最基础的反向代理就配好了。你可以直接在浏览器访问 example.com,如果后端服务正常,页面就能出来。这套步骤确实快,但要注意它生成的是 location / 的转发,也就是说所有路径都会转发给后端。如果你的站点还有静态文件、图片等资源,就还得手动加location规则,或者把静态资源交给Nginx直接处理,否则这些请求也会打到后端去,白白浪费后端性能。
3.2 手动编辑Nginx配置:一份可直接复用的标准模板
当你的需求超过“一个域名反代一个服务”时,纯靠宝塔的可视化界面就不太够了。这时候建议直接编辑网站的Nginx配置文件。需要知道宝塔网站的配置目录是 /www/server/panel/vhost/nginx/,你的站点配置文件就在这个目录下,以 example.com.conf 命名。Nginx主程序的配置目录一般是 /www/server/nginx/conf/nginx.conf。
我维护过一条比较完整、适合多场景的配置,直接放出来供你参考:
server { listen 80; server_name example.com www.example.com; # 静态资源优先由Nginx直接处理 location /static/ { alias /www/wwwroot/example.com/static/; expires 7d; access_log off; } # 后端接口走反向代理 location ^~ /api/ { proxy_pass http://127.0.0.1:8080; 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_connect_timeout 60s; proxy_read_timeout 120s; proxy_send_timeout 60s; } # 其余所有请求都转发给前端应用 location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这段配置的逻辑是:静态文件直接由Nginx服务,接口 /api/ 转到Java后端,其余请求转到Node前端。实际修改时,建议先备份原文件再改,改完保存后执行:
/www/server/nginx/sbin/nginx -t /www/server/nginx/sbin/nginx -s reload如果系统里nginx命令已经加入PATH,直接 nginx -t 和 nginx -s reload 也行。nginx -t 是用来检测配置语法是否正确的重要安全网,我每次改动后必执行,出现syntax is ok再reload,否则宁可先不改,也绝不让一个半截配置上线把整站搞挂。
3.3 典型案例:宝塔部署Spring Boot + Vue前后端分离项目
这个场景几乎每个做web开发的人都会碰到,我把它单独拿出来讲。前端用Vue或React,打包后是纯静态文件,需要Nginx托管;后端用Spring Boot,监听8080。两者通过Nginx反向代理保持同源,避免跨域。
具体操作分三部分。
第一部分,前端静态文件。把 build 或者 dist 目录里的内容上传到网站根目录,比如 /www/wwwroot/example.com/dist。在Nginx配置里设置 root 指向这个目录:
server { listen 80; server_name example.com; root /www/wwwroot/example.com/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080; 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; } }第二部分,注意 try_files。Vue Router如果用history模式,访问 /about 这类前端路由时,后端并没有这个文件,必须让它回退到 index.html,由前端路由接管。try_files $uri $uri/ /index.html 做的就是这件事。如果用的是hash模式,这行可以省略,但我建议直接上history,因为URL更干净。
第三部分,接口转发。前端请求 /api/login,Nginx把它转发到 127.0.0.1:8080/api/login。这里关键是proxy_pass后面不要加斜杠,因为Spring Boot的Controller本身定义了 /api 前缀,需要原样保留。如果你的后端接口不带 /api 前缀,那就把proxy_pass改成 http://127.0.0.1:8080/,同时注意后端路径会成为 /login。
还有个细节帮不少人避过坑:Spring Boot通过Nginx反代后,如果它内部用了 X-Forwarded-Proto 来判断协议,记得在配置里保留这行请求头,否则有些安全框架会把请求识别成非HTTPS,导致重定向死循环或者Cookie标志异常。宝塔面板自带的代理生成模板已经包含了这些头,但如果你手动精简过配置,很容易把这行弄丢。
4. 进阶:HTTPS证书、性能优化与安全加固
4.1 SSL配置:申请免费证书、强制HTTPS与自签名方案
后端是HTTP,前端用HTTPS,这是反向代理最常见的组合。原因很简单:证书只需要在Nginx这一层配置,后端服务不用改任何代码,Nginx把HTTPS流量解密后,再以HTTP转发给内网端口,这就省掉了给每个服务单独做TLS的麻烦。
宝塔里申请证书极方便。在网站设置里找到SSL,选择Let's Encrypt,域名能正常解析到这台服务器的话,一般一两分钟就能签发并自动部署。部署完成后开一下“强制HTTPS”,访问http://example.com时会301跳转到https://example.com。我建议再把HTTP/2也打开,多路复用和头部压缩对页面加载速度提升明显。
如果没有域名,或者只是内网测试环境,也可以先用自签名证书,让反代链路完整跑通。用openssl一行命令生成自签名证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /www/wwwroot/example.com/server.key \ -out /www/wwwroot/example.com/server.crt \ -subj "/CN=example.com"然后配置到server块:
server { listen 443 ssl; server_name example.com; ssl_certificate /www/wwwroot/example.com/server.crt; ssl_certificate_key /www/wwwroot/example.com/server.key; location / { proxy_pass http://127.0.0.1:8080; 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; } }自签名证书的局限是浏览器会弹不安全提示,需要手动信任,所以只建议用于开发、内网验收这类环境。正式环境老老实实申请可信证书,宝塔里免费证书足够用。
4.2 性能优化:gzip、静态资源直出与代理缓存
反向代理本身不会拖慢多少速度,但配置方式不同,对后端压力的影响差距非常大。我常用的优化手段有三个。
第一个是gzip压缩。Nginx默认会压缩文本类资源,但宝塔的默认配置不一定会开得很激进。你可以在http块里确认以下参数:
gzip on; gzip_min_length 1k; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript application/xml image/svg+xml;开启后,HTML、JS、CSS、JSON等资源的传输体积能减少60%以上。要注意不要对图片、视频等本来压缩过的二进制格式做gzip,既费CPU又没收益。
第二个是静态资源直出。凡是图片、CSS、JS文件,都应该让Nginx直接读磁盘返回,而不是转发给后端去读。Nginx处理静态文件的能力极强,后端代码就专心出动态内容。所以我在配置里遇到 /static/ 这类路径,都会单独写location指向实际目录,并加上expires设置浏览器缓存。
第三个是代理缓存。如果你的后端有大量请求在短时间重复访问同样的数据,可以用proxy_cache把响应缓存在Nginx这一层,大幅减轻后端压力。一个简单配置:
proxy_cache_path /tmp/ngx_cache levels=1:2 keys_zone=api_cache:10m max_size=1g inactive=60m; location /api/ { proxy_pass http://127.0.0.1:8080; proxy_cache api_cache; proxy_cache_key $scheme$request_method$host$request_uri; proxy_cache_valid 200 5m; proxy_cache_valid 404 1m; }这里要特别提醒:不是所有接口都能缓存。涉及用户身份、购物车、后台管理等个性化数据的接口如果统一缓存,就会出现用户A看到用户B的数据这种严重事故。代理缓存只适合那种幂等、公共、变化不频繁的接口,比如城市列表、菜单、配置信息。拿不准的时候宁可不开。
4.3 安全加固:内网端口收敛、默认站点拦截与权限控制
反向代理把服务暴露方式统一了,安全工作也要跟上。我自己的服务器安全底线是这几条。
第一,后端服务一律只监听127.0.0.1。Spring Boot在application.properties里设置 server.address=127.0.0.1;Node服务启动时用 app.listen(3000, '127.0.0.1');Python Flask设置 host='127.0.0.1'。这样即使防火墙上放开了某个端口,外部也无法直接访问,只能通过Nginx转发。
第二,云服务器安全组和宝塔防火墙只放行必要端口。80和443对外开放,其他端口按需放行或者干脆全关。宝塔面板本身的管理端口也不要暴露到公网,我是用IP白名单限制的,不然面板登录入口容易成为被爆破的对象。
第三,配置一个默认站点,拦截未绑定域名的访问。很多服务器的默认站点会把流量全收走,如果是空白页还好,最怕的是泄露Nginx版本、被扫描机器人当跳板。可以在Nginx配置里加一个default_server:
server { listen 80 default_server; server_name _; return 444; }444状态是Nginx的特殊处理,会直接关闭连接,连响应体都不返回,对扫描器来说就像是端口没开一样。如果要用SSL,在443端口也配一个default_server。这个坑挺隐蔽的,很多站点没有加,导致IP直接访问时总是落到某个业务站点上,别人随便扫一下就能看到你的服务名称。
第四,敏感路径加上访问控制。比如 /admin、/manager 这类后台入口,可以限定来源IP,或者用HTTP Basic Auth加一层密码。宝塔的“网站-目录保护”和Nginx的allow/deny指令都能实现,反正多一层验证多一分安心。
5. 避坑指南:高频故障排查与排查流程
5.1 502与504:问题大概率出在后端
反向代理配置完,浏览器常见的第一类报错就是502 Bad Gateway和504 Gateway Time-out。遇到这两个状态码,先不要怀疑Nginx本身配置有问题,绝大多数情况是后端出状况了。
502的意思是Nginx成功把请求转发给了后端,但后端没有给出有效响应。常见原因有:后端进程没有启动;端口监听的不是127.0.0.1;防火墙或SELinux拦截了Nginx到后端的连接;后端崩了正在重启。排查顺序建议是:先看进程在不在,再端口有没有监听,直接从服务器上用curl访问一下后端地址,比如:
curl -v http://127.0.0.1:8080/api/health curl -I http://127.0.0.1:8080/如果curl能通但浏览器502,那就是Nginx到后端的链路有问题,检查proxy_pass地址、端口、后端监听地址。如果curl也不通,问题就在后端本身,去看后端应用日志。
504则代表Nginx和后端连上了,但后端在超时时间内没有完成响应。这种问题要么是接口本身特别慢,要么是某个上游依赖卡住了。解决办法是先把proxy_read_timeout调大,比如改成300s,确认业务能正常返回后,再回头优化接口性能。注意,调大超时是治标,接口如果持续几秒甚至几十秒才返回,用户体验很差,还不如做成异步任务,先返回“处理中”再轮询结果。
顺便说一个和“响应时间太长导致无法访问”很像的场景:如果只是某个页面偶尔打不开,其他页面正常,多半是后端在处理那个请求时卡住了,比如查询了一个大表没有加索引、调用了外部服务没设超时。光调Nginx的timeout解决不了根本问题,还是要从后端SQL、日志、链路耗时去查。
5.2 404、路径错误、资源加载失败
第二类常见报错是404。页面能打开但接口404,或者页面样式、图片全挂了,路径问题占了大头。
接口404先回忆一下proxy_pass斜杠问题。我前面提过,proxy_pass带不带路径,会把请求的一部分替换掉。如果你发现前端请求 /api/users,后端却收到 /users,或者反过来,后端收到 /api/api/users,十有八九就是这里的斜杠搞错了。改配置后记得reload,再打开Network面板看实际请求路径,一对比就清楚了。
页面能打开但样式和图片全丢失,通常是静态资源路径没处理对。Vue或React项目如果配置了base路径,打包后的资源URL会带上前缀,比如 /app/assets/xxx.js,而你的Nginx静态目录指向的是站点根目录,资源自然加载不到。解决办法是让构建配置里的资源路径和Nginx目录结构保持一致,或者在Nginx里再配一条location把资源路径映射过去:
location /app/ { alias /www/wwwroot/example.com/dist/; }还有一种路径坑是后端返回了重定向。后端看到请求路径不对,自动补了斜杠或者带了别的路径,301/302之后浏览器就跑到别的地方去了,表现就是“明明配好了,访问却到了一个奇怪的地址”。这类问题排查时看浏览器Network里的跳转链,一般能一眼看出问题出在哪一层。
5.3 配置不生效、语法错误、端口与日志排查
最后一类问题是改动配置后“没效果”或者Nginx直接坏了。
配置文件改了没生效,最常见的原因是忘记reload。Nginx只有重启或reload后新配置才生效,宝塔界面里的“重载配置”和命令行的nginx -s reload效果一样,操作完记得做这一步。
保存配置后Nginx起不来,基本都是语法错误。用nginx -t检查是最快的,它会明确告诉你哪个文件哪一行出了问题。常见错误包括:每行指令结尾忘加分号;大括号不匹配;引号没闭合;重复定义了同一个location。这种时候不要慌,按提示逐行检查,改回正确语法再reload。
端口被占用也会让Nginx启动失败。比如80端口被其他服务占了,我们可以用:
ss -lntp | grep :80 lsof -i:80找到占用进程,把冲突解决掉再把端口释放出来。这里的教训是:在一台机器上部署多个服务前,先规划好端口,不要贪方便随手用一个端口,后面查起来非常痛苦。
日志是反代排障的最后一根稻草。Nginx错误日志默认在 /www/wwwlogs/nginx_error.log,Java、Node等其他后端应用各有各的日志位置,但所有问题都会在某个日志里留下痕迹。我排查问题的固定套路是:先看Nginx错误日志,再看后端应用日志,最后结合浏览器开发者工具判断是哪一层出的问题。这个顺序能过滤掉很多干扰信息,比瞎猜快得多。
这里把高频问题整理成速查表,方便你直接对号入座:
| 现象 | 大概率原因 | 处理思路 |
|---|---|---|
| 502 Bad Gateway | 后端没启动/端口不对 | ps、ss、curl查后端状态 |
| 504 Gateway Time-out | 后端响应慢 | 调大proxy_read_timeout,优化后端 |
| 接口404 | proxy_pass斜杠问题 | 检查代理地址是否带URI |
| 资源加载失败 | 前端base路径/目录结构不一致 | 检查静态文件location和alias |
| 改了配置没生效 | 没有reload或语法错误 | nginx -t,nginx -s reload |
| 端口被占用 | 8080等被其他进程占用 | ss或lsof查占用进程 |
| 访问IP显示的是代理,不是用户 | 请求头没传 | 检查X-Real-IP和X-Forwarded-For |
这套东西用熟了之后,你会发现反向代理的配置就三板斧:location怎么匹配、proxy_pass怎么转发、请求头怎么传。剩下的是经验和细心。我自己的体会是,宝塔面板把流程简化了不少,但它只是减轻了重复劳动,真正值钱的是你对原理的理解和排障时的耐心。每次改配置先备份,每次上线先nginx -t,每次出问题先看日志,这三个习惯能帮你避开绝大多数坑。