Skip to content

nginx location 指令介绍

参考地址

location 指令语法

location 指令用于配置基于请求的 URI 如何处理请求。

这个指令定义在 Nginx 配置文件的 server 块中,用来决定不同的 URI 如何被处理。

下面是 location 指令的基本语法:

location [ = | ~ | ~* | ^~ ] uri { ... }

这里的各个部分意味着:

  • location:这是指令的关键字。
  • [ = | ~ | ~* | ^~ ]:这是一个可选的修饰符,用于控制 URI 匹配的方式:
    • =:进行精确匹配。当且仅当完全匹配指定的 URI 时,该配置才会被使用。
    • ~:进行区分大小写的正则表达式匹配。
    • ~*:进行不区分大小写的正则表达式匹配。
    • ^~:如果该前缀匹配成功,Nginx 将不再进行正则表达式匹配,而是立即使用此块处理请求。
  • uri:这是要匹配的 URI 或者正则表达式。
  • { ... }:花括号内部包含了当匹配发生时应用的配置指令。

使用 location 指令可以非常灵活地控制请求如何被处理,比如重定向、重写 URL、定义代理行为等。每个 location 块都可以包含独立的 Nginx 指令集,以适应特定的服务需求。

location 上下文

在 Nginx 的配置中,location 块是一个强大的指令用于定义如何处理特定的 URI 请求。

location 指令只能在 serverlocation 块内部使用,这意味着它们是嵌套的。

每个 location 指令定义了一个上下文,该上下文具有特定的配置,用于处理匹配到的 URI。

以下是 location 上下文中一些关键的用法和信息:

基本结构

location 指令通常位于 server 块中,形成了请求处理的基本逻辑。例如:

nginx
server {
    listen 80;
    server_name example.com;

    location / {
        # 处理根URL的配置
    }

    location /images/ {
        # 处理图像文件的配置
    }

    location ~* \.(gif|jpg|jpeg)$ {
        # 用正则表达式处理图像文件扩展名的配置
    }
}

嵌套 location

location 块可以嵌套在另一个 location 块内。这用于更细粒度的控制。例如,你可以在一个通用的路径内特别配置一小部分路径:

nginx
location /user/ {
    # 处理以 /user/ 开头的请求

    location ~ \.php$ {
        # 处理所有 PHP 文件的请求
    }
}

特殊指令和上下文

location 块内部,可以使用各种指令来控制如何响应请求,例如 proxy_pass 用于代理请求,rewrite 用于重写 URL,以及 return 用于直接返回特定的响应。

nginx
location /api {
    proxy_pass http://backend_server;
    # 将 /api 开头的请求转发到后端服务器
}

location = /maintenance.html {
    root /usr/share/nginx/html;
    # 精确匹配 /maintenance.html 并定义其根目录
}

location 使用场景

location 块非常适合执行如下操作:

  • 定义特定 URI 的缓存策略。
  • 应用 SSL 策略。
  • 配置特定路径的访问控制。
  • 定制特定请求的日志记录。
  • 处理不同类型的内容,如静态内容、动态内容。

通过正确使用 location 指令,可以优化 Nginx 的性能和响应能力,更好地管理和分发网络资源。

在 Nginx 配置中使用 location 指令来实现各种功能,例如缓存策略、SSL 配置、访问控制、日志记录和内容处理是很常见的。以下是这些功能的具体实现例子: 下面是每一行配置的注释解释:

1. 定义特定 URI 的缓存策略

nginx
location /static/ {
    root /var/www/html;  # 指定静态文件的根目录
    expires 30d;         # 设置缓存过期时间为 30 天,提高重复访问的效率
    add_header Cache-Control "public";  # 向客户端发送缓存控制头,允许被公共缓存
    # 静态内容缓存配置,加快网页加载速度
}

2. 应用 SSL 策略

nginx
server {
    listen 443 ssl;   # 在 443 端口上监听 SSL 连接
    server_name example.com;  # 指定服务器域名
    ssl_certificate /etc/nginx/ssl/example.com.crt;  # SSL 证书文件
    ssl_certificate_key /etc/nginx/ssl/example.com.key;  # SSL 证书密钥文件
    ssl_session_cache shared:SSL:1m;  # SSL 会话缓存配置,缓存大小为 1 MB
    ssl_session_timeout 10m;  # SSL 会话超时设置为 10 分钟

    location /secure/ {
        # 仅在此位置应用额外的 SSL 配置
        ssl_prefer_server_ciphers on;  # 启用服务器优选的加密套件
        ssl_protocols TLSv1.2 TLSv1.3;  # 启用 TLS 1.2 和 1.3 协议
    }
}

3. 配置特定路径的访问控制

nginx
location /admin/ {
    auth_basic "Administrator's Area";  # 启用基本认证,提示文字为“Administrator's Area”
    auth_basic_user_file /etc/nginx/.htpasswd;  # 定义用户验证文件的位置
    # 此位置被保护,访问需要通过用户名和密码验证
}

4. 定制特定请求的日志记录

nginx
location /api/ {
    access_log /var/log/nginx/api_access.log;  # 指定访问日志文件路径
    error_log /var/log/nginx/api_error.log;    # 指定错误日志文件路径
    # API 请求的专用日志记录,方便追踪和问题定位
}

5. 处理不同类型的内容,如静态内容、动态内容

nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    root /var/www/html;  # 指定静态文件的根目录
    expires 7d;          # 设置缓存过期时间为 7 天
    access_log off;      # 关闭此类型内容的访问日志,以提高性能
    # 静态文件处理,减少服务器负载和响应时间
}

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;  # 定向 PHP 请求到 FastCGI 进程管理器
    fastcgi_index index.php;  # 设置默认的 index 文件为 index.php
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  # 设置脚本执行的绝对路径
    include fastcgi_params;  # 包含额外的 FastCGI 参数
    # PHP 动态内容处理,提高 PHP 页面的处理效率
}

6. 处理 Vue/React 单页应用(SPA)

nginx
location / {
    root /var/www/html;  # 指定项目的根目录
    try_files $uri $uri/ /index.html;  # 尝试直接访问文件,如果失败则重定向到 index.html
    # 适用于单页应用(SPA),确保路由由前端 JavaScript 处理
}

7. 配置 Nuxt.js/Next.js 服务端渲染(SSR)项目

nginx
location / {
    proxy_pass http://localhost:3000;  # 将所有请求代理到本地的 3000 端口,Nuxt.js 或 Next.js 应用监听此端口
    proxy_http_version 1.1;  # 使用 HTTP/1.1 协议进行代理
    proxy_set_header Upgrade $http_upgrade;  # 设置 HTTP 升级头,用于支持 WebSocket
    proxy_set_header Connection "upgrade";  # 维持连接状态为 “upgrade”,用于 WebSocket
    proxy_set_header Host $host;  # 传递主机头信息,保持请求头部信息的一致性
    proxy_set_header X-Real-IP $remote_addr;  # 传递真实 IP 地址到后端应用
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递所有的代理服务器 IP 地址链
    proxy_set_header X-Forwarded-Proto $scheme;  # 传递请求所使用的协议(如 http 或 https)
    # 此代理配置确保 Nuxt.js/Next.js 应用可以正确处理请求和响应,支持复杂的服务端渲染场景
}

8. Node.js 应用配置

nginx
location / {
    proxy_pass http://localhost:4000;  # 代理所有请求到本地的 4000 端口,Node.js 应用监听此端口
    proxy_http_version 1.1;  # 使用 HTTP/1.1 协议进行代理
    proxy_set_header Upgrade $http_upgrade;  # 设置 HTTP 升级头,用于支持 WebSocket
    proxy_set_header Connection "upgrade";  # 维持连接状态为 “upgrade”,用于 WebSocket
    proxy_set_header Host $host;  # 传递主机头信息,保持请求头部信息的一致性
    proxy_set_header X-Real-IP $remote_addr;  # 传递真实 IP 地址到后端应用
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递所有的代理服务器 IP 地址链
    proxy_set_header X-Forwarded-Proto $scheme;  # 传递请求所使用的协议(如 http 或 https)
    # 此代理配置确保 Node.js 应用可以正确处理请求,适用于 API 服务和动态内容的处理
}