nginx location 指令介绍
参考地址
- nginx 官方文档 https://nginx.org/en/docs/http/ngx_http_core_module.html#location
- nginx 之 location 规则详解 https://www.modb.pro/db/391597
- nginx 之 proxy_pass 详解 https://blog.csdn.net/z69183787/article/details/131548753
- Nginx 反向代理 location 与 proxy_pass 配置规则总结 https://blog.csdn.net/qq_36528215/article/details/123570962
location 指令语法
location
指令用于配置基于请求的 URI 如何处理请求。
这个指令定义在 Nginx 配置文件的 server
块中,用来决定不同的 URI 如何被处理。
下面是 location
指令的基本语法:
location [ = | ~ | ~* | ^~ ] uri { ... }
这里的各个部分意味着:
location
:这是指令的关键字。[ = | ~ | ~* | ^~ ]
:这是一个可选的修饰符,用于控制 URI 匹配的方式:=
:进行精确匹配。当且仅当完全匹配指定的 URI 时,该配置才会被使用。~
:进行区分大小写的正则表达式匹配。~*
:进行不区分大小写的正则表达式匹配。^~
:如果该前缀匹配成功,Nginx 将不再进行正则表达式匹配,而是立即使用此块处理请求。
uri
:这是要匹配的 URI 或者正则表达式。{ ... }
:花括号内部包含了当匹配发生时应用的配置指令。
使用 location
指令可以非常灵活地控制请求如何被处理,比如重定向、重写 URL、定义代理行为等。每个 location
块都可以包含独立的 Nginx 指令集,以适应特定的服务需求。
location 上下文
在 Nginx 的配置中,location
块是一个强大的指令用于定义如何处理特定的 URI 请求。
location
指令只能在 server
或 location
块内部使用,这意味着它们是嵌套的。
每个 location
指令定义了一个上下文,该上下文具有特定的配置,用于处理匹配到的 URI。
以下是 location
上下文中一些关键的用法和信息:
基本结构
location
指令通常位于 server
块中,形成了请求处理的基本逻辑。例如:
server {
listen 80;
server_name example.com;
location / {
# 处理根URL的配置
}
location /images/ {
# 处理图像文件的配置
}
location ~* \.(gif|jpg|jpeg)$ {
# 用正则表达式处理图像文件扩展名的配置
}
}
嵌套 location
location
块可以嵌套在另一个 location
块内。这用于更细粒度的控制。例如,你可以在一个通用的路径内特别配置一小部分路径:
location /user/ {
# 处理以 /user/ 开头的请求
location ~ \.php$ {
# 处理所有 PHP 文件的请求
}
}
特殊指令和上下文
在 location
块内部,可以使用各种指令来控制如何响应请求,例如 proxy_pass
用于代理请求,rewrite
用于重写 URL,以及 return
用于直接返回特定的响应。
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 的缓存策略
location /static/ {
root /var/www/html; # 指定静态文件的根目录
expires 30d; # 设置缓存过期时间为 30 天,提高重复访问的效率
add_header Cache-Control "public"; # 向客户端发送缓存控制头,允许被公共缓存
# 静态内容缓存配置,加快网页加载速度
}
2. 应用 SSL 策略
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. 配置特定路径的访问控制
location /admin/ {
auth_basic "Administrator's Area"; # 启用基本认证,提示文字为“Administrator's Area”
auth_basic_user_file /etc/nginx/.htpasswd; # 定义用户验证文件的位置
# 此位置被保护,访问需要通过用户名和密码验证
}
4. 定制特定请求的日志记录
location /api/ {
access_log /var/log/nginx/api_access.log; # 指定访问日志文件路径
error_log /var/log/nginx/api_error.log; # 指定错误日志文件路径
# API 请求的专用日志记录,方便追踪和问题定位
}
5. 处理不同类型的内容,如静态内容、动态内容
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)
location / {
root /var/www/html; # 指定项目的根目录
try_files $uri $uri/ /index.html; # 尝试直接访问文件,如果失败则重定向到 index.html
# 适用于单页应用(SPA),确保路由由前端 JavaScript 处理
}
7. 配置 Nuxt.js/Next.js 服务端渲染(SSR)项目
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 应用配置
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 服务和动态内容的处理
}