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; |
| 请求追踪 | 生成唯一ID | set $trace_id "$connection"; |
| 动态代理 | 动态选择后端 | set $backend "$host"; |
set 指令虽然简单,但配合 if 和变量组合,能实现非常灵活的配置逻辑,是 Nginx 高级配置的核心工具。
发表回复