nginx搭建簡易負載均衡服務

本文介紹如何在nginx服務器上實現(xiàn)均衡服務,從而緩解部分高并發(fā)問題。
原文地址:代碼匯個人博客 http://www.codehui.net/info/63.html

什么是負載均衡

???????當一臺服務器的性能達到極限時,我們可以使用服務器集群來提高網(wǎng)站的整體性能。那么,在服務器集群中,需要有一臺服務器充當調(diào)度者的角色,用戶的所有請求都會首先由它接收,調(diào)度者再根據(jù)每臺服務器的負載情況將請求分配給某一臺后端服務器去處理。
???????那么在這個過程中,調(diào)度者如何合理分配任務,保證所有后端服務器都將性能充分發(fā)揮,從而保持服務器集群的整體性能最優(yōu),這就是負載均衡問題。

基本環(huán)境

三臺centos虛擬機(windows也可以),都搭建好了nginx環(huán)境。當然也可以使用docker映射三個不同端口的nginx容器進行。centos使用docker搭建nginx環(huán)境方法:《使用docker快速搭建nginx+php環(huán)境》

三臺主機分別是:

192.168.73.128

192.168.73.130

192.168.73.131

首先我們解析個域名codehui.net到主服務器192.168.73.128

192.168.73.128 codehui.net

步驟

主服務器配置

編輯nginx配置文件

vi /etc/nginx/nginx.conf

在http節(jié)點中加入下面配置,負載均衡的幾種常用方式請查看文尾。

    # 負載均衡服務器列表
    upstream codehui.net {
        server 192.168.73.130:80;
        server 192.168.73.131:80;
    }
     
    # 監(jiān)聽80端口的訪問
    server{
        listen 80;
        server_name codehui.net;
        location / {
            proxy_pass      http://codehui.net;
        }
    }
其他兩臺服務器配置

我們分別在兩臺服務器上新建個入口文件,作為區(qū)分

echo "<?php echo "我是一號服務器:192.168.73.130";" > index.php

echo "<?php echo "我是二號服務器:192.168.73.131";" > index.php

如果要配置其他功能,可以在nginx.conf中加入如下方法

server{
   listen 80;
   server_name codehui.net;
   root /usr/share/nginx/www;
   location / {
       index index.php index.html;
   }
}

注意重啟nginx服務

service nginx reload
測試

可以看到兩次請求分發(fā)到了不同服務器


代碼匯
代碼匯

負載均衡的幾種常用方式

1、 輪詢(默認)

每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。

upstream nginx_server {
    server server1;
    server server1;
}

2、weight

指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。

upstream nginx_server {
    server server1 weight=4;
    server server2 weight=6;
}

權(quán)重越高,在被訪問的概率越大,如上例,分別是40%,60%。

3、 ip_hash

上述方式存在一個問題就是說,在負載均衡系統(tǒng)中,假如用戶在某臺服務器上登錄了,那么該用戶第二次請求的時候,因為我們是負載均衡系統(tǒng),每次請求都會重新定位到服務器集群中的某一個,那么已經(jīng)登錄某一個服務器的用戶再重新定位到另一個服務器,其登錄信息將會丟失,這樣顯然是不妥的。
我們可以采用ip_hash指令解決這個問題,如果客戶已經(jīng)訪問了某個服務器,當用戶再次訪問時,會將該請求通過哈希算法,自動定位到該服務器。
每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。

upstream nginx_server {
    ip_hash;
    server server1;
    server server2;
}

4、 fair (第三方)

upstream nginx_server {
    server server1;
    server server2;
    fair;
}

5、url_hash (第三方)

按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。

upstream backserver {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

每個設(shè)備的狀態(tài)設(shè)置為:

  1. down 表示單前的server暫時不參與負載
  2. weight 默認為1.weight越大,負載的權(quán)重就越大
  3. max_fails:允許請求失敗的次數(shù)默認為1.當超過最大次數(shù)時,返回proxy_next_upstream模塊定義的錯誤
  4. fail_timeout : max_fails次失敗后,暫停的時間
  5. backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。
    配置實例:
#user  nobody;
worker_processes  4;
events {
    # 最大并發(fā)數(shù)
    worker_connections  1024;
}
http{
    # 待選服務器列表
    upstream myproject{
        # ip_hash指令,將同一用戶引入同一服務器。
        ip_hash;
        server 125.219.42.4 fail_timeout=60s;
        server 172.31.2.183;
    }

    server{
         # 監(jiān)聽端口
         listen 80;
         # 根目錄下
         location / {
               # 選擇哪個服務器列表
               proxy_pass http://myproject;
         }

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容