Nginx+Tomcat反向代理負(fù)載均衡集群部署指南
Nginx是一種服務(wù)器軟件减俏,也是一種高性能的http和反向代理服務(wù)器召烂,同時(shí)還是一個(gè)代理郵件服務(wù)器。也就是說(shuō)娃承,我們?cè)贜ginx上可以發(fā)布網(wǎng)站奏夫,可以實(shí)現(xiàn)負(fù)載均衡(提高應(yīng)答效率,避免服務(wù)器崩潰)历筝,還可以作為郵件服務(wù)器實(shí)現(xiàn)收發(fā)郵件等功能酗昼。而最常見(jiàn)的就是使用Nginx實(shí)現(xiàn)負(fù)載均衡。
Nginx與其他服務(wù)器的性能比較:
Tomcat服務(wù)器面向Java語(yǔ)言梳猪,是重量級(jí)的服務(wù)器麻削,而Nginx是輕量級(jí)的服務(wù)器。Apache服務(wù)器穩(wěn)定春弥、開(kāi)源呛哟、跨平臺(tái),但是Apache服務(wù)器不支持高并發(fā)匿沛,Nginx能支持處理百萬(wàn)級(jí)的TCP連接扫责,10萬(wàn)以上的并發(fā)連接,并且是一個(gè)很好的跨平臺(tái)服務(wù)器俺祠。
Nginx主要優(yōu)點(diǎn)有可以實(shí)現(xiàn)高并發(fā)、部署簡(jiǎn)單借帘、內(nèi)存消耗少蜘渣、成本低等,主要缺點(diǎn)有rewrite功能不夠強(qiáng)大肺然,模塊沒(méi)有Apache的多蔫缸。
本篇主要講解 Nginx + Tomcat 反向代理和負(fù)載均衡的部署,以通俗實(shí)用為主际起。本篇文章每個(gè)部分之間沒(méi)有太大關(guān)系拾碌,可根據(jù)需求分開(kāi)學(xué)習(xí)。
下來(lái)看一下Nginx反向代理的過(guò)程:
Nginx負(fù)載均衡的過(guò)程(會(huì)自動(dòng)選擇壓力較小的服務(wù)器進(jìn)行訪問(wèn)):
可以看出街望,負(fù)載均衡是通過(guò)反向代理的原理實(shí)現(xiàn)的校翔,所以也稱 反向代理的負(fù)載均衡 。所以我們會(huì)部署負(fù)載均衡灾前,那么反向代理也就會(huì)了防症。
總的來(lái)說(shuō),負(fù)載均衡實(shí)現(xiàn)的方式分為軟件實(shí)現(xiàn)和硬件實(shí)現(xiàn)兩種,硬件實(shí)現(xiàn)運(yùn)行的效率非常高蔫敲,但是對(duì)應(yīng)的成本也非常高饲嗽。軟件實(shí)現(xiàn)運(yùn)行效率不如硬件,但是成本相對(duì)來(lái)說(shuō)低得多奈嘿。而使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡貌虾,那么就是通過(guò)軟件的方式來(lái)實(shí)現(xiàn)負(fù)載均衡,并且Nginx本身支持高并發(fā)等裙犹。故而使用Nginx服務(wù)器實(shí)現(xiàn)負(fù)載均衡尽狠,能大大節(jié)約企業(yè)的成本,并且由于Nginx是服務(wù)器軟件伯诬,其執(zhí)行效率也是非常高晚唇。本篇的目的也就是幫助大家使用Nginx實(shí)現(xiàn)負(fù)載均衡。
負(fù)載均衡的核心就是建立一個(gè)服務(wù)器集群盗似,然后用戶首先訪問(wèn)到第三方代理服務(wù)器(這里我們選用Nginx)哩陕,然后由代理服務(wù)器選擇一個(gè)集群中的服務(wù)器,然后將請(qǐng)求引入選定的服務(wù)器(這里我們選用Tomcat)赫舒。
如下圖悍及,通過(guò)反向代理我們實(shí)現(xiàn)下面的負(fù)載均衡,這里我們 假定 四臺(tái)服務(wù)器公網(wǎng)的ip接癌,一臺(tái)做代理服務(wù)器心赶,三臺(tái)做負(fù)載均衡下的服務(wù)器:
好了,整體架構(gòu)已經(jīng)基本上清晰了缺猛,下來(lái)我們來(lái)具體實(shí)現(xiàn)下:
提示:本篇我們基本上都是使用SSH進(jìn)行相關(guān)操作的缨叫,Windows下可以嘗試安裝PuTTY,Mac下直接使用系統(tǒng)自帶的終端工具即可荔燎。
1.Linux下搭建Nginx服務(wù)器
我們?cè)?192.168.2.20 這臺(tái)服務(wù)器上搭建Nginx服務(wù)器:
1)下載Nginx: http://nginx.org/
2)上傳服務(wù)器Nginx安裝包
$ scp ~/Downloads/nginx-1.10.2.tar.gz root@192.168.2.20:/usr/local
3)安裝Nginx
$ ssh root@192.168.2.20 //SSH連接
# yum -y install gcc gcc-c++ autoconf automake //gcc耻姥、gcc-c++的庫(kù)文件
# yum install -y pcre pcre-devel //安裝Nginx依賴包
# yum install -y zlib zlib-devel
注意:-y表示遇到判斷全部yes,autoconf表示自動(dòng)配置有咨,automake表示自動(dòng)編譯琐簇。
# cd /usr/local
# tar -zxvf nginx-1.10.2.tar.gz //解壓縮
# cd nginx-1.10.2 //切換到該目錄下
# ./configure //配置
# make
# make install //安裝
檢驗(yàn)是否完成安裝:
# cd /usr/local
# ls //如果存在nginx文件夾,則安裝成功
經(jīng)過(guò)上面的安裝步驟和目錄設(shè)置座享,nginx的啟動(dòng)程序就是/usr/local/nginx/sbin/nginx婉商,默認(rèn)配置文件是/usr/local/nginx/conf/nginx.conf,但是不建議直接編輯nginx.conf渣叛,一般我們都選擇新建配置文件丈秩,然后在新建的配置文件中修改端口、反向代理路徑等淳衙。
2.Nginx的啟動(dòng)癣籽、停止挽唉、信號(hào)控制
1)啟動(dòng)Nginx服務(wù)器(格式:Nginx可執(zhí)行文件 -c Nginx配置文件):
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
2)停止Nginx服務(wù)器:
停止Nginx服務(wù)器首先要查詢Nginx的主進(jìn)程號(hào)(master process),假設(shè)此處查詢得到1060(方便下面演示使用):
# ps -ef|grep nginx
下來(lái)看如何停止Nginx服務(wù)器筷狼,停止Nginx有三種方式:
從容停止:
# ps -ef|grep nginx //查看Nginx的主進(jìn)程號(hào)(master process)瓶籽,假設(shè)此處查詢得到1060
# kill -quit 1060
快速停止:
# kill -term 1060
強(qiáng)制停止:
# pkill -9 nginx
3)重啟Nginx服務(wù)器:
當(dāng)我們修改了Nginx配置文件,需要重啟才能生效埂材。我們?cè)谥貑⒅斑€需要驗(yàn)證配置文件的正確性塑顺,然后進(jìn)行重啟操作:
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf //驗(yàn)證
# /usr/local/nginx/sbin/nginx -s reload //重啟
4)平滑升級(jí)Nginx服務(wù)器
平滑升級(jí)不會(huì)停掉在運(yùn)行著的進(jìn)程,這些進(jìn)程會(huì)繼續(xù)處理請(qǐng)求俏险,但不會(huì)再接受新請(qǐng)求严拒,在這些老進(jìn)程在處理完還在處理的請(qǐng)求后,停止竖独。此平滑升級(jí)的過(guò)程中裤唠,新開(kāi)的進(jìn)程會(huì)被處理。這就是平滑升級(jí)莹痢。
# /usr/local/nginx/sbin/nginx -v //查看當(dāng)前版本
下面進(jìn)行平滑升級(jí):
# cd /usr/local
# tar -zxvf nginx-1.11.6.tar.gz //解壓縮 新版本Nginx
# cd nginx-1.11.6 //切換到該目錄下
# ./configure //配置
# make
# cd /usr/local/nginx/sbin //打開(kāi) 舊版本Nginx可執(zhí)行文件位置
# cp nginx nginx.old //備份 舊版本Nginx可執(zhí)行文件种蘸,防止升級(jí)錯(cuò)誤而無(wú)法恢復(fù)
# cp -rfp /usr/local/nginx-1.11.6/objs/nginx /usr/local/nginx/sbin //復(fù)制新版本可執(zhí)行文件到舊版本處
# rm -f /usr/local/nginx-1.11.6.tar.gz //善后工作 刪除壓縮文件
# rm -rf /usr/local/nginx-1.11.6 //刪除文件夾
至此,Nginx服務(wù)器平滑升級(jí)成功竞膳。
3.Nginx中負(fù)載均衡的實(shí)現(xiàn)
我們還是先連接SSH航瞭,然后進(jìn)行下面操作(一般不建議修改默認(rèn)主配置文件nginx.conf,所以我們新建負(fù)載均衡配置文件fzjh.conf坦辟,保證服務(wù)器安全刊侯,如下):
# cd /usr/local/nginx/conf
# touch fzjh.conf
# vi fzjh.conf //用vi編輯器打開(kāi)文件,然后按鍵盤(pán)的i
注意:vi編輯器中锉走,鍵盤(pán)按 i 進(jìn)入 INSERT 狀態(tài)滨彻,按 Esc 退出 INSERT 狀態(tài)。
然后輸入以下配置代碼(注釋部分按需開(kāi)啟):
#設(shè)置低權(quán)限用戶挪蹭,為了安全而設(shè)置的
user nobody;
#工作衍生進(jìn)程數(shù)
worker_processes 4;
#設(shè)置錯(cuò)誤文件存放路徑
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#設(shè)置pid存放路徑(pid是控制系統(tǒng)中重要文件)
#pid logs/nginx.pid;
#設(shè)置最大連接數(shù)
events{
worker_connections 1024;
}
http{
#主要是用于設(shè)置一組可以在proxy_pass和fastcgi_pass指令中使用額代理服務(wù)器亭饵,默認(rèn)負(fù)載均衡方式為輪詢
upstream tomcat_client {
#設(shè)置同一個(gè)cookie的兩次/多次請(qǐng)求,請(qǐng)求的是同一臺(tái)服務(wù)器
ip_hash;
#weight權(quán)重嚣潜,默認(rèn)1冬骚,權(quán)重越大訪問(wèn)概率越大椅贱,backup備用服務(wù)器懂算,服務(wù)器全部崩潰后啟動(dòng)
server 192.168.2.21:8080 weight=5;
server 192.168.2.22:8080 weight=5;
server 192.168.2.23:8080 weight=5 backup;
}
#開(kāi)啟gzip壓縮,開(kāi)啟后庇麦,訪問(wèn)網(wǎng)頁(yè)會(huì)自動(dòng)壓縮
#gzip on;
#指定服務(wù)器的名稱和參數(shù)
server {
listen 80;
server_name test.nginxtest.net;
#設(shè)置字符
#charset koi8-r;
#location / 指用根目錄做負(fù)載均衡
location / {
proxy_pass http://tomcat_client;
proxy_redirect default;
#設(shè)置代理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
輸入完成后按下Esc计技,然后輸入:
:wq!
就可以保存并退出負(fù)載均衡的配置文件了,下來(lái)我們加載我們的配置文件:
# /usr/local/nginx/sbin/nginx //啟動(dòng)Nginx
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fzjh.conf //加載配置文件
如果存在端口占用山橄,可以使用如下命令Kill掉Nginx的程序:
# killall -9 nginx
至此垮媒,Nginx服務(wù)器部署完畢。下面我們開(kāi)始部署負(fù)載均衡下的那三臺(tái)真實(shí)提供數(shù)據(jù)的服務(wù)器。
4.Linux下安裝jdk
我們?cè)?92.168.2.21睡雇、192.168.2.22萌衬、192.168.2.23這三臺(tái)服務(wù)器安裝jdk,以192.168.2.21為例:
1)下載jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html
2)上傳服務(wù)器jdk安裝包
$ scp ~/Downloads/jdk-8u112-linux-x64.tar.gz root@192.168.2.21:/usr/local
3)安裝jdk
$ ssh root@192.168.2.21 //SSH連接
# cd /usr/local
# tar -zxvf jdk-8u112-linux-x64.tar.gz //解壓縮
# mv jdk1.8.0_112/ jdk //將jdk1.8.0_112重命名為jdk
# vi /etc/profile //用vi編輯器打開(kāi)文件它抱,然后按鍵盤(pán)的i
下來(lái)我們移動(dòng)光標(biāo)至最后面秕豫,兩個(gè)回車換行,然后添加下面代碼配置java的環(huán)境變量:
JAVA_HOME='/usr/local/jdk'
CLASS_PATH='$JAVA_HOME/lib:$JAVA_HOME/jre/lib'
PATH='.:$PATH:$JAVA_HOME/bin'
CATALINA_HOME='/usr/local/tomcat'
export JAVA_HOME CATALINA_HOME
輸入完成后按下Esc观蓄,然后輸入:
:wq!
就可以保存并退出了混移。此時(shí)我們想讓其立即生效,則需要繼續(xù)輸入命令:
# source /etc/profile
此時(shí)profile文件就更新了侮穿,此時(shí)環(huán)境變量就配置成功了歌径。下面我們驗(yàn)證一下jdk是否安裝配置成功:
# java -version
如果返回java版本號(hào)則安裝成功。
5.Linux下搭建Tomcat服務(wù)器
我們?cè)?92.168.2.21亲茅、192.168.2.22回铛、192.168.2.23這三臺(tái)服務(wù)器搭建Tomcat服務(wù)器,以192.168.2.21為例:
1)下載Tomcat http://tomcat.apache.org/
2)上傳服務(wù)器Tomcat安裝包
$ scp ~/Downloads/apache-tomcat-8.5.9.tar.gz root@192.168.2.21:/usr/local
3)安裝Tomcat
$ ssh root@192.168.2.21 //SSH連接
# cd /usr/local
# tar -zxvf apache-tomcat-8.5.9.tar.gz //解壓縮
# mv apache-tomcat-8.5.9/ tomcat //將apache-tomcat-8.5.9重命名為tomcat
4)設(shè)置Tomcat網(wǎng)頁(yè)文件目錄
Tomcat默認(rèn)網(wǎng)頁(yè)文件的路徑是 /usr/local/tomcat/webapps/ROOT芯急,但是一般我們不在這里存放勺届,我們?cè)贚inux根目錄新建 data/wwwroot 目錄:
# mkdir /data //新建目錄
# mkdir /data/www
# mkdir /data/www/ROOT
# cd /usr/local/tomcat/conf
# vi server.xml //用vi編輯器打開(kāi)server.xml配置文件,打開(kāi)后鍵盤(pán)按i
我們找到Host節(jié)點(diǎn)下的appBase=”webapps”娶耍,修改為:
appBase='/data/www'
輸入完成后按下Esc免姿,然后輸入:
:wq!
就可以保存并退出配置文件了,然后重啟Tomcat即可生效榕酒,此時(shí)Tomcat的網(wǎng)頁(yè)文件目錄就變成了 /data/www/ROOT 了胚膊。
配置Tomcat環(huán)境變量,我們?cè)谂渲胘dk的時(shí)候已經(jīng)配置好了想鹰,可以回頭看一下紊婉。
6.Tomcat的啟動(dòng)、停止
1)啟動(dòng)Tomcat服務(wù)器
# /usr/local/tomcat/bin/startup.sh
2)停止Tomcat服務(wù)器:
# /usr/local/tomcat/bin/shutdown.sh
到此辑舷,Nginx + Tomcat 負(fù)載均衡 集群 已經(jīng)部署完畢了喻犁。不過(guò)有了服務(wù)器,肯定也少不了數(shù)據(jù)庫(kù)何缓,下面拓展一下Linux下安裝MySQL數(shù)據(jù)庫(kù)的方法肢础。
7.Linux下安裝MySQL數(shù)據(jù)庫(kù)
我們重新找了 192.168.2.30 這臺(tái)服務(wù)器上MySQL數(shù)據(jù)庫(kù):
1)下載MySQL數(shù)據(jù)庫(kù) http://dev.mysql.com/downloads/mysql/
2)上傳MySQL數(shù)據(jù)庫(kù)安裝包
$ scp ~/Downloads/mysql-5.1.51.tar.gz root@192.168.2.30:/usr/local
3)安裝MySQL
$ ssh root@192.168.2.30 //SSH連接
# groupadd mysql //建立mysql的組
# useradd mysql -g mysql //增加用戶mysql到mysql的組中
# yum list|grep ncurses
# yum -y install ncurses-devel
# yum install ncurses-devel
# cd /usr/local
# tar -zxvf mysql-5.1.51.tar.gz //解壓縮
# cd mysql-5.1.51
# ./configure --prefix=/usr/local/mysql --with-mysqld-ldflags=-all-static --with-client-ldflags=-all-static --with-readline --with-sll
//配置,設(shè)置安裝路徑碌廓,設(shè)置編譯mysql不帶共享庫(kù)传轰,設(shè)置編譯client不帶共享庫(kù),設(shè)置要以rmp的方式安裝tar包谷婆,設(shè)置以rmp的方式安裝opensll
# make
# make install //安裝慨蛙,在make[4]的時(shí)候等待時(shí)間比較長(zhǎng)辽聊,幾分鐘到十幾分鐘,都是正称谄叮現(xiàn)象
# /usr/local/mysql/bin/mysql_install_db --user //對(duì)安裝好的MySQL進(jìn)行初始化
# cp ./support-files/mysql.server /etc/init.d/mysql //將MySQL啟動(dòng)服務(wù)復(fù)制到系統(tǒng)中并重命名為mysql
# cp ./support-files/my-medium.cnf /etc/my.cnf //復(fù)制規(guī)則文件
# chmod 755 /etc/init.d/mysql //更改文件權(quán)限
//文件權(quán)限由三個(gè)數(shù)字組成跟匆,第一位:文件擁有者的權(quán)限,第二位:文件擁有者同組的人的權(quán)限通砍,第三位:文件擁有者非同組人的權(quán)限
//7:可讀可寫(xiě)可執(zhí)行贾铝,5:可讀可執(zhí)行
# cd /usr/local/mysql
# chown -R mysql . //將 /usr/local/mysql 的擁有者更改為mysql
# chgrp -R mysql . //將 /usr/local/mysql 歸到mysql組中
# ps -ef|grep mysql
# kill -9 3632 //將mysql所有進(jìn)程號(hào)依次殺死,這里假定是3632
# /usr/local/mysql/bin/mysql_install_db --user=mysql //再次初始化
# service mysql start //啟動(dòng)MySQL
# /usr/local/mysql/bin/mysqladmin -u root pass<A class=keylink target=_blank>word</A> '123456' //設(shè)置MySQL密碼
到此MySQL就安裝成功了埠帕,下來(lái)我們測(cè)試一下:
# /usr/local/mysql/bin/mysql -u root -p
如果輸入密碼后可以登進(jìn)MySQL垢揩,那么就測(cè)試成功。下面我們?cè)O(shè)置MySQL允許開(kāi)啟遠(yuǎn)程連接:
# /usr/local/mysql/bin/mysql -u root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
//創(chuàng)建用戶用于遠(yuǎn)程連接(root:用戶名敛瓷,%:所有電腦都可以連接叁巨,也可以設(shè)置某個(gè)ip地址運(yùn)行連接,123456:密碼)
mysql> flush privileges; //立即生效
下面我們查詢一下數(shù)據(jù)庫(kù)的用戶:
mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
mysql> q //登出
找一臺(tái)電腦測(cè)試一下呐籽,使用Navicat遠(yuǎn)程登錄MySQL锋勺,登進(jìn)成功。
本篇文章到此結(jié)束狡蝶。