服务器上跑着WordPress(80)、网盘(8080)、监控面板(3001)、API服务(3000)……难道让用户记住一堆”IP:端口”?反向代理就是解决方案:所有应用藏在内网,Nginx站在门口按域名分发流量,对外只暴露80/443两个端口,还能统一挂SSL。本文用实战配置把这件事讲透。
一、什么是反向代理?一个门卫的比喻
正向代理替”用户”出面访问网站;反向代理替”服务器”接待用户——访客只跟门口的Nginx打交道,Nginx根据请求的域名,把流量转给后端对应的应用。好处立竿见影:端口不裸奔(安全)、域名访问(专业)、SSL统一管理(省心)、后端随便换端口重构(灵活)。
二、实战:三个域名分发三个应用
假设一台香港VPS上跑着博客(127.0.0.1:8080)、网盘(5244)、API(3000)。在 /etc/nginx/conf.d/ 下为每个域名建一个配置:
server {
listen 80;
server_name blog.example.com;
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;
}
}
网盘、API照抄,只改 server_name 和 proxy_pass 端口。三个域名的A记录都解析到同一个服务器IP,nginx -t 检查语法后 systemctl reload nginx 生效。四行 proxy_set_header 别省——后端应用靠它们拿到真实访客IP与协议。
三、统一上HTTPS
反代架构下SSL只需配在Nginx这一层,后端应用一律走内网HTTP:
certbot --nginx -d blog.example.com -d pan.example.com -d api.example.com
Certbot自动为每个server块签发证书并配置跳转,自动续期。WebSocket应用(如面板实时日志)需在location中追加两行:proxy_set_header Upgrade $http_upgrade; 与 proxy_set_header Connection "upgrade";。
四、进阶:负载均衡
单机扛不住时,Nginx还能把流量分发给多台后端:
upstream backend {
server 10.0.0.2:3000 weight=2;
server 10.0.0.3:3000;
}
server {
listen 80;
server_name api.example.com;
location / { proxy_pass http://backend; }
}
默认轮询,可加权重(weight)或改 ip_hash 保持会话粘性。前端一台Nginx + 后端多台应用机,就是最经典的横向扩容架构——入口机建议选独享带宽的独立服务器,它是全站流量的咽喉。
五、排错速查
- 502 Bad Gateway:后端没起来或端口写错,
ss -tlnp核对; - 拿到的访客IP全是127.0.0.1:漏了X-Real-IP头,或后端未配置信任代理;
- 改了配置不生效:先
nginx -t再 reload,语法错误时reload会被静默拒绝。
掌握反代,一台服务器就是一个整洁的应用集群入口。在免费试用机上把三应用分发实操一遍,这项技能受用整个职业生涯。