Skip to content

nginx实用配置

约 2096 字大约 7 分钟

nginx反向代理

2024-10-31

一、location 的匹配规则

在 Nginx 中,location 块用于定义 URL 路径的匹配规则。以下是主要的匹配规则及其优先级:

1. 精确匹配 (=)

  • 使用 = 指定一个完全匹配的路径。
  • 优先级最高。
location = /exact-match {
    # 配置
}

2. 前缀匹配 (^~)

  • 使用 ^~ 指定一个前缀匹配。
  • 如果匹配成功,将不再进行正则表达式匹配。
location ^~ /static/ {
    # 配置
}

3. 正则表达式匹配 (~~*)

  • 使用 ~ 区分大小写的正则表达式匹配。
  • 使用 ~* 不区分大小写的正则表达式匹配。
location ~ \.php$ {
    # 配置
}

location ~* \.(jpg|jpeg|png|gif|css|js)$ {
    # 配置
}

4. 普通前缀匹配

  • 不带任何修饰符的普通前缀匹配。
  • 如果没有更高优先级的匹配,将使用最长的普通前缀匹配。
location / {
    # 配置
}

匹配优先级

  1. 精确匹配 (=)
  2. 前缀匹配 (^~)
  3. 正则表达式匹配 (~~*):按配置顺序进行匹配。
  4. 普通前缀匹配:如果没有其他匹配成功,将使用最长的普通前缀。

示例

假设有以下配置:

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 时要注意避免循环重定向。
  • permanentredirect 的区别在于前者是 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_bypassproxy_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 请求,并避免不必要的缓存问题,从而保证实时数据的传输。

© 2024 图图 📧 email