Nginx的代理功能與負載均衡功能是最常被用到的,關於nginx的基本語法常識與配置已在上篇文章中有說明,這篇就開門見山,先描述一些關於代理功能的配置,再說明負載均衡詳細。nginx
error_page 404 https://www.baidu.com; #錯誤頁
複製代碼
然而這個配置,細心的朋友能夠發現他並無起做用。程序員
若是咱們想讓他起做用,咱們必須配合着下面的配置一塊兒使用web
proxy_intercept_errors on; #若是被代理服務器返回的狀態碼爲400或者大於400,設置的error_page配置起做用。默認爲off。
複製代碼
proxy_method get; #支持客戶端的請求方法。post/get;
複製代碼
proxy_http_version 1.0 ; #Nginx服務器提供代理服務的http協議版本1.0,1.1,默認設置爲1.0版本
複製代碼
若是負載均衡中其中web2發生這樣的狀況,nginx首先會去web1請求,可是nginx在配置不當的狀況下會繼續分發請求道web2,而後等待web2響應,直到咱們的響應時間超時,纔會把請求從新分發給web1,這裏的響應時間若是過長,用戶等待的時間就會越長。算法
下面的配置是解決方案之一:瀏覽器
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。
複製代碼
proxy_next_upstream timeout; #反向代理upstream中設置的服務器組,出現故障時,被代理服務器返回的狀態值。error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off
複製代碼
error:創建鏈接或向被代理的服務器發送請求或讀取響應信息時服務器發生錯誤。bash
timeout:創建鏈接,想被代理服務器發送請求或讀取響應信息時服務器發生超時。服務器
invalid_header:被代理服務器返回的響應頭異常。session
off:沒法將請求分發給被代理的服務器。app
http_400,....:被代理服務器返回的狀態碼爲400,500,502,等。負載均衡
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負載均衡詳解》中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 定義的服務器列表
}
複製代碼
而後,就來點實戰的東西。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #熱備
}
複製代碼
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
複製代碼
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
複製代碼
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
複製代碼
到這裏你是否是感受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官方提供一些插件你們能夠了解下。
做爲一名碼農,隨着平時工做的須要,這裏收集了國內外不少優秀網站,這其中包括在線工具、在線運行、免費接口、在線資源、在線學習、技術論壇、技術博客等等,知足通常程序員平常需求。
地址1:nav.imaring.com 地址2:www.code-elf.cn/