问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

nginx配置文件中怎么把hostname的值赋给其它变量

发布网友 发布时间:2022-04-22 07:33

我来回答

2个回答

热心网友 时间:2022-06-17 19:22

Nginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序。当然,是不是“图灵完全的”暂且不论,至少据我观察,它在设计上受 Perl 和 Bourne Shell 这两种语言的影响很大。在这一点上,相比 Apache 和 Lighttpd 等其他 Web 服务器的配置记法,不能不说算是 Nginx 的一大特色了。既然是编程语言,一般也就少不了“变量”这种东西(当然,Haskell 这样奇怪的函数式语言除外了)。
熟悉 Perl、Bourne Shell、C/C++ 等命令式编程语言的朋友肯定知道,变量说白了就是存放“值”的容器。而所谓“值”,在许多编程语言里,既可以是 3.14 这样的数值,也可以是 hello world 这样的字符串,甚至可以是像数组、哈希表这样的复杂数据结构。然而,在 Nginx 配置中,变量只能存放一种类型的值,因为也只存在一种类型的值,那就是字符串。
比如我们的 nginx.conf 文件中有下面这一行配置:
set $a "hello world";

我们使用了标准 ngx_rewrite 模块的 set 配置指令对变量 $a 进行了赋值操作。特别地,我们把字符串 hello world 赋给了它。
我们看到,Nginx 变量名前面有一个 $ 符号,这是记法上的要求。所有的 Nginx 变量在 Nginx 配置文件中引用时都须带上 $ 前缀。这种表示方法和 Perl、PHP 这些语言是相似的。
虽然 $ 这样的变量前缀修饰会让正统的 Java 和 C# 程序员不舒服,但这种表示方法的好处也是显而易见的,那就是可以直接把变量嵌入到字符串常量中以构造出新的字符串:
set $a hello;
set $b "$a, $a";

这里我们通过已有的 Nginx 变量 $a 的值,来构造变量 $b 的值,于是这两条指令顺序执行完之后,$a 的值是 hello,而 $b 的值则是 hello, hello. 这种技术在 Perl 世界里被称为“变量插值”(variable interpolation),它让专门的字符串拼接运算符变得不再那么必要。我们在这里也不妨采用此术语。
我们来看一个比较完整的配置示例:
server {
listen 8080;
location /test {
set $foo hello;
echo "foo: $foo";
}
}

这个例子省略了 nginx.conf 配置文件中最外围的 http 配置块以及 events 配置块。使用 curl 这个 HTTP 客户端在命令行上请求这个 /test 接口,我们可以得到
$ curl 'http://localhost:8080/test'
foo: hello

这里我们使用第三方 ngx_echo 模块的 echo 配置指令将 $foo 变量的值作为当前请求的响应体输出。
我们看到,echo 配置指令的参数也支持“变量插值”。不过,需要说明的是,并非所有的配置指令都支持“变量插值”。事实上,指令参数是否允许“变量插值”,取决于该指令的实现模块。
如果我们想通过 echo 指令直接输出含有“美元符”($)的字符串,那么有没有办法把特殊的 $ 字符给转义掉呢?答案是否定的(至少到目前最新的 Nginx 稳定版 1.0.10)。不过幸运的是,我们可以绕过这个*,比如通过不支持“变量插值”的模块配置指令专门构造出取值为 $ 的 Nginx 变量,然后再在 echo 中使用这个变量。看下面这个例子:
geo $dollar {
default "$";
}
server {
listen 8080;
location /test {
echo "This is a dollar sign: $dollar";
}
}

测试结果如下:
$ curl 'http://localhost:8080/test'
This is a dollar sign: $

这里用到了标准模块 ngx_geo 提供的配置指令 geo 来为变量 $dollar 赋予字符串 "$",这样我们在下面需要使用美元符的地方,就直接引用我们的 $dollar 变量就可以了。其实 ngx_geo 模块最常规的用法是根据客户端的 IP 地址对指定的 Nginx 变量进行赋值,这里只是借用它以便“无条件地”对我们的 $dollar 变量赋予“美元符”这个值。
在“变量插值”的上下文中,还有一种特殊情况,即当引用的变量名之后紧跟着变量名的构成字符时(比如后跟字母、数字以及下划线),我们就需要使用特别的记法来消除歧义,例如:
server {
listen 8080;
location /test {
set $first "hello ";
echo "${first}world";
}
}

这里,我们在 echo 配置指令的参数值中引用变量 $first 的时候,后面紧跟着 world 这个单词,所以如果直接写作 "$firstworld" 则 Nginx “变量插值”计算引擎会将之识别为引用了变量 $firstworld. 为了解决这个难题,Nginx 的字符串记法支持使用花括号在 $ 之后把变量名围起来,比如这里的 ${first}. 上面这个例子的输出是:
$ curl 'http://localhost:8080/test
hello world

set 指令(以及前面提到的 geo 指令)不仅有赋值的功能,它还有创建 Nginx 变量的副作用,即当作为赋值对象的变量尚不存在时,它会自动创建该变量。比如在上面这个例子中,如果 $a 这个变量尚未创建,则 set 指令会自动创建 $a 这个用户变量。如果我们不创建就直接使用它的值,则会报错。例如

1
2
3
4
5
6

server {
listen 8080;
location /bad {
echo $foo;
}
}

此时 Nginx 服务器会拒绝加载配置:

1

[emerg] unknown "foo" variable

是的,我们甚至都无法启动服务!
有趣的是,Nginx 变量的创建和赋值操作发生在全然不同的时间阶段。Nginx 变量的创建只能发生在 Nginx 配置加载的时候,或者说 Nginx 启动的时候;而赋值操作则只会发生在请求实际处理的时候。这意味着不创建而直接使用变量会导致启动失败,同时也意味着我们无法在请求处理时动态地创建新的 Nginx 变量。
Nginx 变量一旦创建,其变量名的可见范围就是整个 Nginx 配置,甚至可以跨越不同虚拟主机的 server 配置块。我们来看一个例子:
server {
listen 8080;
location /foo {
echo "foo = [$foo]";
}
location /bar {
set $foo 32;
echo "foo = [$foo]";
}
}

这里我们在 location /bar 中用 set 指令创建了变量 $foo,于是在整个配置文件中这个变量都是可见的,因此我们可以在 location /foo 中直接引用这个变量而不用担心 Nginx 会报错。
下面是在命令行上用 curl 工具访问这两个接口的结果:

$ curl 'http://localhost:8080/foo'
foo = []

$ curl 'http://localhost:8080/bar'
foo = [32]

$ curl 'http://localhost:8080/foo'
foo = []

从这个例子我们可以看到,set 指令因为是在 location /bar 中使用的,所以赋值操作只会在访问 /bar 的请求中执行。而请求 /foo 接口时,我们总是得到空的 $foo 值,因为用户变量未赋值就输出的话,得到的便是空字符串。
从这个例子我们可以窥见的另一个重要特性是,Nginx 变量名的可见范围虽然是整个配置,但每个请求都有所有变量的独立副本,或者说都有各变量用来存放值的容器的独立副本,彼此互不干扰。比如前面我们请求了 /bar 接口后,$foo 变量被赋予了值 32,但它丝毫不会影响后续对 /foo 接口的请求所对应的 $foo 值(它仍然是空的!),因为各个请求都有自己独立的 $foo 变量的副本。
对于 Nginx 新手来说,最常见的错误之一,就是将 Nginx 变量理解成某种在请求之间全局共享的东西,或者说“全局变量”。而事实上,Nginx 变量的生命期是不可能跨越请求边界的。

热心网友 时间:2022-06-17 19:22

有两种方法:1.设置单元格格式-对齐,在文本控制里选自动换行。 这样单元格就不会变宽,但会变高。如果既不想变宽,又不要变高,可以用第2种方法。2.设置单元格格式-水平对齐-选择填充
nginx前端页面配置(nginx代理前端页面)

首先nginx安装好之后的缺省配置文件:nginx/conf/nginx.conf 这里定义的root地址是相对于nginx的根路径的;那么当用户通过浏览器访问根地址:;hostname:port时,nginx试图返回的页面就是:nginx/html/index.html。 当然这里root也可以写全路径,例如/home/username/tools/nginx/html,效果是一样的。 这里我们要讨论如何把一...

监控一个持续刷新的日志文件/var/log/messages,命令是什么/var/log/m...

Hostname=Zabbix_lOG以上两个参数配置对日志很重要,agent active 在发送数据给server端时,会将配置文件中的hostname的值做为一个值携带给服务端,zabbix_server收到发送过来的数据后会主动匹配这个值,是否与自己配置的主机的hostname一致,一致即接收数据,放置在数据库中。二,修改日志文件的权限通常情况下,/var/log/...

在linux服务器nginx环境下rewrite规则怎么写

document_root #当前请求在root指令中指定的值。document_uri #与uri相同。host #请求主机头字段,否则为服务器名称。hostname #Set to themachine’s hostname as returned by gethostnamehttp_HEADERis_args #如果有args参数,这个变量等于”?”,否则等于”",空值。http_user_agent #客户端agent信息http_cookie ...

nginx如何处理一个请求

这个配置中,nginx首先测试请求的IP地址和端口是否匹配某个server配置块中的listen指令配置。接着nginx继续测试请求的Host头是否匹配这个server块中的某个server_name的值。如果主机名没有找到,nginx将把这个请求交给默认虚拟主机处理。例如,一个从192.168.1.1:80端口收到的访问www.example.com的请求将被...

nginx如何不检查客户端的Expect头部

#记录主进程ID的文件pid/usr/local/nginx/nginx.pid;#一个进程能打开的文件描述符最大值,理论上该值因该是最多能打开的文件数除以进程数。但是由于nginx负载并不是完全均衡的,#所以这个值最好等于最多能打开的文件数。执行sysctl-a|grepfs.file可以看到linux文件描述符。worker_rlimit_nofile65535;...

nginx环境 index一直重定向302怎么解决

#当前请求在root指令中指定的值。document_uri #与$uri相同。host #请求主机头字段,否则为服务器名称。hostname #Set to the machine's hostname as returned by gethostname http_HEADER is_args #如果有$args参数,这个变量等于”?”,否则等于”",空值。http_user_agent #客户端agent信息 ...

怎么一台nginx做前端 多台后端用apache

1.修改nginx配置文件,将php动态请求转发给apache cat /usr/local/nginx/conf/vhosts/test.conf server { listen 80;server_name www.test.com test.com;index index.html index.htm index.php default.html default.htm default.php;root /home/www/data/test;access_log /usr/local/nginx/...

django中wsgi怎么读?

您可能需要先从安装和配置文档开始。 Basicconfiguration? 一旦您安装并激活了mod_wsgi,请编辑Apache服务器的httpd.conf文件并添加以下内容。如果你的Apache版本低于2.4,请将Requireallgranted替换成Allowfromall并在上一行添加Orderdeny,allow. WSGIScriptAlias//path/to/mysite.com/mysite/wsgi.py WSGIPythonPath/path/...

k8s-ingress控制器

kubectl get svc -n ingress-nginx 外部访问 http://www.kubetest.com:32180/hostname.html 原理相当于把规则注入到nginx配置文件中 进入ingress-nginx可以看到相关nginx配置文件配置 kubectl exec -it ingress-nginx-controller-785557f9c9-skgkw -n ingress-nginx /bin/bash 基于名称的虚拟主...

SQL*PLUS的相关命令

SQL>@ file_name我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。@与@@的区别是什么?@等于start命令,用来运行一个sql脚本文件。@命令调用当前目录下的,或指定全路径,或可以通过SQLPATH环境变量搜寻到的脚本文件。该命令使用是...

linux修改nginx配置文件 nginx的配置文件在哪 查看nginx实用的配置文件 nginx配置文件的几大模块 nginx配置文件详解 nginx默认配置文件 nginx配置文件路径 nginx主配置文件 nginx加载配置文件
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...关于创意内容的。我们要写三篇感恩教官,感恩辅导员,感恩代班学 ... ...E的定义式为E=Fq,根据此式,下列说法中正确的是( )①上式说明电场中... 温碧泉蓝皙润白精华霜的延展性怎么样? 为什么我的QQ上不能显示我在玩QQ飞车? 为什么只有耍QQ飞车的时候QQ上看不到呢 qq飞车好友上线我怎么看不到啊 在玩QQ飞车游戏时,对方QQ上不显示我正在飞车游戏中是怎么回事? 有没有传奇游戏游戏窗口化工具啊? 吻戏最多的5部剧 小型犬用不用办狗证 怎么办理 FIFA ONLINE 3 世界杯球员卡 有没有隐藏属性啊 如何在Ubuntu上通过Nginx设置HTTP认证 世界杯球星卡正下面86-99-99是什么意思 PSD的作用有哪些? 请问哪里有免费下载PS的PSD素材的网站啊?求推荐啊... 网易新闻客户端世界杯球星卡 FIFA online2 世界杯球员卡 卡希尔(澳大利亚)值钱么 如何 配置 nginx max-age fifaonline2:+3的世界杯球员卡是不是比一般的+5普... fifaonline3球员卡种类,请详解!!! fifaonline3世界杯卡会应为球员退役而消失吗?,比... 纪梵希散粉搭配什么BB霜 怎么判断传送带上摩擦力方向 一立方米钢筋等于多少吨 跪求40大最贵世界杯球员卡 纪梵希散粉色号怎么选才对? 求五个psd游戏图标 传送带上的物体它的摩擦力的方向 大家帮我的狗取个名字吧~~~ 1件钢筋的总重量是多少重 谁有PSD免费下载模板的网址 fifa+online3世界杯球员卡球员退役会删除? Nginx可以给ElasticSearch集群带来什么福利 请推荐几个psd免费下载平面素材的网站 如何配置Nginx支持TP框架的PATHINFO 中老年穿春秋裙配什么鞋好看 nginx 在哪儿添加http配置项 nginx 配置文件怎么文本匹配? 保健输液靠谱吗?有人说中老年人春秋两季保健输液予... 什么牌子的中老年春秋休闲外套男西装 中老年人夏天宜吃三七养生保健吗 5分相片是多大? 平常吃的菜市场买的大虾,和基围虾差不多大,比它... 五分相片是几寸? 苹果4S没越狱手机天天酷跑怎么边跑边录制视频 五分照片的尺寸大小 求解iPhone游戏充值失败!!它说“此项所属的App是... 百度网盘里下的软件为什么下载了不能安装?他妈人... 昆明地区所说的5分相是几寸的啊? 元气骑士作文左调左边是什么?