1. 程式人生 > >Linux學習10-CentOS搭建nginx負載均衡環境

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

ftp服務 監聽端口 環境 dex 結構 .html 客戶 temp 修改

前言

當自己的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,下載地址wget 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
[root@yoyo ~]# cd ..
[root@yoyo local]# cd /usr/local
[root@yoyo local]# mkdir tomcat
[root@yoyo local]# cd tomcat/
[root@yoyo tomcat]# wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz
[root@yoyo tomcat]# tar -zxf apache-tomcat-8.5.35.tar.gz

# 下載解壓後,復制三個一樣的文件apache-tomcat-1、apache-tomcat-2、apache-tomcat-3
[root@yoyo tomcat]# mv apache-tomcat-8.5.35 apache-tomcat-1
[root@yoyo tomcat]# cp -r apache-tomcat-1 apache-tomcat-2
[root@yoyo 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, 看到如下提示,說明正常啟動了

[root@yoyo tomcat]# cd /usr/local/tomcat/apache-tomcat-1/bin/
[root@yoyo 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.
[root@yoyo bin]# 

[root@yoyo tomcat]# cd /usr/local/tomcat/apache-tomcat-2/bin/
[root@yoyo bin]# ./startup.sh 

[root@yoyo tomcat]# cd /usr/local/tomcat/apache-tomcat-3/bin/
[root@yoyo bin]# ./startup.sh 

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

[root@yoyo 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
[root@yoyo 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文件

[root@yoyo conf]# cd /usr/local/nginx/sbin/
[root@yoyo 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.190.48:8081;
            server  47.104.190.48:8082;
            server  47.104.190.48: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文件

[root@yoyo conf]# cd /usr/local/nginx/sbin/
[root@yoyo sbin]# ./nginx -s reload

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

加權輪詢

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

upstream tomcats {
            server  47.104.190.48:8081 weight=1;
            server  47.104.190.48:8082 weight=2;
            server  47.104.190.48:8083 weight=3;
          }

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

ip_hash解決session共享問題

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

upstream tomcats {
            ip_hash;
            server  47.104.190.48:8081 weight=1;
            server  47.104.190.48:8082 weight=2;
            server  47.104.190.48: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 為等待應用服務器響應的超時時間,單位為秒

到此為止負載均衡環境就腳本搭建完成,那麽對外只需開放81端口,就可以了,8081,8082,8083這三個服務端口可以關掉,這樣用戶就感知到是只訪問一個服務。
當然這個不是完美的,當81端口這個主機服務掛掉時候,那整個服務就掛了,所以需要有備機服務,在多個機器上搭建備機服務(和主機服務環境一致),同樣可以設置權重
這樣多個機器,其中某個服務機器掛了也不影響。

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