Linux:这啥命令?这台服务器我说了算-Nginx 反向代理——“一个门卫,怎么接待八百个网站?”
第十七章:Nginx 反向代理——“一个门卫,怎么接待八百个网站?”
上一章跑起了网站。服务一多,总不能让用户记一串端口号吧?
让 Nginx 当门卫,负责把请求送进正确的房间。
环境:Ubuntu、Nginx、Python 3。仅供实验,勿直接用于生产。
1. 反向代理是啥?
浏览器 ──> Nginx:8088 ──> /a/ ──> 服务A:9001
└──> /b/ ──> 服务B:9002
客户端只找 Nginx,无需知道后端端口。这就是反向代理;它还能做 HTTPS 终止、负载均衡。
2. 先开两家“迷你店铺”
安装依赖(已有就跳过):
sudo apt update
sudo apt install -y nginx python3 curl
注意: 若 Docker 占用宿主机 80 端口,Nginx 可能启动失败。用 sudo ss -lntp 检查,勿随手停止生产服务。
准备两个网页:
mkdir -p ~/nginx-lab/{a,b}
printf '你好,我是 A 服务\n' > ~/nginx-lab/a/index.html
printf '你好,我是 B 服务\n' > ~/nginx-lab/b/index.html
分别启动两个仅监听本机的测试服务:
nohup python3 -m http.server 9001 --bind 127.0.0.1 \
--directory "$HOME/nginx-lab/a" > ~/nginx-lab/a.log 2>&1 &
nohup python3 -m http.server 9002 --bind 127.0.0.1 \
--directory "$HOME/nginx-lab/b" > ~/nginx-lab/b.log 2>&1 &
先验货:
curl http://127.0.0.1:9001/
curl http://127.0.0.1:9002/
应分别看到 A、B 的文字。
3. 给 Nginx 一张“带路地图”
在 Ubuntu 上新建配置:
sudo tee /etc/nginx/conf.d/lab-proxy.conf >/dev/null <<'EOF'
server {
listen 8088;
server_name _;
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;
location /a/ {
proxy_pass http://127.0.0.1:9001/;
}
location /b/ {
proxy_pass http://127.0.0.1:9002/;
}
}
EOF
location 匹配路径,proxy_pass 指向后端,proxy_set_header 转发必要请求头。后端还须正确配置代理信任。
改完配置,先体检再上岗:
sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx
启动失败先查端口和错误日志,别急着重启。
4. 验收:一个入口,两个服务
curl http://127.0.0.1:8088/a/
curl http://127.0.0.1:8088/b/
应分别返回 A、B。只需访问 8088,门卫负责带路。
一个斜杠引发的“迷路”
本例 proxy_pass 带末尾 /,因此 /a/test 会转成后端的 /test;去掉末尾 /,后端则收到 /a/test。
斜杠不是装饰品。 改完记得用 curl 验证。
5. 网站打不开,门卫怎么审?
| 现象 | 优先检查 |
|---|---|
502 Bad Gateway |
后端进程是否存活、9001/9002 是否监听 |
404 Not Found |
location 匹配、路径前缀和后端文件 |
403 Forbidden |
目录权限、访问规则 |
| 连接被拒绝 | Nginx 是否监听 8088、防火墙是否放行 |
排障四连:
sudo nginx -t
sudo ss -lntp | grep -E ':(8088|9001|9002)\b'
curl -i http://127.0.0.1:9001/
sudo tail -n 30 /var/log/nginx/error.log
502 不一定是 Nginx 坏了,也可能是后端没上班。
6. 安全提醒与课后挑战
- 测试后端只绑定
127.0.0.1;不要无故把内部端口暴露公网。 - 本章用 HTTP 便于实验;正式对外服务应配置域名、HTTPS 和合理的访问控制。
- 若只想在本机测试,可把
listen 8088;改成listen 127.0.0.1:8088;。
挑战: 新增一个 c 目录、在 9003 启动第三个测试服务,再配置 /c/ 转发。最后用 curl 验证三个路径。
实验结束后,如需删除代理配置:
sudo rm /etc/nginx/conf.d/lab-proxy.conf
sudo nginx -t && sudo systemctl reload nginx
测试进程先查 PID:pgrep -af 'http.server 900',然后 kill PID。
本章记住: Nginx 负责接待,后端负责干活;改配置先 nginx -t,出故障先看日志。
下一章:《第十八章:HTTPS 与证书——“浏览器说不安全,我说我很冤!”》
- 点赞
- 收藏
- 关注作者
评论(0)