nginx配置理解
- location指令
- try_files配置
- upstream负载均衡配置
location指令
location指令是 Nginx 核心配置,用于匹配请求的 URI 路径并定义处理逻辑- 需要理解场景的通配符和匹配规则
location 匹配规则与优先级
Nginx 的 location 支持多种匹配方式,按优先级从高到低排序如下:
| 匹配类型 | 语法示例 | 优先级说明 |
|---|---|---|
| 精确匹配 | location = /path | 最高优先级,仅当请求 URI 完全匹配时生效(如 /api/login) |
| 前缀匹配(非正则) | location ^\~ /static/ | 次高优先级,以指定前缀开头的 URI 会优先匹配,且不触发正则检查 |
| 正则匹配(区分大小写) | location \~ \.php$ | 按配置文件中的顺序依次匹配,首次匹配成功后停止 |
| 正则匹配(不区分大小写) | location \~* \.jpg$ | 按配置文件中的顺序依次匹配,首次匹配成功后停止 |
| 普通前缀匹配 | location / | 最低优先级,作为兜底匹配所有未命中的请求 |
通配符理解
\~表示location块使用正则表达式匹配 URI,且区分大小写
| 符号 | 匹配类型 | 作用 |
|---|---|---|
\~ | 正则表达式 | 区分大小写 |
\~* | 正则表达式 | 不区分大小写 |
^\~ | 非正则前缀(普通字符串),如location ^\~ /images/ 匹配 /images/logo.png,但不会检查正则规则 | 区分大小写 |
| 无修饰符 | location /api | 普通前缀匹配:匹配以指定字符串开头的 URI,但需参与正则检查竞争 |
= | 精确匹配 | 区分大小写 |
try_files配置
- try_files:用于定义文件查找顺序规则
SPA应用路由处理
- 尝试匹配
$uri(如请求/about,查找/var/[www/spa/dist/about](https://www/spa/dist/about))。 - 若失败,尝试匹配
$uri/(查找目录下的index.html)。 - 若仍失败,返回
/index.html,由前端路由接管
location / {
root /var/www/spa/dist;
try_files $uri $uri/ /index.html;
}
upstream
- upstream可以负载均衡配置
upstream主要作用是:定义一组后端服务器,然后让proxy_pass** 把请求转发到这组服务器里**- 可以定义多组的server后端服务
- 当用户访问的时候,会把请求分配到其中一个后端服务
upstream backend {
server 127.0.0.1:3000; # 后端服务端口
server 127.0.0.1:3001;
server 127.0.0.1:3002;
keepalive 64;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
root指令理解
- root指令用于 指定请求的根目录, 也可以理解为网站的根目录
- 在server中定义root表示为全局的资源根目录路径
- 每个location都可以指定root,即每个请求都可以指定这些请求根目录位置
- root定义的目录,当请求访问url的时候,url会追加到root路径后
- 如在location定义匹配static请求时, root定义了 /var/www/demo/static
- 当前请求的时候static/logo.png时,会指向到 /var/www/demo/static/logo.png这里去获取资源
server {
listen 80;
server_name demo.example.com;
root /var/www/spa/dist; # 全局的资源根目录路径
index index.html;
location /path1/ {
root /data/website1;
}
location /path2/ {
root /data/website2;
}
}
alias指令理解
- alias用于替换指定位置
- 可以理解为别名, 当访问
/static/logo.png而alias的static指向为/var/assets,也就是static用别名var/assets替代,也就是会实际会访问到var/assets/logo.png
- 可以理解为别名, 当访问
location请求匹配路径部分被alias路径替换- alias路径必须以
/结尾
alias和root区别:
- alias必须用在location块里,而root可以用在server、location等更广的范围
- 路径拼接区别:root: URI 追加到
root路径后, alias: location路径被alias路径替换
location /path/ {
alias /data/web/;
}
- 请求
http://example.com/path/image.jpg→ 文件路径/data/web/image.jpg(/path/被替换为/data/web/)
# root 配置
location /static/ {
root /var/www;
}
# 请求 /static/logo.png → 文件路径:/var/www/static/logo.png
# alias 配置
location /static/ {
alias /var/www/assets/;
}
# 请求 /static/logo.png → 文件路径:/var/www/assets/logo.png
gzip压缩配置
- 使用gzip压缩,提高首屏页面加载速度,减少网络带宽
http {
# 启用Gzip压缩
gzip on;
# 压缩级别(1-9,6为平衡点)
gzip_comp_level 6;
# 最小压缩阈值(单位字节,默认20字节)
gzip_min_length 1024;
# 压缩类型(根据业务扩展)
gzip_types text/plain text/css application/json application/javascript
application/x-javascript text/xml application/xml application/xml+rss
text/javascript image/svg+xml font/ttf font/otf font/woff;
# 代理请求时压缩(如后端服务未启用Gzip)
gzip_proxied any;
# 兼容旧版IE(禁用IE6压缩)
gzip_disable "MSIE [1-6]\.";
# 添加Vary头(缓存区分)
gzip_vary on;
}
proxy_pass反向代理配置
- 当请求路径包含api时,会将请求的api转发到后端服务器
- 如请求路径为
/api/user/getInfo,nginx会把这个请求路径的转发到代理的服务器 - 代理服务器就会接受到该请求
/api/user/getInfo - 代理服务器把请求路径的响应返回给nginx,nginx再返回给客户端
- 如请求路径为
location /api/ {
proxy_pass http://backend;
}
server_name理解
server_name是nginx的域名匹配,可绑定多个域名,多个域名的DNS解析需要绑定同一台服务器IP- Nginx 用来指定:这个
server配置块负责处理哪些域名的请求
请求到达 Nginx
↓
Host: www.example.com
↓
匹配 server_name
↓
找到对应 server {}
↓
继续匹配 location
↓
处理请求