nginx set指令

Nginx set 指令详细实例大全

我为你准备了一系列详细的 set 指令实例,每个都包含完整配置执行流程测试结果,让你彻底掌握这个强大的功能。


实例一:基础变量设置与使用

场景

设置网站基本信息变量,并在响应中返回。

完整配置

server {
    listen 80;
    server_name example.com;

    # ========== 基础变量设置 ==========
    set $site_name "我的个人技术博客";
    set $site_version "v2.5.0";
    set $site_author "张三";
    set $site_year "2026";
    set $maintainer_email "admin@example.com";

    # 变量组合
    set $site_info "$site_name - 版本: $site_version - 维护: $site_year";
    set $full_copyright "Copyright © $site_year $site_author, Email: $maintainer_email";

    location / {
        # 在响应头中返回变量值
        add_header X-Site-Name $site_name;
        add_header X-Site-Version $site_version;
        add_header X-Site-Info $site_info;
        add_header X-Copyright $full_copyright;

        # 在页面内容中显示
        default_type text/html;
        return 200 "
        <!DOCTYPE html>
        <html>
        <head><title>$site_name</title></head>
        <body>
            <h1>欢迎访问 $site_name</h1>
            <p>版本: $site_version</p>
            <p>作者: $site_author</p>
            <p>$full_copyright</p>
            <hr>
            <p>您的IP: $remote_addr</p>
            <p>访问时间: $time_local</p>
        </body>
        </html>
        ";
    }

    # 查看变量定义
    location /info {
        default_type text/plain;
        return 200 "
        ===== 站点配置信息 =====
        site_name: $site_name
        site_version: $site_version
        site_author: $site_author
        site_year: $site_year
        site_info: $site_info
        full_copyright: $full_copyright
        maintainer_email: $maintainer_email
        ======================
        ";
    }
}

测试结果

# 访问首页
curl http://example.com

# 响应头
X-Site-Name: 我的个人技术博客
X-Site-Version: v2.5.0
X-Site-Info: 我的个人技术博客 - 版本: v2.5.0 - 维护: 2026
X-Copyright: Copyright © 2026 张三, Email: admin@example.com

# 查看变量定义
curl http://example.com/info

实例二:动态根目录(多域名多站点)

场景

一台服务器部署多个网站,根据域名动态设置根目录。

完整配置

server {
    listen 80;

    # 所有域名都指向这个 server
    server_name a.com b.com c.com d.com;

    # ========== 设置默认值 ==========
    set $site_root "/var/www/default";
    set $site_index "index.html";
    set $site_error_page "/404.html";

    # ========== 根据域名动态设置 ==========
    # 域名 a.com
    if ($host = a.com) {
        set $site_root "/var/www/a_blog";
        set $site_index "blog.html";
        set $site_error_page "/a_404.html";
        set $site_alias "技术博客A";
    }

    # 域名 b.com
    if ($host = b.com) {
        set $site_root "/var/www/b_shop";
        set $site_index "shop.html";
        set $site_error_page "/b_404.html";
        set $site_alias "商城B";
    }

    # 域名 c.com
    if ($host = c.com) {
        set $site_root "/var/www/c_admin";
        set $site_index "admin.html";
        set $site_error_page "/c_404.html";
        set $site_alias "管理后台C";
    }

    # 域名 d.com
    if ($host = d.com) {
        set $site_root "/var/www/d_api";
        set $site_index "api.html";
        set $site_error_page "/d_404.html";
        set $site_alias "API服务D";
    }

    # ========== 使用动态变量 ==========
    location / {
        root $site_root;
        index $site_index;

        # 添加调试头
        add_header X-Site-Alias $site_alias;
        add_header X-Site-Root $site_root;
        add_header X-Site-Index $site_index;

        # 记录访问日志
        access_log /var/log/nginx/$host.log main;
    }

    # 错误页面
    error_page 404 $site_error_page;
    location = $site_error_page {
        root $site_root;
        internal;
    }

    # 查看当前站点配置
    location /site-info {
        default_type text/plain;
        return 200 "
        ===== 当前站点信息 =====
        域名: $host
        站点别名: $site_alias
        根目录: $site_root
        首页文件: $site_index
        错误页面: $site_error_page
        客户端IP: $remote_addr
        访问时间: $time_local
        =====================
        ";
    }
}

测试结果

# 访问不同域名
curl -I http://a.com
# X-Site-Alias: 技术博客A
# X-Site-Root: /var/www/a_blog

curl -I http://b.com
# X-Site-Alias: 商城B
# X-Site-Root: /var/www/b_shop

# 查看配置信息
curl http://c.com/site-info

实例三:多条件组合判断(标志位模式)

场景

需要同时满足多个条件时,使用变量组合实现复杂的逻辑判断。

完整配置

server {
    listen 80;
    server_name shop.example.com;

    # ========== 初始化标志位 ==========
    set $condition_flag "";
    set $action_type "normal";
    set $log_message "";

    # ========== 定义各种条件 ==========

    # 条件1:是否为移动端访问
    if ($http_user_agent ~* "(mobile|iphone|android|ipad)") {
        set $condition_flag "${condition_flag}M";
        set $log_message "${log_message}移动端|";
    }

    # 条件2:是否为晚上高峰期(20-23点)
    if ($time_local ~ "20:|21:|22:|23:") {
        set $condition_flag "${condition_flag}N";
        set $log_message "${log_message}晚间|";
    }

    # 条件3:是否为周末
    if ($time_local ~ "Sat|Sun") {
        set $condition_flag "${condition_flag}W";
        set $log_message "${log_message}周末|";
    }

    # 条件4:是否为新用户(没有cookie)
    if ($http_cookie !~ "user_id=") {
        set $condition_flag "${condition_flag}U";
        set $log_message "${log_message}新用户|";
    }

    # 条件5:是否为VIP用户
    if ($http_cookie ~* "vip_level=[4-9]") {
        set $condition_flag "${condition_flag}V";
        set $log_message "${log_message}VIP|";
    }

    # 条件6:是否为大促期间(参数中有promotion)
    if ($arg_promotion = "618") {
        set $condition_flag "${condition_flag}P";
        set $log_message "${log_message}大促|";
    }

    # ========== 根据标志位组合做不同处理 ==========
    location / {
        # 记录组合标志
        add_header X-Condition-Flag $condition_flag;
        add_header X-Log-Message $log_message;

        # 情况1:移动端 + 晚间 + VIP(特殊处理)
        if ($condition_flag ~ "MNV") {
            set $action_type "vip_night_mobile";
            rewrite ^ /vip/mobile/night/ last;
        }

        # 情况2:新用户 + 晚间 + 大促(引导注册)
        if ($condition_flag ~ "UNP") {
            set $action_type "new_user_promotion";
            rewrite ^ /register?promo=618 last;
        }

        # 情况3:周末 + 移动端(周末活动页)
        if ($condition_flag ~ "WM") {
            set $action_type "weekend_mobile";
            rewrite ^ /weekend/activity last;
        }

        # 情况4:VIP + 大促(VIP专享价)
        if ($condition_flag ~ "VP") {
            set $action_type "vip_promotion";
            proxy_set_header X-VIP-Promotion "true";
            proxy_pass http://vip_backend;
            break;
        }

        # 情况5:纯新用户(引导注册)
        if ($condition_flag = "U") {
            set $action_type "new_user_only";
            add_header X-Guide "新用户专享";
        }

        # 默认处理
        add_header X-Action-Type $action_type;
        proxy_pass http://default_backend;
    }

    # 调试接口:查看当前标志位
    location /debug-flag {
        default_type text/html;
        return 200 "
        <html>
        <body>
        <h2>条件标志位调试</h2>
        <p>当前标志位: <strong>$condition_flag</strong></p>
        <p>日志信息: $log_message</p>
        <p>处理动作: $action_type</p>
        <hr>
        <h3>各条件检测结果:</h3>
        <ul>
            <li>移动端: $mobile_check</li>
            <li>晚间: $night_check</li>
            <li>周末: $weekend_check</li>
            <li>新用户: $newuser_check</li>
            <li>VIP: $vip_check</li>
            <li>大促: $promotion_check</li>
        </ul>
        </body>
        </html>
        ";
    }
}

测试结果

# 移动端 + 晚间访问
curl -A "Mozilla/5.0 (iPhone)" "http://shop.example.com/debug-flag"
# 标志位: MNW

# VIP + 大促
curl -b "vip_level=5" "http://shop.example.com/debug-flag?promotion=618"
# 标志位: VP

# 新用户 + 周末
curl -H "User-Agent: Mozilla/5.0" "http://shop.example.com/debug-flag"
# 标志位: WU

实例四:动态限速系统

场景

根据用户类型、文件类型、时间段动态调整下载限速。

完整配置

server {
    listen 80;
    server_name download.example.com;

    # ========== 设置默认限速值 ==========
    set $limit_rate 100k;        # 默认 100KB/s
    set $limit_rate_after 1m;    # 默认下载1M后开始限速
    set $rate_reason "默认限速";

    # ========== 文件大小检测 ==========
    # 注意:$content_length 需要从请求头获取
    if ($content_length > 10485760) {  # 大于10M
        set $limit_rate 50k;
        set $rate_reason "大文件限速";
    }

    # ========== 文件类型检测 ==========
    location /download/ {
        alias /data/files/;

        # 根据文件扩展名设置不同限速
        if ($request_uri ~* "\.(zip|tar|gz|rar)$") {
            set $limit_rate 30k;
            set $rate_reason "压缩包限速";
        }

        if ($request_uri ~* "\.(mp4|avi|mkv)$") {
            set $limit_rate 200k;
            set $rate_reason "视频文件";
        }

        if ($request_uri ~* "\.(pdf|doc|txt)$") {
            set $limit_rate 500k;
            set $rate_reason "文档文件";
        }

        # ========== 用户类型检测 ==========
        # VIP用户(通过Cookie)
        if ($http_cookie ~* "vip_level=([3-9]|10)") {
            set $limit_rate 0;           # 不限速
            set $rate_reason "VIP用户";
        }

        # 付费用户(通过Token参数)
        if ($arg_token ~* "^premium_.+") {
            set $limit_rate 1m;           # 1MB/s
            set $rate_reason "付费用户";
        }

        # 内部员工(通过IP)
        if ($remote_addr ~ "192\.168\.") {
            set $limit_rate 0;
            set $rate_reason "内网用户";
        }

        # ========== 时间段限速 ==========
        # 晚上高峰期(20-23点)
        if ($time_local ~ "20:|21:|22:|23:") {
            set $limit_rate 50k;
            set $rate_reason "晚间限速";
        }

        # 凌晨低谷(1-6点)提速
        if ($time_local ~ "01:|02:|03:|04:|05:|06:") {
            set $limit_rate 500k;
            set $rate_reason "凌晨提速";
        }

        # ========== 并发连接数检测 ==========
        # 注意:这里需要配合 limit_conn 模块
        limit_conn per_ip 5;
        limit_conn_status 503;

        # 如果并发高,进一步限速
        if ($limit_conn_status = "503") {
            set $limit_rate 20k;
            set $rate_reason "高并发限速";
        }

        # ========== 应用限速配置 ==========
        limit_rate $limit_rate;
        limit_rate_after $limit_rate_after;

        add_header X-Limit-Rate "$limit_rate";
        add_header X-Rate-Reason "$rate_reason";
        add_header X-Content-Length "$content_length";

        # ========== 下载统计 ==========
        access_log /var/log/nginx/download.log combined;

        # ========== 大文件优化 ==========
        sendfile on;
        tcp_nopush on;
        directio 4m;
    }

    # 查看当前限速配置
    location /rate-info {
        default_type text/html;
        return 200 "
        <html>
        <body>
        <h2>当前下载限速配置</h2>
        <table border='1'>
            <tr><th>项目</th><th>值</th></tr>
            <tr><td>限速值</td><td>$limit_rate</td></tr>
            <tr><td>限速原因</td><td>$rate_reason</td></tr>
            <tr><td>你的IP</td><td>$remote_addr</td></tr>
            <tr><td>User-Agent</td><td>$http_user_agent</td></tr>
            <tr><td>当前时间</td><td>$time_local</td></tr>
            <tr><td>Cookie</td><td>$http_cookie</td></tr>
        </table>

        <h3>限速规则说明:</h3>
        <ul>
            <li>VIP用户: 不限速</li>
            <li>内网用户: 不限速</li>
            <li>付费用户: 1MB/s</li>
            <li>普通用户白天: 100KB/s</li>
            <li>普通用户晚间: 50KB/s</li>
            <li>凌晨时段: 500KB/s</li>
            <li>压缩包: 30KB/s</li>
            <li>视频文件: 200KB/s</li>
        </ul>
        </body>
        </html>
        ";
    }
}

测试结果

# 普通用户下载
curl -I http://download.example.com/download/file.zip
# X-Limit-Rate: 30k
# X-Rate-Reason: 压缩包限速

# VIP用户下载
curl -b "vip_level=5" -I http://download.example.com/download/file.zip
# X-Limit-Rate: 0
# X-Rate-Reason: VIP用户

# 晚间下载
curl -H "User-Agent: Mozilla/5.0" -I http://download.example.com/download/file.mp4
# X-Limit-Rate: 50k
# X-Rate-Reason: 晚间限速

实例五:请求追踪与调试系统

场景

为每个请求生成唯一ID,记录完整的请求链路,方便调试和问题追踪。

完整配置

server {
    listen 80;
    server_name api.example.com;

    # ========== 生成请求追踪ID ==========
    set $trace_id "";

    # 如果有客户端传入的trace_id,使用客户端的
    if ($http_x_trace_id) {
        set $trace_id $http_x_trace_id;
    }

    # 否则生成新的(这里用连接信息模拟)
    if ($trace_id = "") {
        set $trace_id "$connection-$connection_requests-$pid-$remote_port";
    }

    # ========== 记录请求开始时间 ==========
    set $request_start_time $msec;

    # ========== 构建完整的调试信息 ==========
    set $debug_info "";
    set $debug_info "${debug_info}=== 请求追踪 ===\n";
    set $debug_info "${debug_info}TraceID: $trace_id\n";
    set $debug_info "${debug_info}时间戳: $time_local\n";
    set $debug_info "${debug_info}客户端IP: $remote_addr\n";
    set $debug_info "${debug_info}请求方法: $request_method\n";
    set $debug_info "${debug_info}请求URI: $request_uri\n";
    set $debug_info "${debug_info}User-Agent: $http_user_agent\n";
    set $debug_info "${debug_info}Referer: $http_referer\n";
    set $debug_info "${debug_info}Cookie: $http_cookie\n";

    # ========== 记录各阶段时间戳 ==========
    location / {
        # 记录到达后端的时间
        set $backend_start $msec;

        # 转发请求
        proxy_pass http://backend;
        proxy_set_header X-Trace-ID $trace_id;
        proxy_set_header X-Request-Start $request_start_time;

        # 记录后端响应时间
        set $backend_end $msec;
        set $backend_time [expr $backend_end - $backend_start];

        # 添加追踪头
        add_header X-Trace-ID $trace_id;
        add_header X-Backend-Time "$backend_time ms";
        add_header X-Request-ID "$connection-$connection_requests";
    }

    # ========== 调试接口 ==========
    location /debug {
        default_type text/plain;

        # 收集所有调试信息
        set $debug_output "";
        set $debug_output "${debug_output}=== Nginx 调试信息 ===\n";
        set $debug_output "${debug_output}Trace ID: $trace_id\n";
        set $debug_output "${debug_output}请求时间: $time_local\n";
        set $debug_output "${debug_output}客户端IP: $remote_addr:$remote_port\n";
        set $debug_output "${debug_output}服务端: $server_addr:$server_port\n";
        set $debug_output "${debug_output}请求方法: $request_method\n";
        set $debug_output "${debug_output}请求URI: $request_uri\n";
        set $debug_output "${debug_output}请求参数: $args\n";
        set $debug_output "${debug_output}协议: $scheme\n";
        set $debug_output "${debug_output}User-Agent: $http_user_agent\n";
        set $debug_output "${debug_output}Referer: $http_referer\n";
        set $debug_output "${debug_output}Cookie: $http_cookie\n";
        set $debug_output "${debug_output}内容类型: $content_type\n";
        set $debug_output "${debug_output}内容长度: $content_length\n";
        set $debug_output "${debug_output}\n=== 路径信息 ===\n";
        set $debug_output "${debug_output}URI: $uri\n";
        set $debug_output "${debug_output}文档根: $document_root\n";
        set $debug_output "${debug_output}文件路径: $request_filename\n";
        set $debug_output "${debug_output}\n=== Nginx 变量 ===\n";
        set $debug_output "${debug_output}连接ID: $connection\n";
        set $debug_output "${debug_output}请求次数: $connection_requests\n";
        set $debug_output "${debug_output}进程ID: $pid\n";
        set $debug_output "${debug_output}管道ID: $pipe\n";
        set $debug_output "${debug_output}请求ID: $request_id\n";
        set $debug_output "${debug_output}请求长度: $request_length\n";
        set $debug_output "${debug_output}请求时间: $request_time\n";
        set $debug_output "${debug_output}状态: $status\n";
        set $debug_output "${debug_output}字节数: $bytes_sent\n";
        set $debug_output "${debug_output}body字节: $body_bytes_sent\n";

        return 200 $debug_output;
    }

    # ========== 详细追踪接口 ==========
    location /trace {
        default_type text/html;

        set $html_output "<html><head><title>请求追踪</title>";
        set $html_output "${html_output}<style>body{font-family:monospace;}</style></head>";
        set $html_output "${html_output}<body><h2>🔍 请求追踪 #$trace_id</h2>";
        set $html_output "${html_output}<table border='1' cellpadding='5'>";
        set $html_output "${html_output}<tr><th>阶段</th><th>时间</th><th>详情</th></tr>";

        # 各个阶段
        set $html_output "${html_output}<tr><td>🟢 请求到达</td><td>$time_local</td><td>$remote_addr → $server_addr</td></tr>";
        set $html_output "${html_output}<tr><td>🔵 请求解析</td><td>-</td><td>$request_method $request_uri</td></tr>";
        set $html_output "${html_output}<tr><td>🟡 头部信息</td><td>-</td><td>UA: $http_user_agent</td></tr>";
        set $html_output "${html_output}<tr><td>🟠 后端处理</td><td>-</td><td>转发至: backend</td></tr>";
        set $html_output "${html_output}<tr><td>🟣 响应生成</td><td>-</td><td>状态: 200</td></tr>";
        set $html_output "${html_output}<tr><td>🔴 响应返回</td><td>-</td><td>大小: $body_bytes_sent bytes</td></tr>";

        set $html_output "${html_output}</table>";
        set $html_output "${html_output}<p>完整调试: <a href='/debug'>/debug</a></p>";
        set $html_output "${html_output}</body></html>";

        return 200 $html_output;
    }
}

测试结果

# 普通请求
curl -H "X-Trace-ID: test-123" http://api.example.com/api/user
# 响应头包含:
# X-Trace-ID: test-123
# X-Backend-Time: 45 ms

# 调试接口
curl http://api.example.com/debug

# 追踪页面
curl http://api.example.com/trace

实例六:动态反向代理配置

场景

根据请求参数、域名、路径动态选择后端服务器。

完整配置

server {
    listen 80;
    server_name proxy.example.com;

    # ========== 定义后端服务器池 ==========
    set $backend_group "default";
    set $backend_server "";
    set $backend_protocol "http";

    # ========== 根据域名选择后端 ==========
    if ($host ~* "api") {
        set $backend_group "api";
    }

    if ($host ~* "static") {
        set $backend_group "static";
    }

    if ($host ~* "admin") {
        set $backend_group "admin";
    }

    # ========== 根据路径选择后端 ==========
    location / {
        # API路径
        if ($request_uri ~* "^/api/") {
            set $backend_group "api";
            set $backend_server "192.168.1.10:8080";
        }

        # 用户服务
        if ($request_uri ~* "^/user/") {
            set $backend_group "user";
            set $backend_server "192.168.1.11:8081";
        }

        # 订单服务
        if ($request_uri ~* "^/order/") {
            set $backend_group "order";
            set $backend_server "192.168.1.12:8082";
        }

        # 商品服务
        if ($request_uri ~* "^/product/") {
            set $backend_group "product";
            set $backend_server "192.168.1.13:8083";
        }

        # 静态文件
        if ($request_uri ~* "\.(css|js|jpg|png)$") {
            set $backend_group "static";
            set $backend_server "192.168.1.14:80";
            set $backend_protocol "http";
        }
    }

    # ========== 根据请求参数选择后端 ==========
    location /proxy {
        # version=v1 使用旧版后端
        if ($arg_version = "v1") {
            set $backend_server "192.168.1.100:8080";
            set $backend_group "old_version";
        }

        # version=v2 使用新版后端
        if ($arg_version = "v2") {
            set $backend_server "192.168.1.101:8080";
            set $backend_group "new_version";
        }

        # debug=true 使用调试后端
        if ($arg_debug = "true") {
            set $backend_server "192.168.1.200:8080";
            set $backend_group "debug";
        }

        # 根据用户ID哈希选择后端
        if ($arg_user_id) {
            set $hash $arg_user_id;
            set $mod [expr $hash % 3];

            if ($mod = 0) {
                set $backend_server "192.168.1.21:8080";
            }
            if ($mod = 1) {
                set $backend_server "192.168.1.22:8080";
            }
            if ($mod = 2) {
                set $backend_server "192.168.1.23:8080";
            }
            set $backend_group "shard_$mod";
        }
    }

    # ========== 根据客户端特征选择后端 ==========
    location /geo {
        # 根据IP选择就近后端
        if ($remote_addr ~ "192\.168\.1\.") {
            set $backend_server "10.0.0.1:8080";
            set $backend_group "local";
        }

        if ($remote_addr ~ "10\.") {
            set $backend_server "10.0.0.2:8080";
            set $backend_group "internal";
        }

        # 根据User-Agent选择
        if ($http_user_agent ~* "mobile") {
            set $backend_server "192.168.1.30:8080";
            set $backend_group "mobile";
        }

        if ($http_user_agent ~* "bot|crawler") {
            set $backend_server "192.168.1.40:8080";
            set $backend_group "crawler";
        }
    }

    # ========== 根据Cookie选择后端(灰度发布) ==========
    location /gray {
        # 灰度用户
        if ($http_cookie ~* "gray_version=beta") {
            set $backend_server "192.168.1.50:8080";
            set $backend_group "beta";
        }

        # 普通用户
        if ($http_cookie !~ "gray_version") {
            # 随机抽样10%做灰度
            set $random $connection;
            if ($random % 10 = 0) {
                set $backend_server "192.168.1.50:8080";
                set $backend_group "beta_auto";
            } else {
                set $backend_server "192.168.1.60:8080";
                set $backend_group "stable";
            }
        }
    }

    # ========== 最终转发 ==========
    location / {
        # 如果没有设置具体后端,使用默认值
        if ($backend_server = "") {
            set $backend_server "192.168.1.1:80";
            set $backend_group "default";
        }

        # 添加调试头
        add_header X-Backend-Group $backend_group;
        add_header X-Backend-Server $backend_server;
        add_header X-Backend-Protocol $backend_protocol;

        # 记录选择结果
        access_log /var/log/nginx/proxy.log proxy;

        # 转发请求
        proxy_pass $backend_protocol://$backend_server$request_uri;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Backend-Group $backend_group;
    }

    # ========== 查看当前路由配置 ==========
    location /route-info {
        default_type text/html;
        return 200 "
        <html>
        <body>
        <h2>当前路由信息</h2>
        <table border='1'>
            <tr><th>项目</th><th>值</th></tr>
            <tr><td>域名</td><td>$host</td></tr>
            <tr><td>请求URI</td><td>$request_uri</td></tr>
            <tr><td>参数</td><td>$args</td></tr>
            <tr><td>选中的后端组</td><td><strong>$backend_group</strong></td></tr>
            <tr><td>选中的后端</td><td><strong>$backend_server</strong></td></tr>
            <tr><td>协议</td><td>$backend_protocol</td></tr>
            <tr><td>客户端IP</td><td>$remote_addr</td></tr>
            <tr><td>User-Agent</td><td>$http_user_agent</td></tr>
            <tr><td>Cookie</td><td>$http_cookie</td></tr>
        </table>

        <h3>路由规则说明:</h3>
        <ul>
            <li>/api/* → 192.168.1.10:8080</li>
            <li>/user/* → 192.168.1.11:8081</li>
            <li>/order/* → 192.168.1.12:8082</li>
            <li>/product/* → 192.168.1.13:8083</li>
            <li>*.css/js/jpg → 192.168.1.14:80</li>
            <li>version=v1 → 192.168.1.100:8080</li>
            <li>version=v2 → 192.168.1.101:8080</li>
            <li>user_id 哈希分片 → 三台后端</li>
            <li>mobile → 192.168.1.30:8080</li>
            <li>beta cookie → 192.168.1.50:8080</li>
        </ul>
        </body>
        </html>
        ";
    }
}

测试结果

# API请求
curl http://proxy.example.com/api/user
# X-Backend-Group: api
# X-Backend-Server: 192.168.1.10:8080

# 版本控制
curl "http://proxy.example.com/proxy?version=v2"
# X-Backend-Group: new_version

# 用户分片
curl "http://proxy.example.com/proxy?user_id=12345"
# 根据12345 % 3 选择后端

# 移动端
curl -A "Mozilla/5.0 (iPhone)" http://proxy.example.com/geo
# X-Backend-Group: mobile

# 灰度发布
curl -b "gray_version=beta" http://proxy.example.com/gray
# X-Backend-Group: beta

七、set 指令使用总结

应用场景核心思路关键代码
基础变量存储配置信息set $name "value";
动态根目录根据条件设置不同路径set $root "/var/$host";
多条件判断标志位组合set $flag "${flag}1";
动态限速根据不同条件调整set $limit_rate 100k;
请求追踪生成唯一IDset $trace_id "$connection";
动态代理动态选择后端set $backend "$host";

set 指令虽然简单,但配合 if 和变量组合,能实现非常灵活的配置逻辑,是 Nginx 高级配置的核心工具。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注