Linux下Nginx+(多)Tomcat的負載均衡的詳細與實現 一、簡介 【Nginx】 大名鼎鼎,麻雀雖小五臟俱全,它擁有小而穩且高效的特性。為目前大多數中小企業所使用。nginx可以做以下幾件事: 反向代理 負載均衡 動靜分離 網頁、圖片緩存 這裡長話短說了,它更加詳細的介紹親參考:https ...
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的負載均衡,基本配置完畢,這類型的負載均衡目前在很多的企業被使用。然而這僅僅是企業網路架構中的一個小小的部分,我期待後面能夠給大家講述更多關於這方面的知識。
【上述博文,若有不當之處。還望各位不吝指出】