nestjs Nginx 核心用法

静态资源托管与反向代理负载均衡

Posted by chanweiyan on May 9, 2026

在后端及大前端部署架构中,Nginx 一直扮演着举足轻重的角色。本文将带你通过 Docker 快速上手 Nginx,并深入掌握它的两大核心用法:静态资源托管动态资源的反向代理及负载均衡

一、配置与基础目录结构(基于 Docker)

我们通常通过 Docker 来快速拉起 Nginx 服务器:

1
docker run -d -p 80:80 --name my-nginx nginx

在官方镜像中,有几个重要的内部目录和文件你需要牢记:

  • 主配置文件/etc/nginx/nginx.conf
  • 子配置目录/etc/nginx/conf.d/(主配置默认会通过 include /etc/nginx/conf.d/*.conf; 引入所有子配置)
  • 默认静态文件产物目录/usr/share/nginx/html

我们在日常维护时,可以通过 docker cp 命令将容器内的配置文件复制到宿主机进行修改,修改后再拷贝回去并重载配置:

1
2
3
4
5
6
7
8
# 从容器复制到宿主机
docker cp my-nginx:/etc/nginx/conf.d/default.conf ./default.conf

# 在宿主机修改后复制回容器
docker cp ./default.conf my-nginx:/etc/nginx/conf.d/default.conf

# 重载 nginx 配置生效
docker exec my-nginx nginx -s reload

二、静态资源托管与 Location 路由规则

Nginx 最擅长的就是处理高并发的静态文件(HTML、CSS、JS、图片)。在配置文件中,我们在 server 块内配置 location 路由,根据不同的 url 返回不同的静态文件。

Nginx 主要有 4 种 location 匹配语法,它们的匹配规则和优先级各有不同:

  1. 普通前缀匹配 (location /aaa):仅仅是前缀匹配,命中即可。
  2. 高优先级前缀匹配 (location ^~ /aaa):带有 ^~,比普通前缀匹配的优先级更高。
  3. 精准匹配 (location = /aaa):路径必须完全对应,不能有多余字符。
  4. 正则匹配 (location ~ /aaa/.*html):支持正则表达式(带有 ~ 区分大小写,带有 ~* 不区分大小写)。

匹配的优先级顺序为: 精准匹配(=) > 高优先级前缀匹配(^~) > 正则匹配(~ / ~*) > 普通前缀匹配

配置文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
    listen       80;
    server_name  localhost;

    # 精准匹配
    location = / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    # 正则匹配示例
    location ~ \.(gif|jpg|png)$ {
        root /usr/share/nginx/html/images;
    }
}

三、动态资源的反向代理(网关层)

除了托管静态页面,Nginx 另一个核心功能就是反向代理(Reverse Proxy)。 它作为前置网关,接收客户端的所有请求,再将针对动态资源的请求转发给我们背后的应用服务器(如 NestJS 服务)。

在此过程中,Nginx 还可以二次加工请求和响应信息,例如设置或传递 Header 信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
    listen 80;
    server_name api.example.com;

    location /api/ {
        # 将请求转发到具体的应用服务上
        proxy_pass http://192.168.1.100:3000;

        # 修改向后端传递的 Header,携带客户端真实的 IP
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

四、Upstream 与负载均衡保障

当流量逐渐增大,单节点应用服务器无法支撑时,我们会部署多台相同业务的服务器节点。此时即可通过 Nginx 的 upstream 模块配置负载均衡。

Nginx 常用的有 4 种负载均衡策略:

  1. 轮询(默认):请求按时间顺序逐一分配到不同的后端服务器。
  2. 带权重的轮询(weight):根据权重分配,weight 值越大的服务器被分配到的几率越高(适用于后端机器性能不均的场景)。
  3. ip_hash:每个请求按客户端 IP 的哈希结果进行分配,这样来自同一个 IP 的访客就会总是固定访问同一台后端机器,有利于解决 session / 状态保持问题。
  4. fair(第三方模块):按后端服务器的响应时间来分配请求,响应越快的节点优先分配。

Upstream 配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 声明一组上游服务器
upstream nestjs_cluster {
    # ip_hash; # 如果需要可以开启这个策略
    server 192.168.1.101:3000 weight=3; # 这台性能好,权重给高一点
    server 192.168.1.102:3000 weight=1;
    server 192.168.1.103:3000 weight=1;
}

server {
    listen 80;

    location /api/ {
        # 直接使用 upstream 定名的别名
        proxy_pass http://nestjs_cluster;
    }
}

掌握了基于 Docker 环境配置四种 Location 路由的优先级规则动态资源的反向代理参数修改 以及对应的 Upstream 负载均衡策略,就算是真正吃透了 Nginx 最核心的用法,足以应对日常绝大部分的前后端分离部署场景。