跳到主要内容

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,由前端路由接管
bash
location / {
root /var/www/spa/dist;
try_files $uri $uri/ /index.html;
}

upstream​

  • upstream可以负载均衡配置
  • upstream 主要作用是:定义一组后端服务器,然后让 proxy_pass** 把请求转发到这组服务器里**
  • 可以定义多组的server后端服务
    • 当用户访问的时候,会把请求分配到其中一个后端服务
bash
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这里去获取资源
bash
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路径替换
bash
location /path/ {
alias /data/web/;
}
  • 请求 http://example.com/path/image.jpg → 文件路径 /data/web/image.jpg(/path/ 被替换为 /data/web/)
bash
# 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压缩,提高首屏页面加载速度,减少网络带宽
bash
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再返回给客户端
bash
location /api/ {
proxy_pass http://backend;
}

server_name理解​

  • server_name 是nginx的域名匹配,可绑定多个域名,多个域名的DNS解析需要绑定同一台服务器IP
  • Nginx 用来指定:这个 server 配置块负责处理哪些域名的请求
bash
请求到达 Nginx
↓
Host: www.example.com
↓
匹配 server_name
↓
找到对应 server {}
↓
继续匹配 location
↓
处理请求