Nginx 反向代理:让一个域名同时服务多个应用
一台服务器上跑了三个服务:博客在 3000 端口、API 在 8000 端口、管理后台在 9000 端口。难道要让用户记三个带端口的地址?Nginx 反向代理就是干这个的:用户只访问一个域名,Nginx 在后面把请求分发到对应的服务。
正向代理 vs 反向代理,一句话分清
正向代理是替客户端出门(比如你通过代理上网,服务器不知道你是谁);反向代理是替服务端接客(用户只看到 Nginx,不知道后面到底是哪个服务在干活)。我们今天说的就是后者。
最小可用配置
假设域名是 example.com,博客跑在本地 3000 端口。Nginx 配置只需要几行:
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;
}
}
改完检查配置、重载生效:
nginx -t && nginx -s reload
proxy_set_header 这两行别漏:没有它们,后端应用拿到的 Host 和客户端 IP 都是 127.0.0.1,日志、限流、HTTPS 跳转全会乱。
一个域名带多个应用:按路径分流
博客、API、后台共用一个域名,用路径区分:
location / {
proxy_pass http://127.0.0.1:3000; # 博客
}
location /api/ {
proxy_pass http://127.0.0.1:8000; # API 服务
}
location /admin/ {
proxy_pass http://127.0.0.1:9000; # 管理后台
}
注意 /api/ 后面的斜杠:location /api/ 配 proxy_pass http://127.0.0.1:8000;(末尾无 URI)时,完整路径会原样转发;如果写成 proxy_pass http://127.0.0.1:8000/;(末尾有斜杠),/api/ 前缀会被替换掉。两种写法结果不一样,配完一定要用 curl 实测一条请求看路径对不对。
两个常见坑
坑 1:改完配置没生效。 只改文件不重载等于没改。每次改完先 nginx -t 检查语法,再 nginx -s reload。nginx -t 报错时不要 reload,先把语法修好。
坑 2:后端拿不到真实 IP。 只写 proxy_pass 不写 proxy_set_header X-Real-IP,后端日志里所有请求都来自 127.0.0.1。上面最小配置里的两行 header 就是解药;如果后端是多层代理,再加 X-Forwarded-For。
进阶:HTTPS 一步到位
域名 + HTTPS 是生产标配。用 certbot 一条命令就能把证书和跳转都配好:
certbot --nginx -d example.com
它会自动改 Nginx 配置、加 443 监听、把 HTTP 跳转到 HTTPS。证书 90 天过期,certbot 会自动续,不用操心。
一句话总结
反向代理 = 一个入口、后面多个服务:proxy_pass 定去向,proxy_set_header 保真信息,location 按路径分流,改完 nginx -t + reload。先把最小配置跑通,再按需加路径分流和 HTTPS。
- 点赞
- 收藏
- 关注作者
评论(0)