2025-03-13 23:22:40
nginx 在日常开发里最常见的三个用途是:
- 反向代理
- 负载均衡
- 静态资源服务
反向代理
反向代理是 nginx 最常见的使用场景之一。
客户端请求先到 nginx,再由 nginx 转发到后端服务。
最简单的反向代理:
location / {
proxy_pass http://127.0.0.1:8000;
}
负载均衡
当服务不止一个实例时,就可以通过 nginx 在多个服务之间分发请求。
http {
upstream app_server {
# weight 用于设置权重,数值越大,分配到的请求通常越多
server 127.0.0.1:8000 weight=1;
server 127.0.0.1:8001 weight=1;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://app_server;
}
}
}
定义了一个名为 app_server 的上游服务组,请求会被转发到 8000 和 8001 两个实例上。
如果需要启用 HTTPS,还需要继续增加对应的 server 的证书配置:
server {
listen 443 ssl http2;
server_name localhost;
ssl_certificate certificate.pem;
ssl_certificate_key certificate.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://app_server;
}
}
基于 Nginx 的灰度发布
一般来说不是一上来就全量发布,而是一个版本一个版本的迭代。虽然每次上线前都会经过测试,但是也不能完全保证上线后不会出现问题。所以一般都是通过灰度发布的。
让一部分用户进入新版本,确认稳定后再让所有用户进入新版本。这就是灰度发布。
除了提升发布稳定性之外,也常用于 A/B 测试。
可以先定义多个上游服务,分别对应不同版本:
upstream v1_server {
server 127.0.0.1:8000;
}
upstream v2_server {
server 127.0.0.1:8001;
}
upstream default_server {
server 127.0.0.1:8000;
}
通过 cookie 的版本标识来进行分流,然后根据请求中的条件决定把流量转发到对应的版本
set $group default_server;
if ($http_cookie ~* "version=1.0") {
set $group v1_server;
}
if ($http_cookie ~* "version=2.0") {
set $group v2_server;
}
location ^~ /api/ {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://$group;
}
- 如果请求中包含
version=1.0的 Cookie,就转发到v1_server - 如果请求中包含
version=2.0的 Cookie,就转发到v2_server - 如果都没有命中,就走默认服务
default_server