天天看點

Tengine 中 ngx_http_accesskey 在反向代理中 如何和HTTP_PROXY配合使用

場景:有一tengine的反向代理,主要反向代理到幾個後端伺服器上,後端伺服器提供數千萬的圖檔檔案,衆所周知的原因,圖檔是很容易被盜鍊的,而使用refer來反盜鍊的話,一是可以僞造refer,另一個是 衆多合作網站需要來調用圖檔,需要手動添加refer,是以決定使用nginx_accesskey子產品來實作。

1 tengine中新增nginx_accesskey子產品。

   不得不說tengine的DSO功能真的很爽,如果一個線上的伺服器需要新增個子產品進來的話,為了減少重編譯nginx,采用Tengine來操作 可以将子產品直接編譯成.so動态加載給nginx。

至此,将ngx_http_accesskey_module.so編譯并複制到了 tengine的dso目錄下。

修改nginx.conf 

  添加 lodad ngx_http_accesskey_module.so;

ngx_http_accesskey變動态加載到tengine中。

2 如何使用ngx_http_accesskey 實作防盜鍊

在server段的某一個location中添加如下:

比如

這個時候  如果你通路

http://p_w_picpath.xxx.com/mmm/nnn/test.gif

會看到 報出403錯誤 沒有權限通路。

如何正常來通路這個圖檔呢?

如果某一個客戶的ip位址是 192.168.0.1 

那麼 dasiyebushuo192.168.0.1的md5為b49eeb993eaf25edfeca43bdaf07c541

正常通路這個圖檔的方法是

http://p_w_picpath.xxx.com/mmm/nnn/test.gif?key=b49eeb993eaf25edfeca43bdaf07c541

頁面裡調用圖檔的方法 隻需要把dasiyebushuo$remoteip 計算一下md5然後作為key的參數來通路即可,

說明:

 accesskey             on;   是否啟用accesskey 防盜鍊

 accesskey_hashmethod  md5;  采用md5來hash參數,可以選hash或md5

 accesskey_arg         "key";參數名,如果你設定為site 那麼就是xxx.gif?site= 如果設定為key 就是xxx.gif?key=

 accesskey_signature   "dasiyebushuo$remote_addr"; 具體用什麼來hash 可以是客戶IP 可以是cookie nginx的内置變量均可,通常采用remote_addr,也可以用cookie來hash;dasiyebushuo  擾亂用的,如果你用客戶iphash  别人也可以吧客戶的iphash出來送出就管道圖檔了,如果你在客戶的ip前面加一個串一起來hash 除非别人猜出來用的什麼

3 在http_proxy 反向代理中如何使用ngx_http_accesskey_module

nginx的三方子產品很多,但是想讓這些子產品都一起來配合工作就不一定了。比如如果你的nginx是一個反向代理的圖檔前端伺服器,采用nginx-accesskey 後比如配置為

location ~*\.(gif)$

        {

        expires 7d;

        accesskey             on;

        accesskey_hashmethod  md5;

        accesskey_arg         "site";

        accesskey_signature   "dasiyebushuo$remote_addr";

        proxy_cache_valid 200 304 5d;

        proxy_cache_valid 301 302 30m;

        proxy_cache_valid any 30m;

        proxy_cache_key $host$uri$is_args$args;

        proxy_set_header Host pic1.xxxx.com;

        proxy_set_header X-forwarded-For $remote_addr;

        proxy_pass http://pic.xxxx.com_server_pool;

}

我們以為這樣就可以了,結果發現 在通路圖檔的時候,無論你加不加?site=b49eeb993eaf25edfeca43bdaf07c541 圖檔都出的來,  accesskey 完全沒有起作用。非常郁悶。

nginx有個神奇的功能 404重定向,ok 思路換一下,先讓我們到本地去找檔案(由于是反向代理,實際上任何通路的圖檔都不在nginx上 而是在後端伺服器上,那麼隻有1種情況,就是通路會傳回404,利用accesskey子產品先來驗證使用者的請求對不對,如果沒有加?site==b49eeb993eaf25edfeca43bdaf07c541或者 ?site=md5(dasiyebushuo$remote_addr)傳入的不對,恩 是盜鍊 則直接傳回403!如果是對了呢?對了就去/var/www/給你找這個檔案,當然了,找不到賽,是以是個404,我們把404直接定向到@fallback這一段去處理。

然後在@fallback這段裡 我們直接proxy_pass到後端去。修改後的配置如下:

測試後發現這樣可行

繼續閱讀