Nginx 反向代理入门:把域名指向你的服务
你有没有过这样的经历:本地跑起了一个服务,地址是 127.0.0.1:3000 ,浏览器打开没问题,可一旦想让别人通过域名访问,就卡住了。端口要记、地址难看、换了服务又要重新告诉别人。这时,反向代理就是最顺手的解法。
什么是反向代理
反向代理站在用户和你的服务之间。用户只访问一个域名,比如 example.com ,由 Nginx 接收请求,再按规则转发给内网或本机的真实服务,最后把响应原样带回给用户。用户看不到后端地址,也不需要记住端口。
它和正向代理正好相反:正向代理是替用户去访问外网,反向代理是替服务去接待用户。日常说的“用 Nginx 做入口”,基本就是反向代理。
一个最小可用的配置
假设你的服务跑在 3000 端口,域名已经解析到服务器。写一个 server 块就够了:
server {
listen 80;
server_name example.com;
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;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
改完配置先不要直接重启,先用 nginx -t 检查语法,通过后再 reload 。这样即使写错,也不会把正在跑的服务直接打断。
为什么要传那几个请求头
不传 Host ,后端可能认不出域名;不传 X-Real-IP ,后端日志里看到的就全是 127.0.0.1 ,排障时会很被动; X-Forwarded-Proto 则告诉后端用户原来用的是 http 还是 https ,避免后端生成错误的跳转链接。这几行看起来啰嗦,实际上是反向代理的“基本礼仪”。
按路径分流也很常用
一个域名后面常常挂着多个服务,比如 /api 走接口服务, / 走页面服务。可以这样写:
location /api/ {
proxy_pass http://127.0.0.1:8000/;
}
location / {
proxy_pass http://127.0.0.1:3000;
}
这里有个容易踩的坑: proxy_pass 后面带不带斜杠,含义不一样。带斜杠时, location 匹配到的 /api/ 部分会被替换掉;不带斜杠时,原始路径会完整拼过去。路径转发一乱,多半是这个斜杠在作怪,改之前先想清楚自己要的是哪一种。
常见问题排查清单
第一,访问域名返回 502 。先看后端服务是不是真的在跑,再看端口对不对,最后看 Nginx 能不能连到那个地址。在本机上能直接访问 3000 端口的服务,说明后端没问题,问题多半在转发配置上。
第二,页面能打开,但样式、图片全是 404 。先看浏览器请求的路径,再对照 location 规则。很多时候是路径拼接错了,或者静态资源走了错误的后端。
第三,接口请求报跨域或重定向循环。先确认后端拿到的 Host 和协议是不是你期望的,再看有没有多层代理把请求头改乱了。
第四,改了配置却没生效。先确认改的是 Nginx 真正在读的配置文件,再确认执行的是 reload 而不是只保存了文件。 nginx -t 能帮你确认配置文件路径和语法。
一点使用建议
刚入门不用一次配齐缓存、限流、负载均衡。先把“域名进、服务出”这一条链路跑通,再按需加功能。入口越简单,出问题时越容易定位。等你熟悉了转发规则和请求头,再去加 HTTPS 、多服务分流和健康检查,顺序对了,学习成本会低很多。
反向代理的本质并不复杂:它就是一个懂规则的“前台”,把用户的请求准确送到对应的服务手里。把域名、端口、路径这三件事理清楚,你的服务就真正拥有了一个可以对外示人的地址。
- 点赞
- 收藏
- 关注作者
评论(0)