1、nginx的變數問題"$1"是如何定義的
結果不完全相同。
$1表示前面()之內的內容。
最後一個問題,結果變成一個.html
只匹配()裡面的。
2、nginx配置文件中怎麼把hostname的值賦給其它變數
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 變數的生命期是不可能跨越請求邊界的。
3、怎麼查看nginx有哪些內置變數
內置變數存放在 ngx_http_core_mole 模塊中,變數的命名方式和apache
伺服器變數是一致的。總而專言之,這些變數代表著屬客戶端請求頭的內容,例如$http_user_agent, $http_cookie,
等等。
下面是nginx支持的所有內置變數:
$arg_name
請求中的的參數名,即「?」後面的arg_name=arg_value形式的arg_name
$args
請求中的參數值
$binary_remote_addr
客戶端地址的二進制形式, 固定長度為4個位元組
4、Nginx 哪些指令可以使用自定義變數
您好,很高興為您復解答。
可以參制考:http://bbs.linuxtone.org/thread-17313-1-1.html
如若滿意,請點擊右側【採納答案】,如若還有問題,請點擊【追問】
希望我的回答對您有所幫助,望採納!
~ O(∩_∩)O~
5、如何跟蹤nginx配置文件里的變數
nginx模塊一般被分成三大類:handler、filter和upstream。前面的章節中,讀者已經了解了handler、filter。利用這兩類模塊內,可以使nginx輕松容完成任何單機工作。而本章介紹的upstream模塊,將使nginx跨越單機的限制,完成網路數據的接收、處理和轉..
6、nginx匹配URL中包含theme的樣式設置為theme_src $second_path變數
使用函數
對模板變數使用函數
模板引擎支持對輸出的變數做格式化處理,也就是使用函數,並且支持多個函數
7、nginx里如何修改變數中指定字元
需求是這樣,提取出nginx日誌中,GET或者POST的數據中,名稱為』shell』欄位的數據
nginx日誌的format配置:
'$proxy_add_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $request_body "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';
nginx日誌實際的內容,大致如下:
61.164.xxx.xxx, 10.16.xx.x – - [13/Aug/2014:00:00:02 +0800] 「GET /xxx/xxx?stepid=32&tid=U%2Bo3c0S&&output=json&language=zh_CN&session=114047349&dip=10920&diu=00343B30-9EB8-4B43-A978-FF838587E989&diu3=e9c3afaa4134d678&dia=8E72-1B19E16C0B8E&shell=&compress=false&channel=&adcode=310000&pagenum=1&pagesize=10&sign= HTTP/1.1″ 200 4382 「-」 「xxx-iphone」 「61.164.xxx.xxx」 0.204
或
218.202.xxx.xxx, 123.103.xxx.xxx, 10.16.xxx.xxx – - [2014-08-19 22:17:08.446671] 「POST /xxx/xxx-web/xxx HTTP/1.1″ 200 stepid=15&tid=U753HifVPE0DAOn%2F&output=json&language=zh_CN&session=114099628&dip=10920&diu=DBDBF926-3210-4D64-972A7&xxx=056a849c70ae57560440ebe&diu2=2DFDB167-1505-4372-AAB5-99D28868DCB5&shell=&compress=false&channel=&sign=&wua=0&appkey=0&adcode=150700&t=0 「-」 「xxx-iphone」 「218.202.xxx.xxx, 123.103.xxx.xxx」 0.001 20.001
grep -P 'shell' access.log | sed 's/\(.*\)&shell=\(.*\)&\(.*\)/\2/g' | awk -F '&' '{print $1}' > output.txt
命令解釋:
grep -P 'shell' access.log
#在日誌文件中找到有』shell』 關鍵字的數據行
sed 's/\(.*\)&shell=\(.*\)&\(.*\)/\2/g'
#sed使用正則表達式查找,希望將每行日誌分成三個組,』&shell=』之前一組,』&shell=』和shell值和之後的&之間作為第二組,之後的字元串作為第3組,\2代表第二組,用第二組替換整個字元串。但是,sed的正則表達式是貪婪模式,實際的第3組是最後一個&後的字元串
awk -F '&' '{print $1}'
#用&將字元串split,輸出第一個結果
Shell腳本命令眾多,非常靈活,解決方法還有很多。這個不是最優方法,也不十分嚴格,如果作為重要腳本命令,還需要更多完善。存在的問題:shell關鍵在日誌中如果不唯一,將導致拆分的結果是錯誤的。
#注意點:sed的正則表達式是貪婪模式
8、nginx怎麼取變數里的i
在upstream中使用nginx變數的方法
操作流程是:
1. 創建upstream數據結構。
if (ngx_http_upstream_create(r) != NGX_OK) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
2. 設置模塊的tag和schema。schema現在只會用於日誌,tag會用於buf_chain管理。
u = r->upstream;
ngx_str_set(&u->schema, "memcached://");
u->output.tag = (ngx_buf_tag_t) &ngx_http_memcached_mole;
3. 設置upstream的後端伺服器列表數據結構。
mlcf = ngx_http_get_mole_loc_conf(r, ngx_http_memcached_mole);
u->conf = &mlcf->upstream;
4. 設置upstream回調函數。在這里列出的代碼稍稍調整了代碼順序。
u->create_request = ngx_http_memcached_create_request;
u->reinit_request = ngx_http_memcached_reinit_request;
u->process_header = ngx_http_memcached_process_header;
u->abort_request = ngx_http_memcached_abort_request;
u->finalize_request = ngx_http_memcached_finalize_request;
u->input_filter_init = ngx_http_memcached_filter_init;
u->input_filter = ngx_http_memcached_filter;
5. 創建並設置upstream環境數據結構。
ctx = ngx_palloc(r->pool, sizeof(ngx_http_memcached_ctx_t));
if (ctx == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
ctx->rest = NGX_HTTP_MEMCACHED_END;
ctx->request = r;
ngx_http_set_ctx(r, ctx, ngx_http_memcached_mole);
u->input_filter_ctx = ctx;
6. 完成upstream初始化並進行收尾工作。
r->main->count++;
ngx_http_upstream_init(r);
return NGX_DONE;
9、請問Nginx下如何綁定泛域名
原理:一個nginx可以再配置文件中使用導出的變數。其中$host變數就是指的Y.XXX.com,因此直接使用$host變數就可以了。如下,就可以使用一個server把所有的請求指定到不同的目錄下。
實現方法:
http {