深入Nginx之《常用變量配置技巧》
1、$arg_name
舉例:請求默認去a服務,如果URL中參數是 at=5 的請求,就去b服務:
location / {
if ($arg_at=‘5‘) {
proxy_pass http://b;
}
proxy_pass http://a;
}
2、$body_bytes_sent 和 $bytes_sent
這2個變量的值,指存在http響應頭大小的差異,如果2個值結果非常懸殊,那麽響應頭就輸出了很大的內容,需要確保Nginx的proxy_buffer有關的大小合適,如果超過了proxy_buffer有關的默認值,這個時候error.log會顯示:
2017/11/24 11:49:06 [error] 8376#0: *28071 upstream sent too big header while reading response header from upstream,
讀者可以嘗試修改如下參數來解決,具體的值,請評估自身的需求:
proxy_buffers 4 256k;
proxy_buffer_size 128k;
proxy_busy_buffers_size 256k;
3、$realip_remote_addr
Nginx1.9.7加入的變量,通過realip模塊操作過後的$remote_addr會變成客戶端的IP,從而避免獲得和Nginx直連的代理服務器IP(比如CDN的加速服務器IP),通過此變量就可以獲得直連Nginx服務器的ip了。
4、$request_time 和 $upstream_response_time
$upstream_response_time表示的是後端的響應能力;
$request_time包含了請求全部發送出去的時間,因此包含了整個網絡傳輸時間。如果要檢查後端的服務性能快慢,需要使用$upstream_response_time的值。
5、$uri 和 $request_uri
$uri 記錄了在內部做了rewrite等一些列的內部重定向後的最終請求到上遊服務器得URL(不包含參數$args的值),$request_uri是記錄的當前請求的原始URL(包含了參數),(如果沒有做內部重定向操作,$request_uri去掉參數後就和$uri一樣的)。在線上排查問題時,有些時候後端看到的請求和Nginx中存放的$request_uri無法匹配,這種情況下,就需要考慮應該在 $uri裏面進行搜尋。
6、$scheme
近幾年https非常的流行,很多互聯網企業都將http請求切換到了https,用戶手動輸入網站的時候,很少會主動加上https:// ,所以為了將用戶跳轉到https,我們需要知道用戶是請求的是http還是https。$scheme 就可以知道用戶訪問的是https還是http,並且通過rewrite跳轉到https。
if ($scheme = ‘http‘) {
rewrite ^/(.*)$ https://$host/$1 redirect;
}
深入Nginx之《常用變量配置技巧》