Nginx 不支持真正全局变量,仅可通过内置变量(如 $host、$nginx_version)和 set 指令(作用域限于定义块及子块)实现类全局值复用;推荐用 include 文件或 map 指令跨 server 共享配置。

在 Nginx 配置中,**不能像编程语言那样定义任意全局变量或常量**,但可以通过两种方式实现“类全局”的值复用:一是使用 内置变量(直接引用,无需定义);二是通过 set 指令自定义变量,其作用域受配置块层级限制,并非真正跨 server 或 http 全局生效。
内置变量:开箱即用的“全局常量”
Nginx 提供大量预定义变量(如 $host、$request_uri、$server_name),它们由模块自动填充,随时可用,本质是只读常量:
-
$remote_addr— 客户端真实 IP -
$scheme— 当前协议(http或https) -
$document_root— 当前 location 对应的根目录路径 -
$nginx_version— Nginx 版本号,固定不变,最接近“常量”语义
这些变量在任何可使用变量的地方(return、proxy_set_header、log_format 等)都能直接引用,无需声明。
set 指令:定义作用域受限的自定义变量
使用 set $var_name value; 可创建变量,但必须注意作用域规则:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 变量只能在定义它的配置块及其子块中使用(例如在
server块里set,则该变量在内部location中可用) -
不能在
http块顶层直接定义后被所有server共享 —— Nginx 不支持跨 server 的全局变量 - 变量值支持字符串、其他变量拼接(
set $my_host "$host:$server_port";),也支持空格和引号(含特殊字符时需加引号)
示例:
server {set $api_prefix "/v1";
location /api {
proxy_pass https://backend$api_prefix;
}
}
模拟“全局常量”的实用技巧
若需多个 server 复用同一值(如 API 版本、CDN 域名),推荐以下方法:
-
使用 include 文件:在
/etc/nginx/conf.d/下新建constants.conf,写入set $cdn_domain "cdn.example.com";,然后在各server块中include constants.conf; -
利用 map 指令做条件映射(更安全):
map $host $backend_url {
default "http://127.0.0.1:8000";
"staging.example.com" "http://127.0.0.1:8001";
}
该 map 在http块定义,所有 server 均可引用$backend_url
不支持的操作与常见误区
以下做法无效或不符合预期:
- 在
http块中写set $global_var "abc";,期望它在所有server中自动可用 —— ❌ 实际不可见 - 试图用变量定义端口号(如
listen $my_port;)—— ❌ listen 不支持变量 - 在
if块外使用set定义变量再用于 upstream —— ❌ upstream 块不支持变量解析
变量能力服务于请求处理流程,不是通用配置抽象层。设计时应优先用 map、include 和内置变量组合达成目标。

















