在后端及大前端部署架构中,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 匹配语法,它们的匹配规则和优先级各有不同:
- 普通前缀匹配 (
location /aaa):仅仅是前缀匹配,命中即可。 - 高优先级前缀匹配 (
location ^~ /aaa):带有^~,比普通前缀匹配的优先级更高。 - 精准匹配 (
location = /aaa):路径必须完全对应,不能有多余字符。 - 正则匹配 (
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 种负载均衡策略:
- 轮询(默认):请求按时间顺序逐一分配到不同的后端服务器。
- 带权重的轮询(weight):根据权重分配,
weight值越大的服务器被分配到的几率越高(适用于后端机器性能不均的场景)。 - ip_hash:每个请求按客户端 IP 的哈希结果进行分配,这样来自同一个 IP 的访客就会总是固定访问同一台后端机器,有利于解决 session / 状态保持问题。
- 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 最核心的用法,足以应对日常绝大部分的前后端分离部署场景。