記一次Nginx ngx_http_substitutions_filter_module 沒法正常工做問題的解決方案

因爲項目須要使用Nginx作反向代理時,須要對源站返回的內容作一些替換,這些內容有 HTML,CSS,和JS等,Nginx自帶的ngx_http_sub_module 模塊能夠實現替換的功能,但相對於YaoWenBin開發的ngx_http_substitutions_filter_module來講,功能仍是稍弱一些:一、不支持大小寫區分;二、不支持正則表達式;三、不支持替換多個字符串(ngx_http_sub_module從1.9.4版本開始支持此功能)。javascript

但在使用ngx_http_substitutions_filter_module發現 HTML的內容能夠替換,可是JS\CSS文件卻替換不了,我將Respone Body內容複製到另一臺服務器上,而後再作反代,發現並無什麼問題,能夠正常工做。css

個人核心配置文件以下(已經設置了禁用gzip壓縮)html

location /demo/ {
		proxy_pass http://192.168.1.2
		proxy_set_header Accept-Encoding '';
		subs_filter src_string dst_string;
		subs_filter_types *;
		proxy_redirect off;
	}

排查了近兩天,嘗試過升級Nginx版本等一系列操做,並無解決個人問題。java

最後只能使用Nginx的Debug功能來排查,發現Debug的日誌以下:nginx

2016/05/20 10:47:59 [debug] 390#0: *1 http proxy header: "Content-Encoding: gzip"
2016/05/20 10:47:59 [warn] 390#0: *1 http subs filter header ignored, this may be a compressed response. while reading response header from upstream, client: 192.168.1.2, server: demo.xxxx.com, request: "GET /demo/login.js HTTP/1.1", upstream: "http://192.168.1.2:80/demo/login.js", host: "demo.xxxx.com"

日誌反映兩個問題:一、響應的HTTP HEADER中顯示內容使用GZIP格式壓縮;二、響應的內容可能時壓縮過的,http subs filter 模塊忽略,不處理!原來源站返回的JS和CSS內容仍是被壓縮了,可是我已經設置了proxy_set_header Accept-Encoding ''了啊?爲什麼返回的內容仍是壓縮的?決定使用Wireshark抓包查看底層的數據包。git

image

從數據包來看,請求的HEADER確實設置了不壓縮,但返回的內容確仍是壓縮的,看來問題出在源站的WEB服務器。github

向源站的管理員求證,獲得的結果是:JS和CSS的文件已是被壓縮過了的,因此不論請求的是否接收壓縮,返回的內容都是被壓縮的,這一點不能修改。正則表達式

源站不能修改,只能從Nginx這裏想辦法了,可是Nginx替換必須得不是解壓縮的,這就很差辦了。服務器

摸索中發現這篇文章: Nginx 反代 Gzip 內容時, sub_filter 等 content filter 無效的另外一種解決網絡

雖然多了一次請求,但更加節省網絡帶寬資源。因爲使用gunzip模塊解壓縮,只能再次從新編譯Nginx(此次排查問題,從新編譯了10次都不止啊Crying face)。

文章中採用的是unix socket的方式,但從一些網友的測試來看,並不如tcp socket穩定(Php-fpm TcpSocket vs UnixSocket),我以爲仍是採用監聽TCP端口的方式。最終的配置以下:

location /demo-gzip/ {
        proxy_pass http://192.168.1.2/;	
	gunzip on;
        allow 127.0.0.1/32;
        deny all;
}
location /demo/ {
        proxy_pass http://127.0.0.1/t5060-gzip/;			
	proxy_set_header Host demo.xxxx.com;
	proxy_set_header Accept-Encoding '';
	subs_filter src_string dst_string;
	subs_filter_types application/javascript text/css;
}
相關文章
相關標籤/搜索