基于Nginx的负载均衡
一、Nginx反向代理
nginx的代理過程,客戶端請求到達nginx代理服務器,nginx服務器并不對請求做應答處理,而是判斷請求類型,并將請求合理的調度到后端服務器,由后端服務器隊請求做處理,處理完畢在經由nginx代理服務器返回給客戶端。后端服務器可在遠程也可在本地,也可以是nginx服務器內部定義的其他虛擬主機。這些接收nginx轉發的服務器被稱為上游(upstream)。
使用nginx做代理的目的之一是擴展基礎架構的規模。nginx可以處理大量并發連接,請求到來后,nginx可將其轉發給任意數量的后臺服務器進行處理,這等于將負載均衡分散到整個集群。
語法:proxy_pass URL
說明:URL的形式可以如下:http://location:8000/uri/ 等,可在location中進行配置。
例子:下面是一個簡單的代理到本機其他端口的示例
在80端口監聽的目錄下沒有test_proxy的文件,但在8080端口監聽目錄下有,在80端口的server里面添加如下內容:
location ~ /test_proxy.html$ { proxy_pass http://127.0.0.1:8080; }然后在瀏覽器上輸入http://IP地址/test_proxy.html,會出現請求的信息,實際上是80端口轉發給了8080端口并把數據請求了回來。
二、緩沖
nginx也提供了緩沖的機制,用于提高性能。沒有緩沖的情況下,數據直接從后端服務器發送給客戶端。緩沖的作用是在nginx上臨時存儲來自后端服務器的處理結果,從而可以提早關閉nginx到后端的連接,減少IO的損耗。一般內容存放在內存當中,但當內容過多,造成的內存不夠時,會把內容存放在臨時文件目錄下。下面是一些常用的緩沖的配置項,可以再http、server和location內容塊下。
proxy_buffering:控制本內容塊下是否啟用緩沖,默認是"on"
proxy_buffers:有兩個參數,第一個控制緩沖區請求數量,第二個控制緩沖區大小。默認值為8個、一頁(一般是4k或8k)。這個值越大,緩沖的內容越多。
proxy_buffer_size:后端回復結果的首段(包含header的部分)是單獨緩沖的,此配置就是配置這部分緩沖區的大小。這個值默認與proxy_buffer的值相同,我們可以把它設置得小一些,因為header內容一般比較少。
proxy_busy_buffers_size:設置被標記為"client-ready"(客戶端就緒)的緩沖區大小。客戶端一次只能從一個緩沖讀取數據,而緩沖是按照隊列次序被分批發送給客戶端的。此語法配置的就是這個隊列的大小。
proxy_temp_path:定義nginx存儲臨時文件路徑。
proxy_max_temp_file_size:每個請求可以存儲臨時文件的目錄大小。如果上游發來的結果太大以至于無法放入一個緩沖,則nginx會為其創建臨時文件。
三、負載均衡
Nginx負載均衡示意圖
配置語法:upstream name {.......}
說明:name是自定義的一個名字,而{}則是需要定義的內容,只能在http塊定義,不能在server塊里定義。定義完之后可在location塊下寫入如下代碼進行調用:http://name。
例子:由于服務器數量的限制,此處我們是用一臺服務器的不同的端口來模擬負載均衡,當然,多臺的配置也是類似的。
在server塊內加入如下代碼:
upstream test { #ip_hash server IP:8001; server IP:8002; server IP:8003; }然后,在http塊內的location中加入如下內容:
location / {#設置主機頭和客戶端真實地址,以便服務器獲取客戶端真實IP proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30;#設置連接超時時間為30s proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; #設置緩沖區大小 proxy_buffering on; #開啟緩沖區 proxy_buffers 4 128k; #設置緩沖區的數目和大小 proxy_busy_buffers_size 256k; #設置客戶端就緒緩沖區大小 proxy_max_temp_file_size 256k; proxy_pass http://test; #調用上面設置的負載均衡 }當然,得提醒一下,我們設置的IP的端口是事先在配置文件里配置好的。例如如下的配置。
然后,我們訪問我們的主機地址,然后不斷的刷新,會發現出來每個端口出來的頁面信息。默認的負載均衡采用的是輪詢的方式。
如果是用的不同的服務器進行負載均衡的話,只需稍稍改改,就例如如下配置:
upstream mydomain.com{ server 10.220.5.111:80; server 10.220.5.112:80; server 10.220.5.113:80; }配置完之后呢,剩下的在http里的代碼和上面的相似,然后在其他的三個服務器那里進行如下配置。當然,我們還得在那三個服務器那里的防火墻進行設置。
server{ listen 80; server_name www.mydomain.com; index index.htm index.php index.html; root 目錄路徑; }①后端服務器在負載均衡調度中的狀態
dowm:當前的server暫時不參與負載均衡。
backup:預留的備份服務器。
max_fails:允許請求失敗的次數。
fail_timeout:經過max_fails失敗后,服務器暫停的時間。
max_conns:限制最大的接收連接數。
注:以上的配置都是在upstream的時候配置的,例如在{}里面加入的server IP:8001 dowm,就表示這個服務是不參與負載均衡的,用來做備 份的,以上配置都是寫在服務的后面。
②調度算法
輪詢:按時間順序逐一分配到不同的后端服務器。
加權輪詢:可在配置的server后面加個weight=number,number值越高,分配的概率越大。
ip_hash:每個請求按訪問IP的hash分配,這樣來自同一IP固定訪問一個后臺服務器。
least_hash:最少鏈接數,哪個機器連接數少就發分發給哪個機器。
url_hash:按訪問的url的hash結果分配請求,是每個url定向到同一后端服務器上。
hash關鍵值:hash自定義的key。
注:調度算法在設置upstream中配置,例如在此大括號里面寫入ip_hash表示使用ip_hash的方式分配。
------做運維之前很矯情的小年輕-----
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的基于Nginx的负载均衡的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ansible之playbook(剧本)
- 下一篇: Ansible之roles(角色)详解