【驚雷】Linux下Nginx+(多)Tomcat的負載均衡的詳細與實現


Linux下Nginx+(多)Tomcat的負載均衡的詳細與實現

一、簡介

【Nginx】 大名鼎鼎,麻雀雖小五臟俱全,它擁有小而穩且高效的特性。為目前大多數中小企業所使用。nginx可以做以下幾件事:

  • 反向代理
  • 負載均衡
  • 動靜分離
  • 網頁、圖片緩存

這里長話短說了,它更加詳細的介紹參考:https://baike.baidu.com/item/nginx/3817705?fr=aladdin

【Tomcat】 是一個免費開放源代碼的 Web 應用服務器,具有開源免費、容易安裝、 容易使用、占用資源小、易於和其他軟件集成等優點。Tomcat 很受廣大程序員的喜歡,因為它運行時占用的系統資源小,擴展性好,支持負載平衡與郵件服務等開發應用系統常用的功能;而且它還在不斷的改進和完善中,任何一個感興趣的程序員都可以更改它或在其中加入新的功能。

更長詳細解析請參考:http://www.baike.com/wiki/tomcat

【N+T的負載均衡】

然而他們的組合將是一把無與倫比的利刃。首先說明一下它的請求原理(路徑走向)

Nginx作為反向代理服務器,實現負載均衡。首先瀏覽器發起請求,到達Nginx,由Nginx將請求地址轉發給相應的tomcat服務器,再由tomcat服務器將結果返回給Nginx,Nginx將結果再轉發給瀏覽器。

下面上圖:

圖中的信息顯而易見,以nginx服務器作為中轉分發請求,以達到負載均衡的目的。

二、環境需求

【由於博主的主機(臉紅~)配置低,所以只開一開虛擬機作為這次負載均衡的測試。一個ip三個端口既可實現上圖所述的效果了】

主機A:192.168.0.144/24

apache-tomcat-6.0.35.tar.gz   tomcat 6  使用的主要端口:18080
apache-tomcat-7.0.82.tar.gz   tomcat 7  使用的主要端口:28080
apache-tomcat-8.5.23.tar.gz   tomcat 8  使用的主要端口: 8088
nginx-1.0.12.tar.gz
jdk7u79linuxx64.tar.gz

(其他一些基礎環境比如gcc-c++的自己補全吧)

三、各個環境的搭建

3.1 Nginx搭建

先把所有准備好的軟件工具放到一個目錄下(都先准備好必用軟件,不然配置起來才去找軟件是很煩人的)

[root@N+T lhl]# ll
total 175172
-rw-r--r-- 1 root root   9472492 Dec  1  2017 apache-tomcat-8.5.23.tar.gz
-rw-r--r-- 1 root root 153512879 Dec  7  2017 jdk7u79linuxx64.tar.gz
-rw-r--r-- 1 root root    691002 May  9  2012 nginx-1.0.12.tar.gz
-rw-r--r-- 1 root root  15692490 Nov 29  2017 Tomcat6-7.zip

    接下來安裝一下開發環境

[root@N+T lhl]# yum -y install gcc gcc-c++

 

在/usr目錄下面創建一個nginx的目錄,並把nginx包移動到該目錄下,再解壓到該目錄下面

[root@N+T lhl]# mkdir -p /usr/nginx
[root@N+T lhl]# mv nginx-1.0.12.tar.gz /usr/nginx/ &&cd /usr/nginx/&&tar -zxvf nginx-1.0.12.tar.gz 

最好進入nginx-1.0.12目錄,再編譯安裝

[root@N+T nginx-1.0.12]# ./configure &&make &&make install

一般編譯安裝都默認在/usr/local/nginx/ 目錄下面 ,下面這個就是nginx的主程序。

[root@N+T sbin]# ll /usr/local/nginx/sbin/nginx 
-rwxr-xr-x 1 root root 954836 Aug 16 04:43 /usr/local/nginx/sbin/nginx

本博文為了搭建的方便直接把這個主程序拉倒/usr/bin/ 目錄下了

[root@N+T sbin]# cp -a /usr/local/nginx/sbin/nginx /usr/bin/

下面是配置文件

[root@N+T sbin]# ll /usr/local/nginx/conf/nginx.conf

簡單的配置了一下配置文件

#####nginx+3 T 負載均衡測試############
#####最簡化的配置文件了--############### user nobody; #對於用戶有安全性限制的伙伴可以創建一個賬戶去使用 worker_processes
1; events { use epoll; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 60; #簡單文本顯示格式編輯 fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 8 128k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_temp_path /dev/shm; server{ listen 80; server_name localhost; access_log /var/log/nginx/aeecss.log; error_log /var/log/nginx/error.log; location / { proxy_pass http://li7105.com; proxy_redirect default; } } }

下面運行nginx,查看信息

[root@N+T sbin]# /usr/bin/nginx -c /usr/local/nginx/conf/nginx.conf
[root@N+T sbin]# ps -ef | grep nginx
root       1561      1  0 13:04 ?        00:00:00 nginx: master process /usr/bin/nginx -c /usr/local/nginx/conf/nginx.conf
www        1562   1561  0 13:04 ?        00:00:00 nginx: worker process                             
root       1709   1573  0 18:49 pts/1    00:00:00 grep --color nginx

注意:nginx沒有啟動起來,麻煩去認真的檢查一下nginx配置文件。

PS:開機機動啟動的話,直接把啟動代碼丟進rc.local這個文件里面即可。

[root@N+T lhl]# echo "/usr/bin/nginx  -c /usr/local/nginx/conf/nginx.conf"  >> /etc/rc.d/rc.local 

nginx的基本部署完成!

3.2 Tomcat 的搭建

由於tomcat依賴於jdk環境下運行,所以先搭建jdk環境,配置變量環境

[root@N+T lhl]# mkdir /usr/java/
[root@N+T lhl]# mv jdk7u79linuxx64.tar.gz /usr/java/ && cd /usr/java/ && tar -zxvf jdk7u79linuxx64.tar.gz
[root@N+T java]# ll
total 4
drwxr-xr-x 8 uucp 143 4096 Apr 11  2015 jdk1.7.0_79
[root@N+T java]# cd jdk1.7.0_79/
[root@N+T jdk1.7.0_79]# pwd  #看清楚路徑
/usr/java/jdk1.7.0_79
[root@N+T jdk1.7.0_79]# 

PS:關於軟件依賴的變量環境

就目前來去為一個軟件或者環境的運行去搭建變量環境主要用下面三種方法

1、在/etc/profile下配置,這屬於大環境的配置了。不過管理上不靈活,屬於點到面的管理(本博文由於只有這個tomcat用到,所以在這配置了)

2、在/etc/profile.d/目錄下面創建一個專屬的變量環境如:tomcat.sh  在里面指的變量路徑以及文件路徑,這種方式管理很靈活,屬於點到點的管理。

3、在軟件的某個文本下面去直接添加指定的變量環境,如tomcat的。

[root@N+T bin]# pwd
/usr/tomcatG/tomcat6/bin
[root@N+T bin]# ll
total 612
-rw-r--r-- 1 root root  22705 Nov 28  2011 bootstrap.jar
-rw-r--r-- 1 root root  11830 Nov 28  2011 catalina.bat
-rwxr-xr-x 1 root root  17708 Nov 28  2011 catalina.sh
-rw-r--r-- 1 root root   2374 Nov 28  2011 catalina-tasks.xml
-rw-r--r-- 1 root root  24172 Nov 28  2011 commons-daemon.jar
-rw-r--r-- 1 root root 199623 Nov 28  2011 commons-daemon-native.tar.gz
-rw-r--r-- 1 root root   1342 Nov 28  2011 cpappend.bat
-rw-r--r-- 1 root root   2108 Nov 28  2011 digest.bat
-rwxr-xr-x 1 root root   1689 Nov 28  2011 digest.sh
-rw-r--r-- 1 root root   3150 Nov 28  2011 setclasspath.bat
-rwxr-xr-x 1 root root   4153 Aug 16 10:57 setclasspath.sh ###在這個文件里面指定變量環境
-rw-r--r-- 1 root root   2108 Nov 28  2011 shutdown.bat
-rwxr-xr-x 1 root root   1628 Nov 28  2011 shutdown.sh
-rw-r--r-- 1 root root   2109 Nov 28  2011 startup.bat
-rwxr-xr-x 1 root root   2023 Nov 28  2011 startup.sh
-rw-r--r-- 1 root root  32277 Nov 28  2011 tomcat-juli.jar
-rw-r--r-- 1 root root 249259 Nov 28  2011 tomcat-native.tar.gz
-rw-r--r-- 1 root root   3479 Nov 28  2011 tool-wrapper.bat
-rwxr-xr-x 1 root root   3472 Nov 28  2011 tool-wrapper.sh
-rw-r--r-- 1 root root   2113 Nov 28  2011 version.bat
-rwxr-xr-x 1 root root   1632 Nov 28  2011 version.sh
[root@N+T bin]# 

setclasspath.sh  里面指定。軟件的不同在不同的文件指定吧,這個可以在度娘查到。第三種辦法一般很少用到。

繼續!下面在/etc/profile下配置變量環境

export JAVA_HOME=/usr/java/jdk1.7.0_79/  #路徑別弄錯
export JAVA_BIN=$JAVA_HOME/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

最后直接執行,使得文件profile生效

[root@N+T /]# source /etc/profile

接着執行 java -version  命令即可看到對應的版本號,說明已經生效了。(在這里有些小伙伴會時常出現一個問題,明明tomcat已經實在用這個

jdk版本了,可是輸入命令java -version 顯示出來的卻不是目前tomcat在用的jdk版本,這時候該注意一下查看tomcat下面的comment目錄下的jdk版本是否對應的,不是的話。就把jdk下的替換過去,另外我還有尋找另外一種解決辦法,希望各位賜教。)

jdk部署完畢!

3.3 tomcat 的搭建

在/usr 下創建tomcatG 的目錄,並且把三個版本的tomcat拉到目錄下分別改名為tomcat6、tomcat7、tomcat8。最后分別解壓,再修改server.xml  文檔的端口

[root@N+T tomcatG]# ll
total 12
drwxr-xr-x 9 root root 4096 Aug 16 10:27 tomcat6
drwxr-xr-x 9 root root 4096 Aug 16 10:49 tomcat7
drwxr-xr-x 9 root root 4096 Aug 16 11:11 tomcat8
[root@N+T tomcatG]# 

下面修改tomcat6的server.xml文件:三處地方

1、

<Connector port="18080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />

2、

<Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />

3、

<Server port="18005" shutdown="SHUTDOWN">

剩下的tomcat7和tomcat8以此類推!

下面啟動tomcat6-8

啟動tomcat6:

[root@N+T bin]# pwd
/usr/tomcatG/tomcat6/bin
[root@N+T bin]# ll
total 612
-rw-r--r-- 1 root root  22705 Nov 28  2011 bootstrap.jar
-rw-r--r-- 1 root root  11830 Nov 28  2011 catalina.bat
-rwxr-xr-x 1 root root  17708 Nov 28  2011 catalina.sh
-rw-r--r-- 1 root root   2374 Nov 28  2011 catalina-tasks.xml
-rw-r--r-- 1 root root  24172 Nov 28  2011 commons-daemon.jar
-rw-r--r-- 1 root root 199623 Nov 28  2011 commons-daemon-native.tar.gz
-rw-r--r-- 1 root root   1342 Nov 28  2011 cpappend.bat
-rw-r--r-- 1 root root   2108 Nov 28  2011 digest.bat
-rwxr-xr-x 1 root root   1689 Nov 28  2011 digest.sh
-rw-r--r-- 1 root root   3150 Nov 28  2011 setclasspath.bat
-rwxr-xr-x 1 root root   4153 Aug 16 10:57 setclasspath.sh
-rw-r--r-- 1 root root   2108 Nov 28  2011 shutdown.bat
-rwxr-xr-x 1 root root   1628 Nov 28  2011 shutdown.sh  #這是停止
-rw-r--r-- 1 root root   2109 Nov 28  2011 startup.bat
-rwxr-xr-x 1 root root   2023 Nov 28  2011 startup.sh  #啟動
-rw-r--r-- 1 root root  32277 Nov 28  2011 tomcat-juli.jar
-rw-r--r-- 1 root root 249259 Nov 28  2011 tomcat-native.tar.gz
-rw-r--r-- 1 root root   3479 Nov 28  2011 tool-wrapper.bat
-rwxr-xr-x 1 root root   3472 Nov 28  2011 tool-wrapper.sh
-rw-r--r-- 1 root root   2113 Nov 28  2011 version.bat
-rwxr-xr-x 1 root root   1632 Nov 28  2011 version.sh
[root@N+T bin]# ./startup.sh 

如圖所示!

tomcat 7-8以此類推!

再看一下三個tomcat啟動的進程。

[root@N+T bin]# ps -ef |grep tomcat
root       1278      1  0 13:50 ?        00:00:10 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/tomcatG/tomcat7/endorsed -classpath /usr/tomcatG/tomcat7/bin/bootstrap.jar:/usr/tomcatG/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/usr/tomcatG/tomcat7 -Dcatalina.home=/usr/tomcatG/tomcat7 -Djava.io.tmpdir=/usr/tomcatG/tomcat7/temp org.apache.catalina.startup.Bootstrap start start
root       1287      1  0 13:50 ?        00:00:13 /usr/java/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/tomcatG/tomcat8/bin/bootstrap.jar:/usr/tomcatG/tomcat8/bin/tomcat-juli.jar -Dcatalina.base=/usr/tomcatG/tomcat8 -Dcatalina.home=/usr/tomcatG/tomcat8 -Djava.io.tmpdir=/usr/tomcatG/tomcat8/temp org.apache.catalina.startup.Bootstrap start start
root       1301      1  0 13:50 ?        00:00:08 /usr/java/jdk1.7.0_79/jre/bin/java -Djava.util.logging.config.file=/usr/tomcatG/tomcat6//conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/tomcatG/tomcat6//endorsed -classpath /usr/tomcatG/tomcat6//bin/bootstrap.jar -Dcatalina.base=/usr/tomcatG/tomcat6/ -Dcatalina.home=/usr/tomcatG/tomcat6/ -Djava.io.tmpdir=/usr/tomcatG/tomcat6//temp org.apache.catalina.startup.Bootstrap start
root       1509   1418  0 15:02 pts/0    00:00:00 grep --color tomcat
[root@N+T bin]# 

可以看到,各個端口以及運行的變量環境(jdk)這個排版比較長,需要往后面拉取才能看到所有內容。

3.4 配置負載均衡

在nginx里面添加幾條代碼即可,下面請看

#####nginx+3 T 負載均衡測試############
user nobody;
worker_processes 1;

events {
    use epoll;
    worker_connections  1024;
    }


http


{
    include       mime.types;
    default_type  application/octet-stream;


     sendfile        on;

     keepalive_timeout  60;
     fastcgi_connect_timeout 300;
     fastcgi_send_timeout 300;
     fastcgi_read_timeout 300;
     fastcgi_buffer_size 64k;
     fastcgi_buffers 8 128k;
     fastcgi_busy_buffers_size 128k;
     fastcgi_temp_file_write_size 128k;
     fastcgi_temp_path /dev/shm;

   upstream li7105.com {              #在此插入
   server 127.0.0.1:18080 weight=1;   #tomcat6分流    weight=1  這是權重分配。
   server 127.0.0.1:28080 weight=2;   #tomcat7分流    weight=2 顯然2更大,那么它被分配任務的幾率也就更大
   server 127.0.0.1:8088 weight=2;    #tomcat8分流
           }



    server{

        listen       80;
        server_name  localhost;
        access_log /var/log/nginx/aeecss.log;
        error_log  /var/log/nginx/error.log;
        location / {
                proxy_pass  http://li7105.com;
                proxy_redirect default;
          }

        }
}

 【關於nginx的負載均衡的分配方式】

nginx關於這個負載均衡方面的權重分配方式有4種:

   1.輪詢,默認采取此方式,Nginx會按照請求時間的先后順序進行輪詢分發,若某台Web Server宕機,Nginx自動將其摘掉。

   2.weight,權重,即輪詢的幾率,值越大,被分發的可能性越大,用於后端服務器性能不均的情況。

   3.ip_hash,每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決共享session的問題。

   4.自定義規則

 PS:     

  down 表示當前的Web Server暫時不參與負載 
  weight  默認為1.weight越大,負載的權重就越大。 
  backup: 其它所有的非backup Server down或者忙的時候,請求backup機器。所以這台機器壓力會最輕。

四、負載均衡的測試

為了是的測試的效果明了些,我把/usr/tomcatG/tomcat6/webapps/ROOT 目錄下的index.jsp 文件的內容全部刪除掉,直接改為tomcat6 ,7-8一樣如此。

 

[root@N+T ROOT]# cat index.jsp 
I am Tomcat 6666666666666!

 

在測試之前需要檢查一下,下面幾個個問題。確保沒問題了,就去測試,不然返回來做無用功了。

1、nginx、tomcat、jdk正在運行

2、網頁上能夠哦正常訪問nginx 和  tomcat

3、防火牆

我就在本地主機上面的瀏覽器測試吧,因為跟物理機是連通的。

在瀏覽器輸入:http://192.168.0.144/index.jsp  然后不停按F5刷新網頁,接着網頁會不停的在tomcat6、tomcat7、tomcat8的內容標識上面做跳轉,顯示的內容也會不一樣。

如圖:

 

 

不停的刷新,看着頁面的變化。你會發現權重等於1的tomcat6出現的次數會比tomcat7和tomcat8的次數很多的。

上面只是個簡單的測試,有興趣的伙伴可以添加去修改這個jsp文檔,哈哈。

上述圖片說明了nginx的負載均衡是正在運行中的了。測試完畢!

五、總結

 在搭建這個環境需要注意的幾點:

1、tomcat的端口,由於是在一台機器上面部署3個tomcat,所以改的端口就有9個了。主機端口的范圍,超出范圍不然tomcat是無法啟動的

2、jdk變量環境的搭建,注意路徑。

3、nginx 配置文檔的參數、模塊注意編寫。不然無法啟動

4、注意防火牆設置,對於需求安全性的伙伴們。當然測試你可以完全的關閉掉。

 

nginx和tomcat的負載均衡,基本配置完畢,這類型的負載均衡目前在很多的企業被使用。然而這僅僅是企業網絡架構中的一個小小的部分,我期待后面能夠給大家講述更多關於這方面的知識。

【上述博文,若有不當之處。還望各位不吝指出】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM