nginx變量的使用詳解
nginx 變量
Nginx 同 Apache 等其他 Web 服務(wù)器的配置記法不太相同,Nginx的配置文件使用語(yǔ)法的就是一門(mén)微型的編程語(yǔ)言??梢灶愃茖?xiě)程序一般編寫(xiě)配置文件,可操作性很大。既然是編程語(yǔ)言,一般也就少不了“變量”這種概念。
1、nginx變量簡(jiǎn)介
- 所有的 Nginx變量在 Nginx 配置文件中引用時(shí)都須帶上 $ 前綴
- 在 Nginx 配置中,變量只能存放一種類型的值,有且也只存在一種類型,那就是字符串類型
nginx可以使用變量簡(jiǎn)化配置與提高配置的靈活性,所有的變量值都可以通過(guò)這種方式引用:
$變量名
2、nginx 變量的定義和使用
nginx中的變量分為兩種,自定義變量與內(nèi)置預(yù)定義變量
1、自定義變量
1、聲明變量
可以在sever,http,location等標(biāo)簽中使用set命令(非唯一)聲明變量,語(yǔ)法如下
set $變量名 變量值
注意:
2、變量的可見(jiàn)性
在不同層級(jí)的標(biāo)簽中聲明的變量性的可見(jiàn)性規(guī)則如下:
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 查看模塊是否添加成功 nginx version: nginx/1.16.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --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
3、配置 $foo=hello
- nginx 中的變量必須都以$開(kāi)頭
- nginx 的配置文件中所有使用的變量都必須是聲明過(guò)的,否則 nginx 會(huì)無(wú)法啟動(dòng)并打印相關(guān)異常日志
- location標(biāo)簽中聲明的變量中對(duì)這個(gè)location塊可見(jiàn)
- server標(biāo)簽中聲明的變量對(duì)server塊以及server塊中的所有子塊可見(jiàn)
- http標(biāo)簽中聲明的變量對(duì)http塊以及http塊中的所有子塊可見(jiàn)
[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
5、 使用大括號(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
這里,我們?cè)?echo 配置指令的參數(shù)值中引用變量 first 的時(shí)候,后面緊跟著 world 這個(gè)單詞,所以如果直接寫(xiě)作 “firstworld” 則 Nginx “變量插值”計(jì)算引擎會(huì)將之識(shí)別為引用了變量 firstworld. 為了解決這個(gè)難題,Nginx 的字符串記法支持使用花括號(hào)在 之后把變量名圍起來(lái),比如這里的 ${first}。
6、變量作用域
set 指令不僅有賦值的功能,它還有創(chuàng)建 Nginx 變量的副作用,即當(dāng)作為賦值對(duì)象的變量尚不存在時(shí),它會(huì)自動(dòng)創(chuàng)建該變量。比如在上面這個(gè)例子中,如果 $a 這個(gè)變量尚未創(chuàng)建,則 set 指令會(huì)自動(dòng)創(chuàng)建 $a 這個(gè)用戶變量。如果我們不創(chuàng)建就直接使用它的值,則會(huì)報(bào)錯(cuò)。
例如
server {
...
location /bad {
echo $foo;
}
}
此時(shí) Nginx 服務(wù)器會(huì)拒絕加載配置:
[root@192 conf.d]# nginx -s reload nginx: [emerg] unknown "foo" variable nginx: configuration file /etc/nginx/nginx.conf test failed
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 配置塊。我們來(lái)看一個(gè)例子:
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]
這里我們?cè)?location /bar 中用 set 指令創(chuàng)建了變量 foo,于是在整個(gè)配置文件中這個(gè)變量都是可見(jiàn)的,因此我們可以在 location /foo 中直接引用這個(gè)變量而不用擔(dān)心 Nginx 會(huì)報(bào)錯(cuò)。
從這個(gè)例子我們可以看到,set 指令因?yàn)槭窃?location /bar 中使用的,所以賦值操作只會(huì)在訪問(wèn) /bar 的請(qǐng)求中執(zhí)行。而請(qǐng)求 /foo 接口時(shí),我們總是得到空的 foo值,因?yàn)橛脩糇兞课促x值就輸出的話,得到的便是空字符串。
從這個(gè)例子我們可以窺見(jiàn)的另一個(gè)重要特性是,Nginx 變量名的可見(jiàn)范圍雖然是整個(gè)配置,但每個(gè)請(qǐng)求都有所有變量的獨(dú)立副本,或者說(shuō)都有各變量用來(lái)存放值的容器的獨(dú)立副本,彼此互不干擾。比如前面我們請(qǐng)求了 /bar 接口后,foo 變量被賦予了值 32,但它絲毫不會(huì)影響后續(xù)對(duì) /foo 接口的請(qǐng)求所對(duì)應(yīng)的 foo 值(它仍然是空的?。?,因?yàn)楦鱾€(gè)請(qǐng)求都有自己獨(dú)立的 $foo 變量的副本。
2、內(nèi)置預(yù)定義變量
內(nèi)置預(yù)定義變量即無(wú)需聲明就可以使用的變量,通常包括一個(gè)http請(qǐng)求或響應(yīng)中一部分內(nèi)容的值,以下為一些常用的內(nèi)置預(yù)定義變量
| 變量名 | 定義 |
|---|---|
| $arg_PARAMETER | GET請(qǐng)求中變量名PARAMETER參數(shù)的值。 |
| $args | 這個(gè)變量等于GET請(qǐng)求中的參數(shù)。例如,foo=123&bar=blahblah;這個(gè)變量只可以被修改 |
| $binary_remote_addr | 二進(jìn)制碼形式的客戶端地址。 |
| $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名稱(處理請(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 | 客戶端的IP地址。 |
| $remote_port | 客戶端的端口。 |
| $remote_user | 已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶名。 |
| $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 | 客戶端請(qǐng)求主體信息的臨時(shí)文件名。 |
| $request_completion | 如果請(qǐng)求成功,設(shè)為"OK";如果請(qǐng)求未完成或者不是一系列請(qǐng)求中最后一部分則設(shè)為空。 |
| $request_method | 這個(gè)變量是客戶端請(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è)變量等于包含一些客戶端請(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ù)器名稱。 |
| $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 |
Nginx 內(nèi)置變量最常見(jiàn)的用途就是獲取關(guān)于請(qǐng)求或響應(yīng)的各種信息。
1、uri vs request_uri
由 ngx_http_core 模塊提供的內(nèi)建變量 uri,可以用來(lái)獲取當(dāng)前請(qǐng)求的 URI(不含請(qǐng)求參數(shù)),而 request_uri 則用來(lái)獲取請(qǐng)求最原始的 URI(包含請(qǐng)求參數(shù))。
server {
listen 80;
server_name localhost;
location /test-uri {
echo "uri = $uri";
echo "request_uri = $request_uri";
}
}
輸出
[root@localhost html]# nginx -s reload [root@192 conf.d]# nginx -s reload [root@192 conf.d]# curl localhost/test-uri uri = /test-uri request_uri = /test-uri [root@192 conf.d]# curl "localhost/test-uri?a=3&b=4" uri = /test-uri request_uri = /test-uri?a=3&b=4 [root@192 conf.d]# curl "localhost/test-uri/hello%20world?a=3&b=4" uri = /test-uri/hello world request_uri = /test-uri/hello%20world?a=3&b=4
2、$arg_XXX
另一個(gè)特別常用的內(nèi)建變量其實(shí)并不是單獨(dú)一個(gè)變量,而是有無(wú)限多變種的一群變量,即名字以 arg_ 開(kāi)頭的所有變量,我們估且稱之為 arg_XXX 變量群。
一個(gè)例子是 arg_name,這個(gè)變量的值是當(dāng)前請(qǐng)求中名為 name 的參數(shù)的值,而且還是未解碼的原始形式的值。
server {
listen 80;
server_name localhost;
location /test-arg {
echo "name: $arg_name";
echo "class: $arg_class";
}
}
輸出
[root@192 conf.d]# nginx -s reload [root@192 conf.d]# curl localhost/test-arg name: class: [root@192 conf.d]# curl "localhost/test-arg?name=Tom&class=3" name: Tom class: 3 [root@192 conf.d]# curl "localhost/test-arg?name=hello%20world&class=9" name: hello%20world class: 9
3、$arg_XXX 不區(qū)分大小寫(xiě)
其實(shí) $arg_name 不僅可以匹配 name 參數(shù),也可以匹配 NAME 參數(shù),抑或是 Name,Nginx 會(huì)在匹配參數(shù)名之前,自動(dòng)把原始請(qǐng)求中的參數(shù)名調(diào)整為全部小寫(xiě)的形式。
[root@192 conf.d]# curl "localhost/test-arg?NAME=Marry" name: Marry class: [root@192 conf.d]# curl "localhost/test-arg?Name=Jimmy&class=DSfef" name: Jimmy class: DSfef
nginx 監(jiān)控
1、nginx的基礎(chǔ)監(jiān)控
- 進(jìn)程監(jiān)控
- 端口監(jiān)控
注意: 這兩個(gè)是必須要加在zabbix監(jiān)控,加觸發(fā)器有問(wèn)題及時(shí)告警。
web 服務(wù)器 nginx 以其高性能與抗并發(fā)能力越來(lái)越多的被用戶使用
nginx 提供了 ngx_http_stub_status_module,ngx_http_reqstat_module模塊,這個(gè)模塊提供了基本的監(jiān)控功能
2、監(jiān)控的主要指標(biāo)
我們需要對(duì)以下主要的指標(biāo)進(jìn)行監(jiān)控:
1、基本活躍指標(biāo)
Accepts(接受)、Handled(已處理)、Requests(請(qǐng)求數(shù))是一直在增加的計(jì)數(shù)器。Active(活躍)
| 名稱 | 描述 | 指標(biāo)類型 |
|---|---|---|
| Accepts(接受) | NGINX 所接受的客戶端連接數(shù) | 資源: 功能 |
| Handled(已處理) | 成功的客戶端連接數(shù) | 資源: 功能 |
| Dropped(已丟棄,計(jì)算得出) | 丟棄的連接數(shù)(接受 - 已處理) | 工作:錯(cuò)誤* |
| Requests(請(qǐng)求數(shù)) | 客戶端請(qǐng)求數(shù) | 工作:吞吐量 |
2、每秒請(qǐng)求數(shù) – QPS
通過(guò)持續(xù)的 QPS 監(jiān)控,可以立刻發(fā)現(xiàn)是否被惡意攻擊或?qū)Ψ?wù)的可用性進(jìn)行評(píng)估。雖然當(dāng)問(wèn)題發(fā)生時(shí),通過(guò) QPS 不能定位到確切問(wèn)題的位置,但是他卻可以在第一時(shí)間提醒你環(huán)境可能出問(wèn)題了
3、服務(wù)器錯(cuò)誤率
通過(guò)監(jiān)控固定時(shí)間間隔內(nèi)的錯(cuò)誤代碼(4XX代碼表示客戶端錯(cuò)誤,5XX代碼表示服務(wù)器端錯(cuò)誤),可以了解到客戶端收到的結(jié)果是否是正確的錯(cuò)誤率突然的飆升很可能是你的網(wǎng)站漏洞發(fā)出的信號(hào)
如果你希望通過(guò) access log 分析錯(cuò)誤率,那么你需要配置 nginx 的日志模塊,讓 nginx 將響應(yīng)碼寫(xiě)入訪問(wèn)日志
3、指標(biāo)的收集
通過(guò)在編譯時(shí)加入 nginx 的 ngx_http_stub_status_module 模塊我們可以實(shí)時(shí)監(jiān)控以下基本的指標(biāo):
1、nginx Stub Status 監(jiān)控模塊安裝
先使用命令查看是否已經(jīng)安裝這個(gè)模塊:
# -V大寫(xiě)會(huì)顯示版本號(hào)和模塊等信息、v小寫(xiě)僅顯示版本信息 [root@localhost ~]# nginx -V
如果沒(méi)有此模塊,需要重新安裝,編譯命令如下:
./configure –with-http_stub_status_module
具體的使用方法是在執(zhí)行 ./configure 時(shí),指定 --with-http_stub_status_module,然后通過(guò)配置:
server {
listen 80;
server_name localhost;
location /nginx-status {
stub_status on;
access_log on;
}
}
2、nginx 狀態(tài)查看
配置完成后在瀏覽器中輸入http://10.0.105.207/nginx-status 查看
(或者用 curl localhost/nginx-status),顯示信息如下:
Active connections: 2 server accepts handled requests 26 26 48 Reading: 0 Writing: 1 Waiting: 1
3、Stub Status 參數(shù)說(shuō)明
正常情況下waiting數(shù)量是比較多的,并不能說(shuō)明性能差。如果reading+writing數(shù)量比較多說(shuō)明服務(wù)并發(fā)有問(wèn)題。
Active connections:2 #當(dāng)前nginx處理請(qǐng)求的數(shù)目(活躍的連接數(shù)) server accepts handled requests 26 26 48
nginx總共處理了26個(gè)連接,成功創(chuàng)建26次握手,也就是成功的連接數(shù)connection. 總共處理了48個(gè)請(qǐng)求
失敗連接=(總連接數(shù)-成功連接數(shù))(相等表示中間沒(méi)有失敗的),
5、Reqstat 模塊監(jiān)控 ----已經(jīng)不支持了(需要導(dǎo)入)
描述
- ngx_http_reqstat_module 模塊
- 這個(gè)模塊計(jì)算定義的變量,根據(jù)變量值分別統(tǒng)計(jì) nginx 的運(yùn)行狀況。
- 可以監(jiān)視的運(yùn)行狀況有:連接數(shù)、請(qǐng)求數(shù)、各種響應(yīng)碼范圍的請(qǐng)求數(shù)、輸入輸出流量、rt、upstream訪問(wèn)等。
- 可以指定獲取所有監(jiān)控結(jié)果或者一部分監(jiān)控結(jié)果。
- 利用變量添加自定義監(jiān)控狀態(tài)??偟谋O(jiān)控狀態(tài)最大個(gè)數(shù)為50個(gè)。
- 回收過(guò)期的監(jiān)控?cái)?shù)據(jù)。
- 設(shè)置輸出格式
- 跟蹤請(qǐng)求,不受內(nèi)部跳轉(zhuǎn)的影響
- 不要使用與響應(yīng)相關(guān)的變量作為條件,比如"$status"
現(xiàn)在通過(guò)ngx_req_status_module能夠統(tǒng)計(jì)Nginx中請(qǐng)求的狀態(tài)信息。需要安裝第三方模塊
安裝模塊:
tengine官方說(shuō)req-status模塊默認(rèn)安裝。但是并沒(méi)有。從github引入第三方模塊解決該問(wèn)題
yum與編譯安裝的nginx擴(kuò)展模塊安裝:
[root@nginx-server ~]# yum install -y unzip
1. 安裝,先查看一下當(dāng)前編譯安裝nginx的版本
[root@localhost nginx-1.16.0]# nginx -V
下載或者上傳一個(gè)和當(dāng)前的nginx版本一樣的nginx的tar包。
[root@nginx-server ~]# tar xzf nginx-1.16.0.tar.gz -C /usr/local/
2.下載ngx_req_status_module 模塊, 這是第三方模塊需要添加
[root@nginx-server ~]# wget https://github.com/zls0424/ngx_req_status/archive/master.zip -O ngx_req_status.zip
[root@nginx-server ~]# unzip ngx_req_status.zip
[root@nginx-server ~]# cp -r ngx_req_status-master/ /usr/local/ #與解壓的nginx在同一級(jí)目錄下
[root@nginx-server ~]# cd /usr/local/nginx-1.16.0/
[root@nginx-server nginx-1.16.0]# yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++ zlib zlib-devel
[root@nginx-server nginx-1.16.0]# yum -y install patch.x86_64
[root@nginx-server nginx-1.16.0]# patch -p1 < ../ngx_req_status-master/write_filter-1.7.11.patch
[root@localhost nginx-1.16.0]# ./configure 添加上原來(lái)的參數(shù) --add-module=/usr/local/ngx_req_status-master
[root@localhost nginx-1.16.0]# make
由于原先已有nginx,所以不能執(zhí)行make install,否則會(huì)覆蓋掉以前的配置文件及內(nèi)容
[root@localhost nginx-1.16.0]# mv /usr/sbin/nginx /usr/sbin/nginx_bak
[root@localhost nginx-1.16.0]# cp objs/nginx /usr/sbin/
[root@localhost nginx-1.16.0]# systemctl restart nginx
[root@localhost nginx-1.16.0]# nginx -V
如果發(fā)現(xiàn)編譯的配置文件有變化就成功了!
配置如下: 需要在http里面配置。
[root@localhost ~]# vim /etc/nginx/nginx.conf
req_status_zone server_name $server_name 256k;
req_status_zone server_addr $server_addr 256k;
req_status_zone server_url $server_name$uri 256k;
req_status server_name server_addr server_url;
server {
server_name localhost;
location /req-status {
req_status_show on;
}
}
指令介紹
req_status_zone
語(yǔ)法: req_status_zone name string size
默認(rèn)值: None
配置塊: http
定義請(qǐng)求狀態(tài)ZONE,請(qǐng)求按照string分組來(lái)排列,例如:
req_status_zone server_url $server_name$uri 256k;
域名+uri將會(huì)形成一條數(shù)據(jù),可以看到所有url的帶寬,流量,訪問(wèn)數(shù)
req_status
語(yǔ)法: req_status zone1[ zone2]
默認(rèn)值: None
配置塊: http, server, location
在location中啟用請(qǐng)求狀態(tài),你可以指定更多zones。
req_status_show
語(yǔ)法: req_status_show on
默認(rèn)值: None
配置塊: location
在當(dāng)前位置啟用請(qǐng)求狀態(tài)處理程序
請(qǐng)求狀態(tài)信息包括以下字段:
- zone_name - 利用req_status_zone定義的分組標(biāo)準(zhǔn)。例如,按照服務(wù)器名稱對(duì)請(qǐng)求進(jìn)行分組后;
- key - 請(qǐng)求按分組標(biāo)準(zhǔn)分組后的分組標(biāo)識(shí)(即組名)。例如按服務(wù)器名稱分組時(shí),組名可能是localhost;
- max_active - 該組的最大并發(fā)連接數(shù);
- max_bw - 該組的最大帶寬;
- traffic - 該組的總流量;
- requests - 該組的總請(qǐng)求數(shù);
- active - 該組當(dāng)前的并發(fā)連接數(shù);
- bandwidth - 該組當(dāng)前帶寬。
6、補(bǔ)充(擴(kuò)展):
nginx access log 分析
nginx 的 access log 中可以記錄很多有價(jià)值的信息,通過(guò)分析 access log,可以收集到很多指標(biāo)
1.制作nginx的日志切割,每天凌晨切割并壓縮。
- PV:PV(訪問(wèn)量): 即Page View, 即頁(yè)面瀏覽量或點(diǎn)擊量,用戶每次刷新即被計(jì)算一次。
- UV:UV(獨(dú)立訪客):即Unique Visitor,訪問(wèn)您網(wǎng)站的一臺(tái)電腦客戶端為一個(gè)訪客。00:00-24:00內(nèi)相同的客戶端只被計(jì)算一次。
工作常用(面試題筆試):
1.根據(jù)訪問(wèn)IP統(tǒng)計(jì)UV
awk '{print $1}' access.log|sort | uniq -c |wc -l
2.統(tǒng)計(jì)訪問(wèn)URL統(tǒng)計(jì)PV
awk '{print $7}' access.log|wc -l
3.查詢?cè)L問(wèn)最頻繁的URL
awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more
4.查詢?cè)L問(wèn)最頻繁的IP
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
5.查詢?cè)L問(wèn)最頻繁的前10的IP
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|head -n 10
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Nginx中多種負(fù)載均衡策略配置的實(shí)戰(zhàn)指南
在當(dāng)今高并發(fā)、大流量的互聯(lián)網(wǎng)應(yīng)用中,單臺(tái)服務(wù)器往往難以承受巨大的訪問(wèn)壓力,負(fù)載均衡作為解決這一問(wèn)題的關(guān)鍵技術(shù),能夠?qū)⒄?qǐng)求分發(fā)到多臺(tái)服務(wù)器上,本文將深入探討Nginx負(fù)載均衡的各種策略和配置方法,大家可以根據(jù)需要進(jìn)行選擇2025-10-10
Windows Server 2016 MySQL數(shù)據(jù)庫(kù)安裝配置詳細(xì)安裝教程
這篇文章主要介紹了Windows Server 2016 MySQL數(shù)據(jù)庫(kù)安裝配置詳細(xì)安裝教程,需要的朋友可以參考下2017-08-08
Nginx?Rewrit實(shí)現(xiàn)網(wǎng)頁(yè)跳轉(zhuǎn)功能詳細(xì)步驟
Rewrite主要實(shí)現(xiàn)url地址重寫(xiě),以及重定向,就是把傳入web的請(qǐng)求重定向到其他url的過(guò)程,這篇文章主要介紹了Nginx?Rewrit實(shí)現(xiàn)網(wǎng)頁(yè)跳轉(zhuǎn)功能詳細(xì)步驟,需要的朋友可以參考下2024-02-02
Nginx配置文件nginx.conf的基本配置實(shí)例詳解
Nginx(engine x)是一個(gè)輕量級(jí)的高性能的HTTP和反向代理web服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,下面這篇文章主要給大家介紹了關(guān)于Nginx配置文件nginx.conf基本配置的相關(guān)資料,需要的朋友可以參考下2022-09-09
Keepalived搭建nginx高可用的實(shí)現(xiàn)
這篇文章主要介紹了Keepalived搭建nginx高可用的實(shí)現(xiàn),通過(guò)VIP實(shí)現(xiàn)主備切換,檢測(cè)進(jìn)程狀態(tài)確保服務(wù)可用,具有一定的參考價(jià)值,感興趣的可以了解一下2025-05-05

