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,下載地址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負載均衡環境