Nginx的代理功能與負載均衡功能是最常被用到的,關於nginx的基本語法常識與配置已在上篇文章中有說明,這篇就開門見山,先描述一些關於代理功能的配置,再說明負載均衡詳細。html
一、上一篇中咱們在http模塊中有下面的配置,當代理遇到狀態碼爲404時,咱們把404頁面導向百度。nginx
error_page 404 https://www.baidu.com; #錯誤頁
然而這個配置,細心的朋友能夠發現他並無起做用。web
若是咱們想讓他起做用,咱們必須配合着下面的配置一塊兒使用算法
proxy_intercept_errors on; #若是被代理服務器返回的狀態碼爲400或者大於400,設置的error_page配置起做用。默認爲off。
二、若是咱們的代理只容許接受get,post請求方法的一種瀏覽器
proxy_method get; #支持客戶端的請求方法。post/get;
三、設置支持的http協議版本服務器
proxy_http_version 1.0 ; #Nginx服務器提供代理服務的http協議版本1.0,1.1,默認設置爲1.0版本
四、若是你的nginx服務器給2臺web服務器作代理,負載均衡算法採用輪詢,那麼當你的一臺機器web程序iis關閉,也就是說web不能訪問,那麼nginx服務器分發請求仍是會給這臺不能訪問的web服務器,若是這裏的響應鏈接時間過長,就會致使客戶端的頁面一直在等待響應,對用戶來講體驗就打打折扣,這裏咱們怎麼避免這樣的狀況發生呢。這裏我配張圖來講明下問題。session
若是負載均衡中其中web2發生這樣的狀況,nginx首先會去web1請求,可是nginx在配置不當的狀況下會繼續分發請求道web2,而後等待web2響應,直到咱們的響應時間超時,纔會把請求從新分發給web1,這裏的響應時間若是過長,用戶等待的時間就會越長。app
下面的配置是解決方案之一。負載均衡
proxy_connect_timeout 1; #nginx服務器與被代理的服務器創建鏈接的超時時間,默認60秒 proxy_read_timeout 1; #nginx服務器想被代理服務器組發出read請求後,等待響應的超時間,默認爲60秒。 proxy_send_timeout 1; #nginx服務器想被代理服務器組發出write請求後,等待響應的超時間,默認爲60秒。 proxy_ignore_client_abort on; #客戶端斷網時,nginx服務器是否終端對被代理服務器的請求。默認爲off。
五、若是使用upstream指令配置啦一組服務器做爲被代理服務器,服務器中的訪問算法遵循配置的負載均衡規則,同時可使用該指令配置在發生哪些異常狀況時,將請求順次交由下一組服務器處理。post
proxy_next_upstream timeout; #反向代理upstream中設置的服務器組,出現故障時,被代理服務器返回的狀態值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
error:創建鏈接或向被代理的服務器發送請求或讀取響應信息時服務器發生錯誤。
timeout:創建鏈接,想被代理服務器發送請求或讀取響應信息時服務器發生超時。
invalid_header:被代理服務器返回的響應頭異常。
off:沒法將請求分發給被代理的服務器。
http_400,....:被代理服務器返回的狀態碼爲400,500,502,等。
六、若是你想經過http獲取客戶的真是ip而不是獲取代理服務器的ip地址,那麼要作以下的設置。
proxy_set_header Host $host; #只要用戶在瀏覽器中訪問的域名綁定了 VIP VIP 下面有RS;則就用$host ;host是訪問URL中的域名和端口 www.taobao.com:80 proxy_set_header X-Real-IP $remote_addr; #把源IP 【$remote_addr,創建HTTP鏈接header裏面的信息】賦值給X-Real-IP;這樣在代碼中 $X-Real-IP來獲取 源IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#在nginx 做爲代理服務器時,設置的IP列表,會把通過的機器ip,代理機器ip都記錄下來,用 【,】隔開;代碼中用 echo $x-forwarded-for |awk -F, '{print $1}' 來做爲源IP
關於X-Forwarded-For與X-Real-IP的一些相關文章我推薦一位博友的:HTTP 請求頭中的 X-Forwarded-For ,這位博友對http協議有一系列的文章闡述,推薦你們去關注下。
七、下面是個人一個關於代理配置的配置文件部分,僅供參考。
include mime.types; #文件擴展名與文件類型映射表 default_type application/octet-stream; #默認文件類型,默認爲text/plain #access_log off; #取消服務日誌 log_format myFormat ' $remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定義格式 access_log log/access.log myFormat; #combined爲日誌格式的默認值 sendfile on; #容許sendfile方式傳輸文件,默認爲off,能夠在http塊,server塊,location塊。 sendfile_max_chunk 100k; #每一個進程每次調用傳輸數量不能大於設定的值,默認爲0,即不設上限。 keepalive_timeout 65; #鏈接超時時間,默認爲75s,能夠在http,server,location塊。 proxy_connect_timeout 1; #nginx服務器與被代理的服務器創建鏈接的超時時間,默認60秒 proxy_read_timeout 1; #nginx服務器想被代理服務器組發出read請求後,等待響應的超時間,默認爲60秒。 proxy_send_timeout 1; #nginx服務器想被代理服務器組發出write請求後,等待響應的超時間,默認爲60秒。 proxy_http_version 1.0 ; #Nginx服務器提供代理服務的http協議版本1.0,1.1,默認設置爲1.0版本。 #proxy_method get; #支持客戶端的請求方法。post/get; proxy_ignore_client_abort on; #客戶端斷網時,nginx服務器是否終端對被代理服務器的請求。默認爲off。 proxy_ignore_headers "Expires" "Set-Cookie"; #Nginx服務器不處理設置的http相應投中的頭域,這裏空格隔開能夠設置多個。 proxy_intercept_errors on; #若是被代理服務器返回的狀態碼爲400或者大於400,設置的error_page配置起做用。默認爲off。 proxy_headers_hash_max_size 1024; #存放http報文頭的哈希表容量上限,默認爲512個字符。 proxy_headers_hash_bucket_size 128; #nginx服務器申請存放http報文頭的哈希表容量大小。默認爲64個字符。 proxy_next_upstream timeout; #反向代理upstream中設置的服務器組,出現故障時,被代理服務器返回的狀態值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off #proxy_ssl_session_reuse on; 默認爲on,若是咱們在錯誤日誌中發現「SSL3_GET_FINSHED:digest check failed」的狀況時,能夠將該指令設置爲off。
上一篇中我說啦nginx有哪些中負載均衡算法。這一結我就給若是操做配置的給你們作詳細說明下。
首先給你們說下upstream這個配置的,這個配置是寫一組被代理的服務器地址,而後配置負載均衡的算法。這裏的被代理服務器地址有2中寫法。
upstream mysvr { server 192.168.10.121:3333; server 192.168.10.122:3333; } server { .... location ~*^.+$ { proxy_pass http://mysvr; #請求轉向mysvr 定義的服務器列表 }
upstream mysvr { server http://192.168.10.121:3333; server http://192.168.10.122:3333; } server { .... location ~*^.+$ { proxy_pass mysvr; #請求轉向mysvr 定義的服務器列表 }
而後,就來點實戰的東西。
一、熱備:若是你有2臺服務器,當一臺服務器發生事故時,才啓用第二臺服務器給提供服務。服務器處理請求的順序:AAAAAA忽然A掛啦,BBBBBBBBBBBBBB.....
upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #熱備 }
二、輪詢:nginx默認就是輪詢其權重都默認爲1,服務器處理請求的順序:ABABABABAB....
upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333; }
三、加權輪詢:跟據配置的權重的大小而分發給不一樣服務器不一樣數量的請求。若是不設置,則默認爲1。下面服務器的請求順序爲:ABBABBABBABBABB....
upstream mysvr { server 127.0.0.1:7878 weight=1; server 192.168.10.121:3333 weight=2;
}
四、ip_hash:nginx會讓相同的客戶端ip請求相同的服務器。
upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333; ip_hash; }
五、若是你對上面4種均衡算法不是很理解,那麼麻煩您去看下我上一篇配的圖片,可能會更加容易理解點。
到這裏你是否是感受nginx的負載均衡配置特別簡單與強大,那麼還沒完,我們繼續哈,這裏扯下蛋。
關於nginx負載均衡配置的幾個狀態參數講解。
down,表示當前的server暫時不參與負載均衡。
backup,預留的備份機器。當其餘全部的非backup機器出現故障或者忙的時候,纔會請求backup機器,所以這臺機器的壓力最輕。
max_fails,容許請求失敗的次數,默認爲1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤。
fail_timeout,在經歷了max_fails次失敗後,暫停服務的時間。max_fails能夠和fail_timeout一塊兒使用。
upstream mysvr { server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2; server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1; }
到這裏應該能夠說nginx的內置負載均衡算法已經沒有貨啦。若是你像跟多更深刻的瞭解nginx的負載均衡算法,nginx官方提供一些插件你們能夠了解下。
若是你在開發過程當中使用啦這些技術,或者你要使用遇到啦什麼問題,歡迎加入左上角的羣,咱們一塊兒討論學習,本篇未完待續。