1风瘦、變量的分類(lèi)及使用
- 所有的 Nginx變量在 Nginx 配置文件中引用時(shí)都須帶上 $ 前綴
- 在 Nginx 配置中送丰,變量只能存放一種類(lèi)型的值,有且也只存在一種類(lèi)型弛秋,那就是字符串類(lèi)型
- nginx可以使用變量簡(jiǎn)化配置與提高配置的靈活性器躏,所有的變量值都可以通過(guò)這種方式引用
nginx中的變量分為兩種,自定義變量與內(nèi)置預(yù)定義變量
(1)自定義變量
可以在sever,http,location等標(biāo)簽中使用set命令(非唯一)聲明變量蟹略,語(yǔ)法如下
set $變量名 變量值
注意:
- nginx 中的變量必須都以$開(kāi)頭
- nginx 的配置文件中所有使用的變量都必須是聲明過(guò)的登失,否則 nginx 會(huì)無(wú)法啟動(dòng)并打印相關(guān)異常日志
變量的可見(jiàn)性
在不同層級(jí)的標(biāo)簽中聲明的變量性的可見(jiàn)性規(guī)則如下:
- location標(biāo)簽中聲明的變量中對(duì)這個(gè)location塊可見(jiàn)
- server標(biāo)簽中聲明的變量對(duì)server塊以及server塊中的所有子塊可見(jiàn)
- http標(biāo)簽中聲明的變量對(duì)http塊以及http塊中的所有子塊可見(jiàn)
nginx安裝echo模塊
查看已經(jīng)安裝的nginx的版本
[root@192 ~]# nginx -V
下載echo模塊的安裝包
[root@192 ~]# wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
[root@192 ~]# ls
anaconda-ks.cfg nginx-1.16.0.tar.gz v0.61.tar.gz
解壓到相同路徑下:
[root@192 ~]# tar xzf nginx-1.16.0.tar.gz -C /usr/local/
[root@192 ~]# tar xzf v0.61.tar.gz -C /usr/local/
安裝編譯工具
[root@192 ~]# cd /usr/local/
[root@192 local]# yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++ zlib zlib-devel
添加模塊:
[root@192 local]# cd nginx-1.16.0/
添加上原來(lái)已經(jīng)有的參數(shù)和新添加的模塊:
[root@192 nginx-1.16.0]# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie' --add-module=/usr/local/echo-nginx-module-0.61
[root@192 nginx-1.16.0]# make #編譯,不要make install 否則會(huì)覆蓋原來(lái)的文件
[root@192 nginx-1.16.0]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak2 #將原來(lái)的nignx備份
[root@192 nginx-1.16.0]# cp objs/nginx /usr/local/nginx/sbin/ 拷貝nignx
[root@192 nginx-1.16.0]# /usr/local/nginx/sbin/nginx #啟動(dòng)
[root@192 nginx-1.16.0]# nginx -V 查看模塊是否添加成功
示例1
[root@192 ~]# cd /etc/nginx/conf.d/
[root@192 conf.d]# vim echo.conf
server {
listen 80;
server_name localhost;
location /test {
set $foo hello;
echo "foo: $foo";
}
}
[root@192 conf.d]# nginx -s reload
[root@192 conf.d]# curl localhost/test
foo: hello
示例2
使用大括號(hào)插值
在“變量插值”的上下文中挖炬,還有一種特殊情況揽浙,即當(dāng)引用的變量名之后緊跟著變量名的構(gòu)成字符時(shí)(比如后跟字母、數(shù)字以及下劃線)意敛,我們就需要使用特別的記法來(lái)消除歧義
server {
listen 80;
server_name localhost;
location /test-brace {
set $first "hello ";
echo "${first}world";
}
}
[root@192 conf.d]# nginx -s reload
[root@192 conf.d]# curl localhost/test-brace
hello world
變量作用域
Nginx 變量的創(chuàng)建和賦值操作發(fā)生在全然不同的時(shí)間階段馅巷,Nginx 變量的創(chuàng)建只能發(fā)生在 Nginx 配置加載的時(shí)候,或者說(shuō) Nginx 啟動(dòng)的時(shí)候草姻,而賦值操作則只會(huì)發(fā)生在請(qǐng)求實(shí)際處理的時(shí)候钓猬。
這意味著不創(chuàng)建而直接使用變量會(huì)導(dǎo)致啟動(dòng)失敗,同時(shí)也意味著我們無(wú)法在請(qǐng)求處理時(shí)動(dòng)態(tài)地創(chuàng)建新的 Nginx 變量撩独。
Nginx 變量一旦創(chuàng)建敞曹,其變量名的可見(jiàn)范圍就是整個(gè) Nginx 配置,甚至可以跨越不同虛擬主機(jī)的 server 配置塊综膀。
server {
listen 80;
server_name localhost;
location /foo {
echo "foo = [$foo]";
}
location /bar {
set $foo 32;
echo "foo = [$foo]";
}
}
[root@192 conf.d]# curl 'http://localhost/foo'
foo = []
[root@192 conf.d]# curl 'http://localhost/bar'
foo = [32]
(2)內(nèi)置預(yù)定義
*變量名* *定義*
$arg_PARAMETERGET 請(qǐng)求中變量名PARAMETER參數(shù)的值澳迫。
$args 這個(gè)變量等于GET請(qǐng)求中的參數(shù)。例如剧劝,
foo=123&bar=blahblah;這個(gè)變量只可以被修改
$binary_remote_addr 二進(jìn)制碼形式的客戶(hù)端地址橄登。
$body_bytes_sent 傳送頁(yè)面的字節(jié)數(shù)
$content_length 請(qǐng)求頭中的Content-length字段。
$content_type 請(qǐng)求頭中的Content-Type字段。
$cookie_COOKIE cookie COOKIE的值拢锹。
$document_root 當(dāng)前請(qǐng)求在root指令中指定的值谣妻。
$document_uri 與$uri相同。
$host 請(qǐng)求中的主機(jī)頭(Host)字段面褐,如果請(qǐng)求中的主機(jī)頭
不可用或者空,則為處理請(qǐng)求的server名稱(chēng)(處理請(qǐng)
求的server的server_name指令的值)取胎。值為小寫(xiě)展哭,
不包含端口。
$hostname 機(jī)器名使用 gethostname系統(tǒng)調(diào)用的值
$http_HEADER HTTP請(qǐng)求頭中的內(nèi)容闻蛀,HEADER為HTTP請(qǐng)求中的
內(nèi)容轉(zhuǎn)為小寫(xiě)匪傍,-變?yōu)開(kāi)(破折號(hào)變?yōu)橄聞澗€),例如:
$http_user_agent(Uaer-Agent的值);
$sent_http_HEADER HTTP響應(yīng)頭中的內(nèi)容觉痛,HEADER為HTTP響應(yīng)中的
內(nèi)容轉(zhuǎn)為小寫(xiě)役衡,-變?yōu)開(kāi)(破折號(hào)變?yōu)橄聞澗€),例如:
$sent_http_cache_control,
$sent_http_content_type…;
$is_args 如果$args設(shè)置薪棒,值為"?"手蝎,否則為""。
$limit_rate 這個(gè)變量可以限制連接速率俐芯。
$nginx_version 當(dāng)前運(yùn)行的nginx版本號(hào)棵介。
$query_string 與$args相同。
$remote_addr 客戶(hù)端的IP地址吧史。
$remote_port 客戶(hù)端的端口邮辽。
$remote_user 已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶(hù)名。
$request_filename 當(dāng)前連接請(qǐng)求的文件路徑贸营,由root或alias指令與
URI請(qǐng)求生成吨述。
$request_body 這個(gè)變量(0.7.58+)包含請(qǐng)求的主要信息。在使
用proxy_pass或fastcgi_pass指令的location中比較
有意義钞脂。
$request_body_file 客戶(hù)端請(qǐng)求主體信息的臨時(shí)文件名揣云。
$request_completion 如果請(qǐng)求成功,設(shè)為"OK"冰啃;如果請(qǐng)求未完成或者不
是一系列請(qǐng)求中最后一部分則設(shè)為空灵再。
$request_method 這個(gè)變量是客戶(hù)端請(qǐng)求的動(dòng)作,通常為GET或
POST亿笤。包括0.8.20及之前的版本中翎迁,這個(gè)變量總
為main request中的動(dòng)作,如果當(dāng)前請(qǐng)求是一個(gè)子
請(qǐng)求净薛,并不使用這個(gè)當(dāng)前請(qǐng)求的動(dòng)作汪榔。
$request_uri 這個(gè)變量等于包含一些客戶(hù)端請(qǐng)求參數(shù)的原始
URI,它無(wú)法修改,請(qǐng)查看$uri更改或重寫(xiě)URI痴腌。
$scheme 所用的協(xié)議雌团,比如http或者是https,比如rewrite
^(.+)$ $scheme://example.com$1 redirect;
$server_addr 服務(wù)器地址士聪,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)
值锦援,如果要繞開(kāi)系統(tǒng)調(diào)用,則必須在listen中指定地
址并且使用bind參數(shù)剥悟。
$server_name 服務(wù)器名稱(chēng)灵寺。
$server_port 請(qǐng)求到達(dá)服務(wù)器的端口號(hào)。
$server_protocol 請(qǐng)求使用的協(xié)議区岗,通常是HTTP/1.0或HTTP/1.1略板。
$uri 請(qǐng)求中的當(dāng)前URI(不帶請(qǐng)求參數(shù),參數(shù)位于args慈缔,不
同于瀏覽器傳遞的args)叮称,不同于瀏覽器傳遞的
request_uri的值,它可以通過(guò)內(nèi)部重定向藐鹤,或者使用
index指令進(jìn)行修改瓤檐。不包括協(xié)議和主機(jī)名,例
如/foo/bar.html