1. 程式人生 > >CentOS搭建nginx負載均衡環境

CentOS搭建nginx負載均衡環境

Linux學習10-CentOS搭建nginx負載均衡環境

前言

當自己的web網站訪問的人越來越多,一臺伺服器無法滿足現有的業務時,此時會想到多加幾臺伺服器來實現負載均衡。
網站的訪問量越來越大,伺服器的服務模式也得進行相應的升級,怎樣將同一個域名的訪問分散到兩臺或更多的機器上呢?這就需要用nginx來配置負載均衡的環境了。
以多個tomcat服務為例,用nginx配置管理多個tomcat服務

什麼是負載均衡

負載均衡建立在現有網路結構之上,它提供了一種廉價有效透明的方法擴充套件網路裝置和伺服器的頻寬、增加吞吐量、加強網路資料處理能力、提高網路的靈活性和可用性。負載均衡,英文名稱為Load Balance,其意思就是分攤到多個操作單元上進行執行,例如Web伺服器、FTP伺服器、企業關鍵應用伺服器和其它關鍵任務伺服器等,從而共同完成工作任務。

如果還是不懂的話,可以舉個例子:
假設你是個妹子,你敗家太厲害,以至於你的男友根本吃不消,於是乎你找了兩個男朋友,一三五單號,二四六雙號限行,從而減少一個男朋友所面臨的壓力,這叫負載均衡。

nginx的負載均衡策略有2種,第一種是輪詢:也就是上面說的“兩個男朋友,一三五單號,二四六雙號限行”,看下圖

 

另外一種是加權輪詢:兩個男友,一個是正牌的,權重比較大,一二四五;另外一個是備胎三六,權重比為2:1

 

如果是同一個使用者,在伺服器1上登入了,接著去連續訪問頁面時候,如果按上面的輪詢策略就會到賬一會在伺服器1上訪問,一會伺服器2上訪問,session不共享就會錯亂了。
於是就有了Ip hash演算法,對客戶端請求的ip進行hash操作,然後根據hash結果將同一個客戶端ip的請求分發給同一臺伺服器進行處理,可以解決session不共享的問題。

 

搭建多個tomcat環境

如果你有多臺伺服器的話,可以在多個伺服器上搭建一樣的tomcat環境,關於tomcat環境搭建可以參考這篇https://www.cnblogs.com/yoyoketang/p/10186513.html
前面是用的yum直接安裝的,本篇介紹用wget下載安裝apache-tomcat-8.5.35,下載地址 http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz

由於我這邊只有一臺伺服器,為了方便練習,可以在一個伺服器上搭建3個tomcat環境

  • 先在/usr/local目錄下新建一個tomcat目錄

  • wget下載apache-tomcat-8.5.35.tar.gz

  • tar -zxf解壓

  • 解壓後重命名apache-tomcat-1

  • 同一目錄下複製2個一樣的apache-tomcat-2、apache-tomcat-3

[[email protected] ~]# cd ..
[[email protected] local]# cd /usr/local
[[email protected] local]# mkdir tomcat
[[email protected] local]# cd tomcat/
[[email protected] tomcat]# wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz
[[email protected] tomcat]# tar -zxf apache-tomcat-8.5.35.tar.gz

# 下載解壓後,複製三個一樣的檔案apache-tomcat-1、apache-tomcat-2、apache-tomcat-3
[[email protected] tomcat]# mv apache-tomcat-8.5.35 apache-tomcat-1
[[email protected] tomcat]# cp -r apache-tomcat-1 apache-tomcat-2
[[email protected] tomcat]# cp -r apache-tomcat-1 apache-tomcat-3

tomcat預設都是在8080埠啟動的,為了能讓3個服務都能啟動,就需要

改啟動埠,開啟apache-tomcat-1/conf/server.xml目錄編輯

vim /usr/local/tomcat/apache-tomcat-1/conf/server.xml

找到以下三個地方,把埠改成跟之前不一樣的,如下

//8011遠端停服務埠 
<Server port="8011" shutdown="SHUTDOWN"> 
//8081為http埠 <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 
//8021為AJP埠,Apache能通過AJP協議訪問Tomcat的8006埠 
<Connector port="8021" protocol="AJP/1.3" redirectPort="8443" />

開啟apache-tomcat-2/conf/server.xml目錄編輯

//8012遠端停服務埠 
<Server port="8012" shutdown="SHUTDOWN"> 
//8082為http埠 <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 
//8022為AJP埠,Apache能通過AJP協議訪問Tomcat的8006埠 
<Connector port="8022" protocol="AJP/1.3" redirectPort="8443" />

開啟apache-tomcat-3/conf/server.xml目錄編輯

//8013遠端停服務埠 
<Server port="8013" shutdown="SHUTDOWN"> 
//8083為http埠 <Connector port="8083" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 
//8023為AJP埠,Apache能通過AJP協議訪問Tomcat的8006埠 
<Connector port="8023" protocol="AJP/1.3" redirectPort="8443" />

改完之後,去阿里雲ECS後臺管理-安全組-配置規則-新增8081、8082、8083三個埠訪問許可權

接著去啟動3個tomcat, 看到如下提示,說明正常啟動了

[[email protected] tomcat]# cd /usr/local/tomcat/apache-tomcat-1/bin/
[[email protected] bin]# ./startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat/apache-tomcat-1
Using CATALINA_HOME:   /usr/local/tomcat/apache-tomcat-1
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-1/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/apache-tomcat-1/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-1/bin/tomcat-juli.jar
Tomcat started.
[[email protected] bin]# 

[[email protected] tomcat]# cd /usr/local/tomcat/apache-tomcat-2/bin/
[[email protected] bin]# ./startup.sh 

[[email protected] tomcat]# cd /usr/local/tomcat/apache-tomcat-3/bin/
[[email protected] bin]# ./startup.sh

停掉tomcat服務是在bin下執行./shutdown.sh

[[email protected] bin]# ll
total 844
-rw-r----- 1 root root  35051 Nov  4 01:39 bootstrap.jar
-rw-r----- 1 root root  15900 Nov  4 01:39 catalina.bat
-rwxr-x--- 1 root root  23463 Nov  4 01:39 catalina.sh
-rw-r----- 1 root root   1664 Nov  4 01:42 catalina-tasks.xml
-rw-r----- 1 root root  25145 Nov  4 01:39 commons-daemon.jar
-rw-r----- 1 root root 207125 Nov  4 01:39 commons-daemon-native.tar.gz
-rw-r----- 1 root root   2040 Nov  4 01:39 configtest.bat
-rwxr-x--- 1 root root   1922 Nov  4 01:39 configtest.sh
-rwxr-x--- 1 root root   8508 Nov  4 01:39 daemon.sh
-rw-r----- 1 root root   2091 Nov  4 01:39 digest.bat
-rwxr-x--- 1 root root   1965 Nov  4 01:39 digest.sh
-rw-r----- 1 root root   3460 Nov  4 01:39 setclasspath.bat
-rwxr-x--- 1 root root   3680 Nov  4 01:39 setclasspath.sh
-rw-r----- 1 root root   2020 Nov  4 01:39 shutdown.bat
-rwxr-x--- 1 root root   1902 Nov  4 01:39 shutdown.sh
-rw-r----- 1 root root   2022 Nov  4 01:39 startup.bat
-rwxr-x--- 1 root root   1904 Nov  4 01:39 startup.sh
-rw-r----- 1 root root  49336 Nov  4 01:39 tomcat-juli.jar
-rw-r----- 1 root root 411789 Nov  4 01:39 tomcat-native.tar.gz
-rw-r----- 1 root root   4574 Nov  4 01:39 tool-wrapper.bat
-rwxr-x--- 1 root root   5483 Nov  4 01:39 tool-wrapper.sh
-rw-r----- 1 root root   2026 Nov  4 01:39 version.bat
-rwxr-x--- 1 root root   1908 Nov  4 01:39 version.sh
[[email protected] bin]# ./shutdown.sh

啟動完成後,在瀏覽器上分別然後訪問http://47.104.x.x:8081/http://47.104.x.x:8082/http://47.104.x.x:8082/。會發現都可以訪問到了。
首次訪問會比較慢,如果不能訪問就執行reboot重啟

為了驗證方便,修改tomcat首頁/usr/local/tomcat/apache-tomcat-1/webapps/ROOT,開啟index.jsp檔案,把Home 分別改成Home8081,Home8082,Home8083

 

改完之後重新整理頁面就能訪問了

 

nginx配置

前面一篇https://www.cnblogs.com/yoyoketang/p/10239179.html在/usr/local/nginx/conf目錄在nginx.conf配置裡面把預設監聽埠改成了81
先配置一個tomcat環境,當訪問http://47.104.x.x:81/埠時,讓nginx把服務指向http://47.104.x.x:8081/

vim開啟/usr/local/nginx/conf/nginx.conf先配置server

vim /usr/local/nginx/conf/nginx.conf

把location 這項改成proxy_pass http://47.104.x.x:8081;注意後面有個分號

    server {
        listen       81;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://47.104.x.x:8081;
            # root   html;
            # index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

編輯完成後:wq儲存退出,執行reload,重新載入nginx檔案

[[email protected] conf]# cd /usr/local/nginx/sbin/
[[email protected] sbin]# ./nginx -s reload

接著在瀏覽器輸入http://47.104.x.x:81 就能訪問到8081的tomcat首頁了,之前是訪問的nginx頁面,說明監聽成功

負載均衡

輪詢訪問

一臺服務配置好了,接著把三個tomcat服務全部放到一塊,讓訪問http://47.104.x.x:81能自動分配到8081、8082、8083這三個伺服器上,實現負載均衡

vim開啟/usr/local/nginx/conf/nginx.conf在server上方加個upstream標籤,把多個伺服器server地址配置進去就可以了

upstream tomcats {
            server  47.104.x.x:8081;
            server  47.104.x.x:8082;
            server  47.104.x.x:8083;
          }

    server {
        listen       81;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://tomcats;
            # root   html;
            # index  index.html index.htm;
        }

編輯完成後:wq儲存退出,執行reload,重新載入nginx檔案

[[email protected] conf]# cd /usr/local/nginx/sbin/
[[email protected] sbin]# ./nginx -s reload

接著在瀏覽器輸入http://47.104.x.x:81,多次重新整理,會發現tomcat首頁輪詢顯示Home8081、Home8082、Home8083

加權輪詢

如果3臺伺服器的效能和配置不一樣,我們希望訪問某臺伺服器的權重加大,只需加一個引數就可以

upstream tomcats {
            server  47.104.x.x:8081 weight=1;
            server  47.104.x.x:8082 weight=2;
            server  47.104.x.x:8083 weight=3;
          }

跟上面步驟一樣,改完之後./nginx -s reload,訪問6次,會有3次出現Home8083

ip_hash解決session共享問題

涉及到不同的ip訪問多個伺服器會出現session不共享的問題,可以加個引數:ip_hash,就可以解決了

upstream tomcats {
            ip_hash;
            server  47.104.x.x:8081 weight=1;
            server  47.104.x.x:8082 weight=2;
            server  47.104.x.x:8083 weight=3;
          }

設定連結超時

location裡面可以配置連結服務超時時間

    location / {
        proxy_pass http://tomcats;
        proxy_connect_timeout 36000s;
        proxy_send_timeout 36000s;
        proxy_read_timeout 36000s;
    }

proxy_connect_timeout 為連線應用伺服器的超時時間,單位為秒
proxy_send_timeout 為傳送請求到應用伺服器的超時時間,單位為秒
proxy_read_timeout 為等待應用伺服器響應的超時時間,單位為秒

upstream模組

upstream模組主要負責負載均衡的配置,通過預設的輪詢排程方式來分發請求到後端伺服器,配置引數

  • ip_hash:指定請求排程演算法,預設是weight權重輪詢排程,可以指定

  • server host:port:分發伺服器的列表配置

  • down:表示該主機暫停服務

  • max_fails:表示失敗最大次數,超過失敗最大次數暫停服務

  • fail_timeout:表示如果請求受理失敗,暫停指定的時間之後重新發起請求

upstream name {

      ip_hash;
      server 192.168.x.xx:8080;
      server 192.168.x.xx:8081 down;
      server 192.168.x.xx:8082 max_fails=3;
      server 192.168.x.xx:8083 fail_timeout=20s;
      server 192.168.x.xx:8084 max_fails=3 fail_timeout=20s;
}

到此為止負載均衡環境就指令碼搭建完成,那麼對外只需開放81埠,就可以了,8081,8082,8083這三個服務埠可以關掉,這樣使用者就感知到是隻訪問一個服務。

當然這個不是完美的,當81埠這個主機服務掛掉時候,那整個服務就掛了,所以需要有備機服務,在多個機器上搭建備機服務(和主機服務環境一致),同樣可以設定權重
這樣多個機器,其中某個服務機器掛了也不影響。