VeryNginx詳細配置說明


自定義行為 ( Custom Action )

匹配器 (Matcher)

匹配器

VeryNginx 會收到各種各樣的Http請求,當我們定義一條規則(Action)的時候,我們可能會需要限定,這條規則只對一部分請求起作用,Matcher 就是匹配器,用來描述哪一部分 Http 請求是規則的目標。

一個 Matcher 可以包含一個或者多個約束條件,當某個請求沒有違背 Matcher 中任何一條約束時,就認為這個請求匹配上了這個Matcher。

如果Matcher是空的,即沒有包含任何條件,那么這個Matcher會匹配上所有的請求

目前支持以下幾種約束:

Client IP

客戶端IP,對應Nginx變量 remote_addr

支持的匹配方式:

  • 等於某個IP
  • 不等於某個IP

Host

客戶訪問時使用的域名,對應Nginx變量 host

支持的匹配方式:

  • 等於某個字符串
  • 不等於某個字符串
  • 符合某個正則表達式
  • 不符合某個正則表達式

UserAgent

用戶瀏覽器的UserAgent字段,對應Nginx變量 http_user_agent

一些通過工具發起的請求可能會有特別的UserAgent,或者沒有這個字段,也可能偽造成普通的瀏覽器

支持的匹配方式:

  • 等於某個字符串
  • 不等於某個字符串
  • 符合某個正則表達式
  • 不符合某個正則表達式
  • 為空,即Http頭中沒有這個字段

URI

請求路徑,對應Nginx中的變量 uri ,表示訪問地址中域名之后的部分

例如訪問 http://www.abc.com/test/book.html 時,uri值為 /test/book.html

支持的匹配方式:

  • 等於某個字符串
  • 不等於某個字符串
  • 符合某個正則表達式
  • 不符合某個正則表達式

Referer

請求來源網頁,對應Nginx中的變量 http_referer ,表示訪問者的來源頁面。

支持的匹配方式:

  • 等於某個字符串
  • 不等於某個字符串
  • 符合某個正則表達式
  • 不符合某個正則表達式
  • 為空,即Http頭中沒有這個字段

Request Args

請求參數匹配

VeryNginx可以智能的從uri字符串后面,以及請求體(body)內提取參數的值

注:目前只支持在請求的content-type為application/x-www-form-urlencoded時,從請求體內提取參數

這個條件可以輸入兩個字段,name 和 value。name是可選的,如果輸入name,則只把符合name條件的參數值和value作匹配;如果不輸入name,就會把所有的參數值拿來和value進行匹配

支持的匹配方式:

  • 等於某個字符串
  • 不等於某個字符串
  • 符合某個正則表達式
  • 不符合某個正則表達式

行為 (Action)

協議鎖定 CustomAction: Scheme Lock

功能介紹

協議鎖定功能可以確保用戶訪問時使用正確的協議 ( Http / Https )

背景知識

Matcher

配置說明

可以定義多條規則,每條規則包含以下參數

  • Enable
  • Matcher
  • Scheme

執行過程

尋找規則

每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配

應用規則

當Http請求使用的訪問協議和規則中的 scheme 項不一致時,將自動返回一個302重定向,將瀏覽器重定向到正確的協議 + 當前的地址上。如果使用和規則一致的協議來訪問,則不會有任何動作

注意事項

  • 注意規則的順序,防止一個嚴格的 Matcher 被排名更前的寬松 Matcher 覆蓋,導致規則不起作用
  • 如果服務器有向外提供Api的話,需要特別注意和Api的兼容性,通常來說Api的調用方不是真正的瀏覽器,很可能不支持302重定向

重定向 CustomAction: Redirect

功能介紹

Redirect可以將一個請求重定向到另外一個地址

背景知識

Matcher

配置說明

可以定義多條規則,每條規則包含以下參數

  • Enable
  • Matcher
  • RegEx
  • Redirect to

執行過程

尋找規則

每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配

應用規則

當 Regex 項為空時, 請求將被重定向到Redirect to 項填寫的地址。 當 Regex 項不為空時,新地址由gsub算法生成:

new_address = gsub( uri, re,redirect_to )

其中 re 為規則中定義的Regex,redirect_to 為規則中定義的 Redirect to 項目

注意事項

  • Redirect to 項可以是以下兩種形式
  1. 帶有協議以及域名 (http/https)😕/www.abc.com/test/aaa/bbb
  1. 不帶有域名 /test/aaa/bbb
  • 重定向時url后的查詢字符串參數將會被保留
  • 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用

URI重寫 CustomAction: URI Rewrite

功能介紹

URI Rewrite 可以將請求的URI進行內部改寫,而用戶瀏覽器地址欄顯示的地址並不會發生變化

背景知識

Matcher

配置說明

可以定義多條規則,每條規則包含以下參數

  • Enable
  • Matcher
  • RegEx
  • Redirect to

執行過程

尋找規則

每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配

應用規則

當 Regex 項為空時, 請求將被重定向到Redirect to 項填寫的地址。 當 Regex 項不為空時,新地址由gsub算法生成:

new_address = gsub( uri, re,redirect_to )

其中 re 為規則中定義的Regex,redirect_to 為規則中定義的 Redirect to 項目

示例1 :

VeryNginx默認訪問路徑是 /veryngingx/dashboard/index.html, 我們想縮短到 /vn/index.html, 可以作以下配置:

Matcher: URI ≈ ^/vn

Regex: ^/vn/(.*)

Redirect to: /verynginx/dashboard/$1

添加規則之后,通過 /vn/index.html 即可訪問配置面板

注意事項

  • Redirect to 項只可以是 / 開頭的地址
  • 重定向時url后的查詢字符串參數將會被保留
  • 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用

瀏覽器驗證 CustomAction: Browser Verify

功能介紹

Browser Verify可以驗證發起請求的客戶端是否為瀏覽器,並攔截來自非瀏覽器客戶端的請求

背景知識

Matcher

配置說明

可以定義多條規則,每條規則包含以下參數

  • Enable
  • Matcher
  • Verify Type
    • Cookie
    • JavaScript

執行過程

尋找規則

每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配

應用規則

當收到一個請求時,VeryNginx 會通過算法得到一個Token

  • 當配置Verify Type為Cookie時:

用戶的Cookie中沒有帶有這個Token時,將會返回一個302重定向,將用戶重定向到當前地址,並在http響應頭中設置cookies。如果客戶端是瀏覽器,將自動帶上這個Token再繼續訪問,此時將被放行。如果客戶端是其他工具,並且該工具不支持302以及http響應頭中的set cookies字段,將無法繼續訪問

  • 當配置Verify Type為JavaScript時:

和 Type 為 Cookie 時原理類似,不同之處在於沒有Token時,返回一個網頁,並通過內嵌在網頁中的JavaScript來設置Cookies並發起重定向。需要瀏覽器支持JavaScript才可以驗證通過

Token生成算法原型

Token = hash( client_ip + UserAgent + key  )

其中Key為VeryNginx第一次運行時產生的隨機數

這樣可以為每個用戶和瀏覽器產生不同的Token,並且無法偽造

注意事項

  • 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用
  • 本功能可能會影響搜索引擎抓取信息,建議只針對部分頁面開啟,或者僅在被攻擊時開啟

訪問頻率限制 CustomAction: Frequency Limit

功能介紹

Frequency Limit 可以限制訪問特定時間內請求的次數,超出限制時將截斷並返回指定的狀態碼

背景知識

Matcher

配置說明

可以定義多條規則,每條規則包含以下參數

  • Enable
  • Matcher
  • Time(s)
  • Max Request Times
  • Count Alone
  • Return Code

執行過程

尋找規則

每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配

應用規則

每條規則會對命中的請求進行計數,單位時間( Time ) 內最多放行指定次數( Max Request Times ) 的請求,單位時間內超過次數的請求將返還指定的狀態碼。

  • 未設置單獨統計( Count Alone )的情況下,匹配這條規則的所有請求最多為 Max Request Times 次。
  • 通過設置單獨統計( Count Alone )選項,可以根據 IP (或 URI)分別進行計數,即命中 Matcher 情況下,相同 IP (或 URI)單位時間內請求不超過指定次數。

注意事項

過濾器 CustomAction: Filter

功能介紹

Filter可以阻止訪問請求,並返回指定的狀態碼

背景知識

Matcher

配置說明

可以定義多條規則,每條規則包含以下參數

  • Enable
  • Matcher
  • Action
  • Return Code

執行過程

尋找規則

每收到一個請求,VeryNginx將按照從上到下(序號遞增)的順序,取每一條規則的 Matcher 進行匹配測試,當找到第一個符合的Matcher時,即由這一條規則進行處理,停止后續匹配

應用規則

當 Action 項為 accept 時, 不進行任何動作,繼續按照正常流程處理

當 Action 項為 block 時,攔截請求,並返回 Return code 項指定的狀態碼

注意事項

  • 注意規則的順序,防止一個嚴格的Matcher被排名更前的寬松Matcher覆蓋,導致規則不起作用

自定義動作執行順序 Action Execute Order

Action 將會按照以下順序來執行

  • Scheme Lock
  • Redirect
  • URI Rewrite
  • Browser Verify
  • Frequency Limit
  • Filter

統計Summary

統計

功能介紹

統計不同URI的訪問情況

背景知識

None

配置說明

當配置為Enable狀態時,本功能對每一次訪問進行統計。如果Enable不勾選,則不記錄任何數據

統計數據有兩組:

  • All Nginx啟動后所有的數據
  • Temporary 每分鍾清空的統計數據

統計結果如下:

  • Count 請求總次數
  • Success rate 請求成功率,狀態碼在400以下都認為是成功
  • Time 請求總耗費時間
  • Avg time 請求平均耗費時間
  • Size 總響應大小
  • Avg Size 平均響應大小

執行過程

在Log階段根據不同的URI進行統計

注意事項

目前使用了10M大小的共享內存來存儲訪問統計信息,據實際測試大約可存儲10000條URI的統計數據。當共享內存存儲滿之后,最早的數據將會被丟失(LRU算法)

安裝

故障排錯 Trouble Shooting

在安裝和使用 VeryNginx 的過程中可能會遇到一些問題,下面列舉了常見的問題及對應的解決方案,供參考。

Q: run "python instal.py install all" failed ?

1, 因為缺少 gcc 所以無法編譯

yum install gcc

2, 缺少一些必要的庫,如 openssl, PCRE,導致編譯不成功

fedora / centos 下可以執行以下命令

yum install pcre pcre-devel 
yum install openssl openssl-devel 

如果你使用的是 ubuntu,那么需要

apt-get install libssl libssl-dev
apt-get install libpcre3 libpcre3-dev

3, 復制文件失敗

使用 sudo 來運行安裝腳本

Q: 啟動失敗 ?

1,nginx.conf 中指定了使用 nginx 用戶來執行程序,而系統里缺少 nginx 用戶,所以無法運行

adduser nginx

2,如果是使用自己的配置無法啟動,那么為了排除配置問題,可以先使用 VeryNginx 自帶的 nginx.conf 來運行 nginx。如果可以運行,那么說明是配置的原因。

仔細對比能工作和不能工作的配置,找到出問題的地方進行修正即可。

3,為了排除權限問題,可以使用 root 用戶來運行 nginx 試試。方法是在 nginx.conf 中:

user nginx; 修改成 user root;

Q: 無法訪問控制面板 / 控制面板工作不正常?

1, 可以先使用 chrome 或 safari 瀏覽器,排除瀏覽器不兼容的可能

2, VeryNginx 控制面板頁面中的一些 css 和 js 庫是引用了公網上的地址,如果不能訪問公網,將不能正常工作。如果遇到頁面顯示不正常之類的問題,請打開網頁調試工具,確認靜態文件有沒有載入成功

Q: 無法保存配置 ?

VeryNginx 的前端面版是一個單頁面應用( SPA ),首先為了確定配置是否被保存,可以刷新頁面重新登入控制面版,查看修改配置過的配置是否存在,如果存在,那么表示配置已經被保存了,此時配置應該被已經被保存到了 /opt/verynginx/verynginx/config/config.json 中。如果保存失敗,可能有以下原因:

1,未點擊保存按鈕

修改配置后,頁面底部會出現一個浮動條,提示保存,在點擊浮動條上的保存按鈕之后,配置才會進行寫入

2, nginx 進程對 /opt/verynginx/verynginx/configs/ 無寫權限

執行 chmod -R 777 /opt/verynginx/verynginx/configs

3, nginx 設置的 client body 太小,導致請求體被緩存到文件,導致 lua 代碼沒有獲取到請求體,保存時會提示請求失敗

在 nginx.conf 中 http 部分增加一句,client_body_buffer_size 128k;

4,nginx 以 nobody 方式運行

如果 nginx.conf 中定義了 user nobody; 將可能導致無法保存配置,去掉這項配置,或者指定成正常的用戶即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM