詳解Nginx + Tomcat 反向代理 負載均衡 集群 部署指南
Nginx是一種服務器軟件,也是一種高性能的http和反向代理服務器,同時還是一個代理郵件服務器。也就是說,我們在Nginx上可以發(fā)布網(wǎng)站,可以實現(xiàn)負載均衡(提高應答效率,避免服務器崩潰),還可以作為郵件服務器實現(xiàn)收發(fā)郵件等功能。而最常見的就是使用Nginx實現(xiàn)負載均衡。
Nginx與其他服務器的性能比較:
Tomcat服務器面向Java語言,是重量級的服務器,而Nginx是輕量級的服務器。Apache服務器穩(wěn)定、開源、跨平臺,但是Apache服務器不支持高并發(fā),Nginx能支持處理百萬級的TCP連接,10萬以上的并發(fā)連接,并且是一個很好的跨平臺服務器。
Nginx主要優(yōu)點有可以實現(xiàn)高并發(fā)、部署簡單、內(nèi)存消耗少、成本低等,主要缺點有rewrite功能不夠強大,模塊沒有Apache的多。
本篇主要講解 Nginx + Tomcat 反向代理和負載均衡的部署,以通俗實用為主。本篇文章每個部分之間沒有太大關系,可根據(jù)需求分開學習。
下來看一下Nginx反向代理的過程:
Nginx負載均衡的過程(會自動選擇壓力較小的服務器進行訪問):
可以看出,負載均衡是通過反向代理的原理實現(xiàn)的,所以也稱 反向代理的負載均衡 。所以我們會部署負載均衡,那么反向代理也就會了。
總的來說,負載均衡實現(xiàn)的方式分為軟件實現(xiàn)和硬件實現(xiàn)兩種,硬件實現(xiàn)運行的效率非常高,但是對應的成本也非常高。軟件實現(xiàn)運行效率不如硬件,但是成本相對來說低得多。而使用Nginx服務器實現(xiàn)負載均衡,那么就是通過軟件的方式來實現(xiàn)負載均衡,并且Nginx本身支持高并發(fā)等。故而使用Nginx服務器實現(xiàn)負載均衡,能大大節(jié)約企業(yè)的成本,并且由于Nginx是服務器軟件,其執(zhí)行效率也是非常高。本篇的目的也就是幫助大家使用Nginx實現(xiàn)負載均衡。
負載均衡的核心就是建立一個服務器集群,然后用戶首先訪問到第三方代理服務器(這里我們選用Nginx),然后由代理服務器選擇一個集群中的服務器,然后將請求引入選定的服務器(這里我們選用Tomcat)。
如下圖,通過反向代理我們實現(xiàn)下面的負載均衡,這里我們 假定 四臺服務器公網(wǎng)的ip,一臺做代理服務器,三臺做負載均衡下的服務器:
好了,整體架構已經(jīng)基本上清晰了,下來我們來具體實現(xiàn)下:
提示:本篇我們基本上都是使用SSH進行相關操作的,Windows下可以嘗試安裝PuTTY,Mac下直接使用系統(tǒng)自帶的終端工具即可。
1.Linux下搭建Nginx服務器
我們在 192.168.2.20 這臺服務器上搭建Nginx服務器:
1)下載Nginx http://www.dbjr.com.cn/softs/25646.html
2)上傳服務器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++的庫文件 # yum install -y pcre pcre-devel //安裝Nginx依賴包 # yum install -y zlib zlib-devel
注意:-y表示遇到判斷全部yes,autoconf表示自動配置,automake表示自動編譯。
# cd /usr/local # tar -zxvf nginx-1.10.2.tar.gz //解壓縮 # cd nginx-1.10.2 //切換到該目錄下 # ./configure //配置 # make # make install //安裝
檢驗是否完成安裝:
# cd /usr/local # ls //如果存在nginx文件夾,則安裝成功
經(jīng)過上面的安裝步驟和目錄設置,nginx的啟動程序就是/usr/local/nginx/sbin/nginx,默認配置文件是/usr/local/nginx/conf/nginx.conf,但是不建議直接編輯nginx.conf,一般我們都選擇新建配置文件,然后在新建的配置文件中修改端口、反向代理路徑等。
2.Nginx的啟動、停止、信號控制
1)啟動Nginx服務器(格式:Nginx可執(zhí)行文件 -c Nginx配置文件):
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
2)停止Nginx服務器:
停止Nginx服務器首先要查詢Nginx的主進程號(master process),假設此處查詢得到1060(方便下面演示使用):
# ps -ef|grep nginx
下來看如何停止Nginx服務器,停止Nginx有三種方式:
從容停止:
# ps -ef|grep nginx //查看Nginx的主進程號(master process),假設此處查詢得到1060 # kill -quit 1060
快速停止:
# kill -term 1060
強制停止:
# pkill -9 nginx
3)重啟Nginx服務器:
當我們修改了Nginx配置文件,需要重啟才能生效。我們在重啟之前還需要驗證配置文件的正確性,然后進行重啟操作:
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf //驗證 # /usr/local/nginx/sbin/nginx -s reload //重啟
4)平滑升級Nginx服務器
平滑升級不會停掉在運行著的進程,這些進程會繼續(xù)處理請求,但不會再接受新請求,在這些老進程在處理完還在處理的請求后,停止。此平滑升級的過程中,新開的進程會被處理。這就是平滑升級。
# /usr/local/nginx/sbin/nginx -v //查看當前版本
下面進行平滑升級:
# cd /usr/local # tar -zxvf nginx-1.11.6.tar.gz //解壓縮 新版本Nginx # cd nginx-1.11.6 //切換到該目錄下 # ./configure //配置 # make # cd /usr/local/nginx/sbin //打開 舊版本Nginx可執(zhí)行文件位置 # cp nginx nginx.old //備份 舊版本Nginx可執(zhí)行文件,防止升級錯誤而無法恢復 # cp -rfp /usr/local/nginx-1.11.6/objs/nginx /usr/local/nginx/sbin //復制新版本可執(zhí)行文件到舊版本處 # rm -f /usr/local/nginx-1.11.6.tar.gz //善后工作 刪除壓縮文件 # rm -rf /usr/local/nginx-1.11.6 //刪除文件夾
至此,Nginx服務器平滑升級成功。
3.Nginx中負載均衡的實現(xiàn)
我們還是先連接SSH,然后進行下面操作(一般不建議修改默認主配置文件nginx.conf,所以我們新建負載均衡配置文件fzjh.conf,保證服務器安全,如下):
# cd /usr/local/nginx/conf # touch fzjh.conf # vi fzjh.conf //用vi編輯器打開文件,然后按鍵盤的i
注意:vi編輯器中,鍵盤按 i 進入 INSERT 狀態(tài),按 Esc 退出 INSERT 狀態(tài)。
然后輸入以下配置代碼(注釋部分按需開啟):
#設置低權限用戶,為了安全而設置的 user nobody; #工作衍生進程數(shù) worker_processes 4; #設置錯誤文件存放路徑 #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #設置pid存放路徑(pid是控制系統(tǒng)中重要文件) #pid logs/nginx.pid; #設置最大連接數(shù) events{ worker_connections 1024; } http{ #主要是用于設置一組可以在proxy_pass和fastcgi_pass指令中使用額代理服務器,默認負載均衡方式為輪詢 upstream tomcat_client { #設置同一個cookie的兩次/多次請求,請求的是同一臺服務器 ip_hash; #weight權重,默認1,權重越大訪問概率越大,backup備用服務器,服務器全部崩潰后啟動 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; } #開啟gzip壓縮,開啟后,訪問網(wǎng)頁會自動壓縮 #gzip on; #指定服務器的名稱和參數(shù) server { listen 80; server_name test.nginxtest.net; #設置字符 #charset koi8-r; #location / 指用根目錄做負載均衡 location / { proxy_pass http://tomcat_client; proxy_redirect default; #設置代理 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }
輸入完成后按下Esc,然后輸入:
:wq!
就可以保存并退出負載均衡的配置文件了,下來我們加載我們的配置文件:
# /usr/local/nginx/sbin/nginx //啟動Nginx # /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/fzjh.conf //加載配置文件
如果存在端口占用,可以使用如下命令Kill掉Nginx的程序:
# killall -9 nginx
至此,Nginx服務器部署完畢。下面我們開始部署負載均衡下的那三臺真實提供數(shù)據(jù)的服務器。
4.Linux下安裝jdk
我們在192.168.2.21、192.168.2.22、192.168.2.23這三臺服務器安裝jdk,以192.168.2.21為例:
1)下載jdk http://www.dbjr.com.cn/softs/75615.html
2)上傳服務器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編輯器打開文件,然后按鍵盤的i
下來我們移動光標至最后面,兩個回車換行,然后添加下面代碼配置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!
就可以保存并退出了。此時我們想讓其立即生效,則需要繼續(xù)輸入命令:
# source /etc/profile
此時profile文件就更新了,此時環(huán)境變量就配置成功了。下面我們驗證一下jdk是否安裝配置成功:
# java -version
如果返回java版本號則安裝成功。
5.Linux下搭建Tomcat服務器
我們在192.168.2.21、192.168.2.22、192.168.2.23這三臺服務器搭建Tomcat服務器,以192.168.2.21為例:
1)下載Tomcat http://www.dbjr.com.cn/softs/9974.html
2)上傳服務器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)設置Tomcat網(wǎng)頁文件目錄
Tomcat默認網(wǎng)頁文件的路徑是 /usr/local/tomcat/webapps/ROOT,但是一般我們不在這里存放,我們在Linux根目錄新建 data/wwwroot 目錄:
# mkdir /data //新建目錄 # mkdir /data/www # mkdir /data/www/ROOT # cd /usr/local/tomcat/conf # vi server.xml //用vi編輯器打開server.xml配置文件,打開后鍵盤按i
我們找到Host節(jié)點下的appBase=”webapps”,修改為:appBase="/data/www"
輸入完成后按下Esc,然后輸入:
:wq!
就可以保存并退出配置文件了,然后重啟Tomcat即可生效,此時Tomcat的網(wǎng)頁文件目錄就變成了 /data/www/ROOT 了。
配置Tomcat環(huán)境變量,我們在配置jdk的時候已經(jīng)配置好了,可以回頭看一下。
6.Tomcat的啟動、停止
1)啟動Tomcat服務器
# /usr/local/tomcat/bin/startup.sh
2)停止Tomcat服務器:
# /usr/local/tomcat/bin/shutdown.sh
到此,Nginx + Tomcat 負載均衡 集群 已經(jīng)部署完畢了。不過有了服務器,肯定也少不了數(shù)據(jù)庫,下面拓展一下Linux下安裝MySQL數(shù)據(jù)庫的方法。
7.Linux下安裝MySQL數(shù)據(jù)庫
我們重新找了 192.168.2.30 這臺服務器上MySQL數(shù)據(jù)庫:
1)下載MySQL數(shù)據(jù)庫 http://www.dbjr.com.cn/softs/19918.html
2)上傳MySQL數(shù)據(jù)庫安裝包
$ 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 //配置,設置安裝路徑,設置編譯mysql不帶共享庫,設置編譯client不帶共享庫,設置要以rmp的方式安裝tar包,設置以rmp的方式安裝opensll # make # make install //安裝,在make[4]的時候等待時間比較長,幾分鐘到十幾分鐘,都是正?,F(xiàn)象 # /usr/local/mysql/bin/mysql_install_db --user //對安裝好的MySQL進行初始化 # cp ./support-files/mysql.server /etc/init.d/mysql //將MySQL啟動服務復制到系統(tǒng)中并重命名為mysql # cp ./support-files/my-medium.cnf /etc/my.cnf //復制規(guī)則文件 # chmod 755 /etc/init.d/mysql //更改文件權限 //文件權限由三個數(shù)字組成,第一位:文件擁有者的權限,第二位:文件擁有者同組的人的權限,第三位:文件擁有者非同組人的權限 //7:可讀可寫可執(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所有進程號依次殺死,這里假定是3632 # /usr/local/mysql/bin/mysql_install_db --user=mysql //再次初始化 # service mysql start //啟動MySQL # /usr/local/mysql/bin/mysqladmin -u root password '123456' //設置MySQL密碼
到此MySQL就安裝成功了,下來我們測試一下:
# /usr/local/mysql/bin/mysql -u root -p
如果輸入密碼后可以登進MySQL,那么就測試成功。下面我們設置MySQL允許開啟遠程連接:
# /usr/local/mysql/bin/mysql -u root -p mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; //創(chuàng)建用戶用于遠程連接(root:用戶名,%:所有電腦都可以連接,也可以設置某個ip地址運行連接,123456:密碼) mysql> flush privileges; //立即生效
下面我們查詢一下數(shù)據(jù)庫的用戶:
mysql> SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user; mysql> \q //登出
找一臺電腦測試一下,使用Navicat遠程登錄MySQL,登進成功。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
通過Nginx搭建Tomcat9集群并實現(xiàn)Session共享
這篇文章主要介紹了通過Nginx搭建Tomcat9集群并實現(xiàn)Session共享,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06Nginx 實現(xiàn) TCP/DUP流量按 IP 動態(tài)轉發(fā)操作方法
為優(yōu)化網(wǎng)絡性能和提升服務可用性,通過Nginx配置stream模塊根據(jù)客戶端IP地址動態(tài)轉發(fā)TCP請求至不同后端服務器節(jié)點,適用于數(shù)據(jù)庫代理、TCP服務負載均衡及地域或來源IP分流的流量調度等場景,本文給大家介紹Nginx 實現(xiàn) TCP/DUP流量按 IP 動態(tài)轉發(fā)的操作2024-10-10Nginx優(yōu)化配置和內(nèi)核優(yōu)化 實現(xiàn)突破十萬并發(fā)
Nginx是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。本文介紹一些Nginx優(yōu)化代碼參數(shù)等2013-06-06阿里云國際版使用Nginx作為HTTPS轉發(fā)代理服務器的處理方法
本文介紹了使用NGINX作為HTTPS流量轉發(fā)代理的兩種方法。它總結了NGINX使用HTTP?CONNECT隧道和NGINX流充當HTTPS轉發(fā)代理的解決方案的原則,環(huán)境構建要求,應用場景和關鍵問題2022-05-05502?Bad?Gateway產(chǎn)生的原因及8個詳細的解決方法總結
Nginx?502?Bad?Gateway的錯誤已經(jīng)遇到好幾次了,這里做一下記錄,備忘,下面這篇文章主要給大家介紹了關于502?Bad?Gateway產(chǎn)生的原因及8個詳細的解決方法,文中的介紹非常詳細,需要的朋友可以參考下2023-05-05Nginx配置跨域請求Access-Control-Allow-Origin * 詳解
這篇文章主要給大家介紹了關于Nginx配置跨域請求Access-Control-Allow-Origin * 的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Nginx具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-06-06