nginx做反向**時,如果後端返回的response中已經有該header頭,則通過add_header後會返回給客戶端兩個同樣的header頭。
場景1:
nginxa作為反向**,nginxb作為web服務。我是拿的openresty 1.13.6.2測試的,本質上是一樣,其中a是openresty 1.15.8.1嗎,b是openresty 1.13.6.2。
測試1: add_header指令對重複指令的處理。
a的location配置如下:
server
}
nginxb的配置如下:
server
}
這種配置下,b返回給a響應時會加上乙個'server: mytestb'的header。
此時只有乙個server的 header,而且是a的openresty 版本標識。
測試1結果:
1 : nginx返回響應時,會自動在http報文裡加上了當前自己的server標識。
2: 單純的配置add_header指令時,如果response中已經有該header了,則會重複新增。
3: 通過反向**nginxa之後,a會隱藏掉b返回給自己的server header頭,並將自己的server標識返回給客戶端。
測試2: proxy_hide_header與proxy_pass_header指令對add_header有影響嗎?
說明:proxy_hide_header : nginx在做反向**時,為了隱藏上游伺服器的資訊,不會將上游的server返回給客戶端。
語法: proxy_hide_header field;
預設值: —
上下文: http, server, location
nginx預設不會將「date」、「server」、「x-pad」,和「x-accel-...」響應頭髮送給客戶端。proxy_hide_header指令則可以設定額外的響應頭,這些響應頭也不會傳送給客戶端。
proxy_pass_header:和proxy_hide_header相反,如果希望允許傳遞某些響應頭給客戶端,可以使用proxy_pass_header指令。例如: proxy_pass_header server; 則告訴nginx服務傳遞上游的server頭,而不是將它自己放在響應中。
server
}
通過a訪問b如下:
此時和測試1中的直接訪問b結果一樣。
測試2結果:1、 nginx缺省會隱藏上游返回的server 的header頭,但是可以通過pass_header_header server;來取消該限制,此時使用者會收到b返回的兩個header頭。
2、對於其他的非預設遮蔽的header頭,則nginxa會原樣透傳給使用者。如果想遮蔽某個header頭,可以通過proxy_hide_header指令。
如果在http、server、location都配置了add_header指令之後,返回給使用者的是什麼呢?
例如如下配置:
server
}
這樣的配置下,會返回給使用者什麼header呢?
答案是只會以location的為準,在server裡配置的test1並不生效。同理在http段配置的更加不會生效。 優先順序location > server > http。
1、 ngx.resp.get_headers()
對nginx a測試 ngx.resp.get_headers
-- header.lua
local json = require('cjson')
local h, err = ngx.resp.get_headers()
ngx.log(ngx.err, '-------resp header:-------', json.encode(h))
結果如下:
接著在a中加上配置項: proxy_pass_header server;
再次測試結果:
結論:
1、ngx.resp.get_headers() 只能獲取到proxy_hide_header外的header頭,如果想獲取到預設被遮蔽掉的那些header,需要用proxy_pass_header來新增。
2、 預設情況下,此api獲取到的header是乙個key-value形式,但是如果upstream返回了兩個同樣的header,lua會用陣列的形式儲存。
2、 server-tag會覆蓋server header頭
後端b換成tenginx,並且在nginx.conf中加上server-tag: mytestb
則 b返回給a的響應頭中,那個預設的server頭已經由openresty/1.13.6.1換成了 mytestb,則a再記錄日誌,返回給使用者都是zzt-server
3、 **自定義server的header頭會覆蓋nginx自帶的
後端b是golang服務,golang**裡加上server頭,則同樣可以滿足2中的效果。
關於nginx配置
通常,配置檔案可以包括伺服器監聽的埠和伺服器名稱區分的幾個server塊。當nginx決定哪個伺服器處理請求後,它會根據伺服器塊內部定義的location指令的引數測試請求頭中指定的uri。將以下location塊新增到伺服器 server 塊 該location塊指定與請求中的uri相比較的 字首...
關於Nginx理解
基礎知識 nginx由於使用了 epoll模型,要求linux的核心必須在2.6以上。要了解epoll模型,可以看看知乎上的這篇文章 io多路復用與 select,poll與epoll的關係 使用 uname a 檢視linux 核心版本,如下是centos 6.5的顯示 編譯與安裝 nginx依賴...
Nginx 關於日誌切割
nginx關於日誌切割,由於原nginx本身日誌已經上g了,對運維造成了巨大的負擔,查了網上一般都是寫指令碼,進行日誌切割,但是,原nginx中已經有可以切割日誌的配置了 一 修改nginx中的配置檔案,nginx.conf,首先對原日誌檔案中注釋掉的檔案進行釋放 然後在server中新增此段檔案,...