反向代理解决的是”客户端不能直接访问后端服务”的问题。比如后端跑在8080端口,你不想暴露端口,或者要做负载均衡、SSL卸载、缓存,Nginx挡在前面最省事。
先装Nginx。Ubuntu/Debian:
sudo apt update
sudo apt install nginx
CentOS/RHEL:
sudo yum install epel-release
sudo yum install nginx
装完启动:
sudo systemctl start nginx
sudo systemctl enable nginx
配置放在`/etc/nginx/sites-available/`(Debian系)或`/etc/nginx/conf.d/`(CentOS系)。我习惯用sites-available,软链接到sites-enabled。
最简单的反向代理,把`/api/`转发到本机的3000端口:
server {
listen 80;
server_name example.com;
location /api/ {
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;
}
}
`proxy_pass`后面的URL末尾带不带`/`有区别。带`/`表示去掉匹配的location前缀再转发。比如请求`/api/users`,转发到后端是`/users`。不带`/`则原样转发,变成`/api/users`。看后端接口定义决定。
`proxy_set_header`那几行必加,否则后端拿不到真实客户端IP和协议。`Host`保证后端能正确识别域名。
如果要转发WebSocket(比如用了Socket.IO),加两行:
location /ws/ {
proxy_pass http://127.0.0.1:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
WebSocket依赖长连接,必须升级协议。
负载均衡场景,多个后端实例:
upstream backend {
server 127.0.0.1:3000 weight=3;
server 127.0.0.1:3001;
server 127.0.0.1:3002 backup;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
`weight`控制权重,`backup`表示备用,其他实例挂了才启用。默认轮询。还可以加`ip_hash`让同一客户端IP始终打到同一台,解决session问题。
SSL配置。先拿到证书(Let’s Encrypt免费),:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
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-Proto $scheme;
}
}
# HTTP强制跳转HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
`http2`开启HTTP/2,性能好一点。`ssl_protocols`和`ssl_ciphers`按安全标准配,别用旧版。
高级点,加缓存。静态资源或者接口响应可以缓存:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
location /api/ {
proxy_cache my_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_pass http://127.0.0.1:3000/;
}
}
`proxy_cache_path`定义缓存目录和参数,`levels`是目录层级,`keys_zone`分配内存空间。`proxy_cache_valid`按状态码设置缓存时间。
配置完记得测试语法:
sudo nginx -t
没问题就重载:
sudo systemctl reload nginx
看日志排查问题用`tail -f /var/log/nginx/access.log`和`tail -f /var/log/nginx/error.log`。
说下部署环境。如果你懒得自己折腾服务器,可以考虑雨云,性价比高、稳定、好用,一键装Nginx,SSL证书也自动续期。我几个小项目直接扔上面,反向代理配完就不用管了。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容