errorloc和errorloc302都是同樣的效果,都是以臨時重定向到指定的url上;這裡還需要註意一點,這兩種方式都是跳轉前請求的方法是什麼,跳轉對應url也是同樣的方法;這樣一來對於其他非GET方法請求出現403錯誤碼的時候,對應的錯誤頁就無法正常處理(通常只允許GET方法去請求別的URL... ...
前文我們聊了下haproxy的修改報文首部的配置、壓縮功能以及haproxy基於http協議自定義健康狀態檢測機制;回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12789175.html;今天這篇博客主要來說一下haproxy的錯誤頁面定義,日誌相關配置;
首先來說說錯誤頁面的配置吧;haproxy同nginx是一樣可自定義錯誤頁面;在nginx里我們用error_page 指令來指定對應錯誤狀態碼加location,根據錯誤狀態碼指定的location來指定對應錯誤狀態碼的狀態頁面文件;haproxy自定義錯誤頁面的思想類似,不同的是nginx作為web伺服器可以自定義404錯誤頁面,而haproxy通常作為代理伺服器,對於404錯誤頁面通常不會由haproxy自己指定,因為haproxy作為代理伺服器對於後端server的資源是否能夠找到,它不知道;即便我們在配置中指定了404錯誤對應的響應頁面,在haproxy重啟後是不會生效的;haproxy指定錯誤頁面的方式兩種,第一種是指定本地文件系統文件作為對應錯誤狀態碼的錯誤頁;第二種是指定對應錯誤狀態碼跳轉的URL;
errorfile <code> <file>:指定對應錯誤狀態碼對應文件系統上的文件作為該狀態碼響應的頁面
示例:自定義錯誤403的錯誤頁面
提示:為了能夠模仿出403錯誤,上面使用了acl來拒絕源地址為192.168.0.232的訪問;後面我們會說acl的用法;上圖紅框中的內容就是表示對於錯誤403響應頁面上/etc/haproxy/error403.html;
測試:在192.168.0.232主機上用瀏覽器訪問haproxy對外提供服務端介面,看看是否響應我們自定義的頁面?
提示:從上面的測試結果看,haproxy是能夠把我們指定錯誤狀態碼對應文件內容響應給我們;這裡挺奇怪的在消息頭裡只看得到請求報文,沒有響應報文;
示例:指定403錯誤頁面跳轉至nginx.org/aaa.html
提示:紅框中的配置就表示對於403錯誤就跳轉到指定http://nginx.org/aaa.html
測試:在232主機上訪問192.168.0.22看看是否跳轉到nginx.org/aaa.html?
提示:errorloc和errorloc302都是同樣的效果,都是以臨時重定向到指定的url上;這裡還需要註意一點,這兩種方式都是跳轉前請求的方法是什麼,跳轉對應url也是同樣的方法;這樣一來對於其他非GET方法請求出現403錯誤碼的時候,對應的錯誤頁就無法正常處理(通常只允許GET方法去請求別的URL);比如跳轉前用PUT方法,出現錯誤403後,按照上面的配置,對應指定的錯誤頁的url也會用PUT方法去請求;為瞭解決這樣的問題,我們這裡需要用到errorloc303來指定;該指令的意思是返回303響應碼;如果請求前非GET方法,而出現對應錯誤後,用GET方法去請求對應錯誤狀態碼指定的URL;
示例:非GET方法錯誤頁面重定向到其他URL上
提示:以上配置就表示如果我們用非GET方法請求某資源,出現403錯誤後,返回303狀態碼;303表示請求重定向頁面的方法要總是使用GET方法;
測試:先使用errorloc302指定url跳轉,然後在瀏覽器上跳轉前使用PUT方法請求,看看跳轉後到指定URL看看使用的什麼方法?
提示:可以看到當我們用PUT方法請求192.168.0.22時,跳轉到指定的URL也是用的PUT方法;
測試:用errorloc303指定跳轉url,然後用PUT方法請求192.168.0.22看看跳轉URL使用什麼方法?
提示:可以看到用errorloc303指定錯誤url後,跳轉指定URL不是跳轉前的PUT方法請求,而是GET;
以上就是haproxy關於錯誤頁面的定義的配置,更多說明請參考官方文檔http://cbonte.github.io/haproxy-dconv/;說了haproxy的錯誤頁面配置後,接下來在來瞭解下haproxy的日誌;
log:啟用事件和流量的每個實例日誌記錄。
no log:關閉日誌記錄;
log global:調用全局配置段中日誌的定義;
log<address> [len <length>] <facility> [<level> [<minlevel>]]:定義一個用於接收haproxy日誌的rsyslog伺服器地址,facility;預設是發往本機的rsyslog伺服器上的local2上;有關rsyslog的相關說明請參考https://www.cnblogs.com/qiuhom-1874/p/12091118.html;
log-format <string>:設定日誌格式;日誌格式的設定變數表請參照下表
+---+------+-----------------------------------------------+-------------+ | R | var | field name (8.2.2 and 8.2.3 for description) | type | +---+------+-----------------------------------------------+-------------+ | | %o | special variable, apply flags on all next var | | +---+------+-----------------------------------------------+-------------+ | | %B | bytes_read (from server to client) | numeric | | H | %CC | captured_request_cookie | string | | H | %CS | captured_response_cookie | string | | | %H | hostname | string | | | %ID | unique-id | string | | | %ST | status_code | numeric | | | %T | gmt_date_time | date | | | %Tc | Tc | numeric | | | %Tl | local_date_time | date | | H | %Tq | Tq | numeric | | H | %Tr | Tr | numeric | | | %Ts | timestamp | numeric | | | %Tt | Tt | numeric | | | %Tw | Tw | numeric | | | %U | bytes_uploaded (from client to server) | numeric | | | %ac | actconn | numeric | | | %b | backend_name | string | | | %bc | beconn (backend concurrent connections) | numeric | | | %bi | backend_source_ip (connecting address) | IP | | | %bp | backend_source_port (connecting address) | numeric | | | %bq | backend_queue | numeric | | | %ci | client_ip (accepted address) | IP | | | %cp | client_port (accepted address) | numeric | | | %f | frontend_name | string | | | %fc | feconn (frontend concurrent connections) | numeric | | | %fi | frontend_ip (accepting address) | IP | | | %fp | frontend_port (accepting address) | numeric | | | %ft | frontend_name_transport ('~' suffix for SSL) | string | | | %hr | captured_request_headers default style | string | | | %hrl | captured_request_headers CLF style | string list | | | %hs | captured_response_headers default style | string | | | %hsl | captured_response_headers CLF style | string list | | | %ms | accept date milliseconds (left-padded with 0) | numeric | | | %pid | PID | numeric | | H | %r | http_request | string | | | %rc | retries | numeric | | | %rt | request_counter (HTTP req or TCP session) | numeric | | | %s | server_name | string | | | %sc | srv_conn (server concurrent connections) | numeric | | | %si | server_IP (target address) | IP | | | %sp | server_port (target address) | numeric | | | %sq | srv_queue | numeric | | S | %sslc| ssl_ciphers (ex: AES-SHA) | string | | S | %sslv| ssl_version (ex: TLSv1) | string | | | %t | date_time (with millisecond resolution) | date | | | %ts | termination_state | string | | H | %tsc | termination_state with cookie status | string | +---+------+-----------------------------------------------+-------------+
capture cookie <name> len <length>:捕獲並記錄請求報文和響應報文中的cookie信息
capture request header <name> len <length>:捕獲並記錄指定請求標頭的最後一次出現
capture response header <name> len <length>:捕獲並記錄指定響應標頭的最後一次出現
結合上面的內容,我們就可以自定義訪問日誌了;通常我們通過capture去捕獲對應首部的信息,然後通過上面的變數定義成日誌格式
示例:
測試:用瀏覽器訪問對應haproxy的前端,看看日誌格式
提示:可以看到我們訪問對應haproxy的前端,日誌就和預設的日誌不一樣了;日誌格式中的變來可參照上邊的表去找對應表示什麼;