
nginx实用配置
一、location 的匹配规则
在 Nginx 中,location
块用于定义 URL 路径的匹配规则。以下是主要的匹配规则及其优先级:
1. 精确匹配 (=
)
- 使用
=
指定一个完全匹配的路径。 - 优先级最高。
location = /exact-match {
# 配置
}
2. 前缀匹配 (^~
)
- 使用
^~
指定一个前缀匹配。 - 如果匹配成功,将不再进行正则表达式匹配。
location ^~ /static/ {
# 配置
}
3. 正则表达式匹配 (~
和 ~*
)
- 使用
~
区分大小写的正则表达式匹配。 - 使用
~*
不区分大小写的正则表达式匹配。
location ~ \.php$ {
# 配置
}
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
# 配置
}
4. 普通前缀匹配
- 不带任何修饰符的普通前缀匹配。
- 如果没有更高优先级的匹配,将使用最长的普通前缀匹配。
location / {
# 配置
}
匹配优先级
- 精确匹配 (
=
) - 前缀匹配 (
^~
) - 正则表达式匹配 (
~
和~*
):按配置顺序进行匹配。 - 普通前缀匹配:如果没有其他匹配成功,将使用最长的普通前缀。
示例
假设有以下配置:
location = /exact {
# 精确匹配
}
location ^~ /images/ {
# 前缀匹配
}
location ~* \.(gif|jpg|jpeg)$ {
# 正则表达式匹配
}
location / {
# 默认匹配
}
- 请求
/exact
将匹配第一个location
。 - 请求
/images/logo.png
将匹配第二个location
。 - 请求
/pictures/photo.jpg
将匹配第三个location
。 - 其他请求将匹配最后一个
location
。
正则解释
\.(gif|jpg|jpeg)$ 是一个正则表达式,用于匹配以 .gif、.jpg 或 .jpeg 结尾的文件名。以下是对这个正则表达式的详细解释:.:匹配一个字面上的点(.)。在正则表达式中,点是一个元字符,表示匹配任意单个字符,所以需要使用反斜杠(\)进行转义,以匹配实际的点字符。(gif|jpg|jpeg):这是一个捕获组,表示匹配 gif、jpg 或 jpeg 中的任何一个。竖线 | 是“或”操作符。$:匹配字符串的结尾,确保文件扩展名是字符串的末尾部分。因此,这个正则表达式完整的内容是用于匹配任何以 .gif、.jpg 或 .jpeg 结尾的字符串,通常用于匹配图片文件的请求路径。
二、$rewrite 相关的案例
在 Nginx 中,rewrite
指令用于重写请求的 URL。它可以用于重定向用户请求、简化 URL 结构、或者将旧的 URL 路径重定向到新的路径。以下是一些常见的 rewrite
使用案例:
1. 简单重定向
将所有请求从旧路径重定向到新路径:
location /old-path {
rewrite ^/old-path/(.*)$ /new-path/$1 permanent;
}
- 这将
/old-path/some-page
重定向到/new-path/some-page
。 permanent
表示返回 HTTP 301 状态码。
2. 将非 www 重定向到 www
将所有非 www
的请求重定向到 www
:
server {
listen 80;
server_name example.com;
rewrite ^(.*)$ http://www.example.com$1 permanent;
}
- 这会将
http://example.com/page
重定向到http://www.example.com/page
。
3. 将 HTTP 重定向到 HTTPS
确保所有请求使用 HTTPS:
server {
listen 80;
server_name example.com www.example.com;
rewrite ^ https://$server_name$request_uri? permanent;
}
- 这会将
http://example.com/page
重定向到https://example.com/page
。
4. 动态 URL 到静态 URL
将动态 URL 重写为静态 URL:
location / {
rewrite ^/product/(.*)$ /product.php?id=$1 last;
}
- 这将
/product/123
重写为/product.php?id=123
。 last
表示停止当前的重写并重新开始新的请求处理。
5. 移除文件扩展名
移除 URL 中的文件扩展名:
location / {
if ($request_filename ~* (.+)\.html$) {
rewrite ^ /$1 permanent;
}
}
- 这会将
/about.html
重定向到/about
。
6. 使用正则表达式进行复杂重写
将复杂的 URL 重写为简单的格式:
location / {
rewrite ^/category/([a-z]+)/([0-9]+)$ /show.php?category=$1&id=$2 last;
}
- 这将
/category/books/123
重写为/show.php?category=books&id=123
。
注意事项
rewrite
指令的执行顺序与location
块的匹配顺序有关。- 使用
rewrite
时要注意避免循环重定向。 permanent
和redirect
的区别在于前者是 HTTP 301,后者是 HTTP 302。
这些案例展示了如何使用 Nginx 的 rewrite
指令来实现 URL 重写和重定向。根据具体需求,可以调整正则表达式和重定向目标。
三、常用缓存配置
在 Nginx 中,缓存配置可以显著提高网站的性能和响应速度。Nginx 支持多种缓存机制,包括代理缓存、FastCGI 缓存等。以下是一些常见的缓存配置及案例:
1. 基本的代理缓存配置
这是一个简单的代理缓存配置示例,用于缓存从上游服务器获取的响应:
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating;
}
}
}
proxy_cache_path
:定义缓存存储路径及相关参数。levels=1:2
:缓存目录层次结构。keys_zone=my_cache:10m
:定义缓存区域大小。max_size=10g
:最大缓存大小。inactive=60m
:缓存条目在不被访问的情况下保持的时间。use_temp_path=off
:禁用临时路径。
proxy_cache
:指定使用的缓存区域。proxy_cache_valid
:定义不同响应码的缓存时间。proxy_cache_use_stale
:在后端服务器出错时使用过期的缓存。
2. FastCGI 缓存配置
用于缓存 PHP 或其他 FastCGI 应用程序的响应:
http {
fastcgi_cache_path /data/nginx/fastcgi_cache levels=1:2 keys_zone=fastcgi_cache:100m inactive=60m use_temp_path=off;
server {
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_cache fastcgi_cache;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_use_stale error timeout updating;
fastcgi_cache_key $scheme$request_method$host$request_uri;
}
}
}
fastcgi_cache_path
:定义 FastCGI 缓存存储路径及相关参数。fastcgi_cache
:指定使用的缓存区域。fastcgi_cache_key
:定义缓存条目的键,确保唯一性。
3. 缓存静态文件
为静态文件设置缓存头:
server {
location ~* \.(jpg|jpeg|png|gif|css|js|ico|html)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
expires 30d
:设置浏览器缓存过期时间为 30 天。add_header Cache-Control
:设置 HTTP 缓存控制头。
4. 条件缓存
根据请求条件进行缓存:
server {
location / {
set $no_cache 0;
if ($request_method = POST) {
set $no_cache 1;
}
if ($http_authorization ~* "Bearer") {
set $no_cache 1;
}
proxy_cache_bypass $no_cache;
proxy_no_cache $no_cache;
proxy_pass http://backend;
proxy_cache my_cache;
}
}
- 使用变量
$no_cache
控制是否缓存。 proxy_cache_bypass
和proxy_no_cache
用于控制缓存行为。
5. 缓存清除
使用 purge
模块清除缓存:
location /purge/ {
allow 127.0.0.1;
deny all;
proxy_cache_purge my_cache "$scheme$request_method$host$request_uri";
}
- 通过特定 URL 清除缓存。
- 需要编译 Nginx 时加入
--with-http_cache_purge_module
模块。
这些配置示例展示了如何在 Nginx 中设置和管理缓存,以提高网站性能和响应速度。根据具体需求,可以进一步调整和优化配置。
四、SSE 缓存相关配置
在配置 Nginx 以支持服务器发送事件(Server-Sent Events, SSE)时,缓存配置需要特别注意。SSE 是一种用于实现服务器到客户端的单向实时通信的技术,它通过保持一个持久的 HTTP 连接来不断地向客户端发送更新。因此,SSE 流通常不应该被缓存,因为缓存会导致客户端接收不到最新的事件数据。
1. 禁用缓存
确保 SSE 的响应不会被缓存。可以通过设置适当的头部来实现:
server {
location /sse {
# 代理到后端服务器
proxy_pass http://backend;
# 禁用缓存
proxy_buffering off;
proxy_cache off;
# 设置适当的头部
add_header Cache-Control 'no-cache, no-store, must-revalidate';
add_header Pragma 'no-cache';
add_header Expires '0';
# 确保连接保持打开
proxy_set_header Connection '';
chunked_transfer_encoding off;
# 防止代理超时
proxy_read_timeout 3600s;
}
}
2. 关键配置解释
proxy_buffering off;
:禁用代理缓冲,确保数据立即传输给客户端。proxy_cache off;
:明确禁用缓存。add_header Cache-Control 'no-cache, no-store, must-revalidate';
:设置 HTTP 头部以防止任何形式的缓存。proxy_set_header Connection '';
:确保连接保持打开,不要设置为close
。chunked_transfer_encoding off;
:禁用分块传输编码,确保 SSE 流的稳定性。proxy_read_timeout 3600s;
:增加读取超时时间,避免连接因超时而断开。
3. 其他注意事项
- 长时间连接:SSE 是长时间保持连接的,确保 Nginx 的超时设置足够长,以防止连接被意外关闭。
- 负载均衡:如果使用负载均衡,确保同一用户的请求被路由到同一服务器,以保持连接的连续性。
- SSL/TLS:如果使用 HTTPS,确保配置正确,以避免额外的延迟和不必要的中断。
通过上述配置,可以确保 Nginx 正确处理 SSE 请求,并避免不必要的缓存问题,从而保证实时数据的传输。
版权所有
版权归属:tuyongtao1