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 的上游服务组,请求会被转发到 80008001 两个实例上。

如果需要启用 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