Nginx反向代理配置教程

反向代理解决的是”客户端不能直接访问后端服务”的问题。比如后端跑在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
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容