Nginx與Tomcat部署
前面課程已經將Nginx的大部分內容進行了講解,我們都知道了Nginx在高并發(fā)場景和處理靜態(tài)資源是非常高性能的,但是在實際項目中除了靜態(tài)資源還有就是后臺業(yè)務代碼模塊,一般后臺業(yè)務都會被部署在Tomcat,weblogic或者是websphere等web服務器上。那么如何使用Nginx接收用戶的請求并把請求轉發(fā)到后臺web服務器?
步驟分析:
1.準備Tomcat環(huán)境,并在Tomcat上部署一個web項目
2.準備Nginx環(huán)境,使用Nginx接收請求,并把請求分發(fā)到Tomat上
采用Tomcat作為后臺web服務器
在Centos上準備一個Tomcat
1.Tomcat官網地址:https://tomcat.apache.org/
2.下載tomcat,本次課程使用的是apache-tomcat-8.5.59.tar.gz
3.將tomcat進行解壓縮
mkdir web_tomcat
tar -zxf apache-tomcat-8.5.59.tar.gz -C /web_tomcat
準備一個web項目,將其打包為war
1.將demo.war上傳到tomcat8目錄下的webapps包下
2.將tomcat進行啟動,進入tomcat8的bin目錄下
./startup.sh
啟動tomcat進行訪問測試
靜態(tài)資源: http://192.168.221.199:8088/demo/index.html
動態(tài)資源: http://192.168.221.199:8088/demo/getAddress
Nginx環(huán)境準備【192.168.221.198】
使用Nginx的反向代理,將請求轉給Tomcat進行處理。
upstream webservice {
server 192.168.221.199:8088;
}
server{
listen 80;
server_name localhost;
location /demo {
proxy_pass http://webservice;
}
}
啟動訪問測試
明明直接通過tomcat就能訪問,為什么還需要多加一個nginx,這樣不是反而是系統(tǒng)的復雜度變高了么?原因如下:
1.使用Nginx實現動靜分離
2.使用Nginx搭建Tomcat的集群
Nginx實現動靜分離
什么是動靜分離?
動:后臺應用程序的業(yè)務處理
靜:網站的靜態(tài)資源(html、javaScript、css、images等文件)
分離:將兩者進行分開部署訪問,提供用戶進行訪問。舉例說明就是以后所有和靜態(tài)資源相關的內容都交給Nginx來部署訪問,非靜態(tài)內容則交個類似于Tomcat的服務器來部署訪問。
為什么要動靜分離?
Nginx在處理靜態(tài)資源的時候,效率是非常高的,而且Nginx(5w)的并發(fā)訪問量也是名列前茅,而Tomcat(500)則相對比較弱一些,所以把靜態(tài)資源交個Nginx后,可以減輕Tomcat服務器的訪問壓力并提高靜態(tài)資源的訪問速度。動靜分離以后,降低了動態(tài)資源和靜態(tài)資源的耦合度。如動態(tài)資源宕機了也不影響靜態(tài)資源的展示。
如何實現動靜分離?
實現動靜分離的方式很多,比如靜態(tài)資源可以部署到CDN、Nginx等服務器上,動態(tài)資源可以部署到Tomcat,weblogic或者websphere上。本次使用Nginx+Tomcat來實現動靜分離。
需求分析
動靜分離實現步驟
將demo.war項目中的靜態(tài)資源都刪除掉,重新打包生成一個war包。
將war包部署到tomcat中,把之前部署的內容刪除掉
進入到tomcat的webapps目錄下,將之前的內容刪除掉
將新的war包復制到webapps下
將tomcat啟動
在Nginx所在服務器創(chuàng)建如下目錄,并將對應的靜態(tài)資源放入指定的位置
其中index.html頁面的內容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery.min.js"></script>
<script>
$(function(){
$.get('http://192.168.221.198/demo/getAddress',function(data){
$("#msg").html(data);
});
});
</script>
</head>
<body>
<img src="images/logo.png"/>
<h1>Nginx如何將請求轉發(fā)到后端服務器</h1>
<h3 id="msg"></h3>
<img src="images/mv.png"/>
</body>
</html>
配置Nginx的靜態(tài)資源與動態(tài)資源的訪問
upstream webservice{
server 192.168.221.199:8088;
}
server {
listen 80;
server_name localhost;
#動態(tài)資源
location /demo {
proxy_pass http://webservice;
}
#靜態(tài)資源
location ~/.*\.(png|jpg|gif|js){
root html/web;
gzip on;
}
#首頁重定向
location / {
root html/web;
index index.html index.htm;
}
}
啟動測試,訪問http://192.168.221.198/index.html
假如某個時間點,由于某個原因導致Tomcat后的服務器宕機了,我們再次訪問Nginx,會得到如下效果,用戶還是能看到頁面,只是缺失了訪問次數的統(tǒng)計,這就是前后端耦合度降低的效果,并且整個請求只和后的服務器交互了一次,js和images都直接從Nginx返回,提供了效率,降低了后的服務器的壓力。
Nginx實現Tomcat集群搭建
在使用Nginx和Tomcat部署項目的時候,我們使用的是一臺Nginx服務器和一臺Tomcat服務器,效果圖如下:
如果Tomcat的真的宕機了,整個系統(tǒng)就會不完整,所以如何解決上述問題,一臺服務器容易宕機,那就多搭建幾臺Tomcat服務器,這樣的話就提升了后的服務器的可用性。這也就是我們常說的集群,搭建Tomcat的集群需要用到了Nginx的反向代理和賦值均衡的知識,具體如何來實現?
環(huán)境準備
準備3臺tomcat,使用端口進行區(qū)分[實際環(huán)境應該是三臺服務器],修改server.ml,將端口修改分別修改為8988,8180,8280
啟動tomcat并訪問測試,
http://192.168.221.199:8988/demo/getAddress
http://192.168.221.199:8180/demo/getAddress
http://192.168.221.199:8383/demo/getAddress
在Nginx對應的配置文件中添加如下內容:
upstream webservice{
server 192.168.221.199:8988;
server 192.168.221.199:8180;
server 192.168.221.199:8383;
}
完成上述環(huán)境的部署,已經解決了Tomcat的高可用性,一臺服務器宕機,還有其他兩條對外提供服務,同時也可以實現后臺服務器的不間斷更新。但是新問題出現了,上述環(huán)境中,如果是Nginx宕機了呢,那么整套系統(tǒng)都將服務對外提供服務了,這個如何解決?
Nginx高可用解決方案
針對于上面提到的問題,需要兩臺以上的Nginx服務器對外提供服務,這樣的話就可以解決其中一臺宕機了,另外一臺還能對外提供服務,但是如果是兩臺Nginx服務器的話,會有兩個IP地址,用戶該訪問哪臺服務器,用戶怎么知道哪臺是好的,哪臺是宕機了的?
Keepalived
使用Keepalived來解決,Keepalived 軟件由 C 編寫的,最初是專為 LVS 負載均衡軟件設計的,Keepalived 軟件主要是通過 VRRP 協(xié)議實現高可用功能。
VRRP介紹
VRRP(Virtual Route Redundancy Protocol)協(xié)議,翻譯過來為虛擬路由冗余協(xié)議。VRRP協(xié)議將兩臺或多臺路由器設備虛擬成一個設備,對外提供虛擬路由器IP,而在路由器組內部,如果實際擁有這個對外IP的路由器如果工作正常的話就是MASTER,MASTER實現針對虛擬路由器IP的各種網絡功能。其他設備不擁有該虛擬IP,狀態(tài)為BACKUP,處了接收MASTER的VRRP狀態(tài)通告信息以外,不執(zhí)行對外的網絡功能。當主機失效時,BACKUP將接管原先MASTER的網絡功能。
從上面的介紹信息獲取到的內容就是VRRP是一種協(xié)議,那這個協(xié)議是用來干什么的?
1.選擇協(xié)議
VRRP可以把一個虛擬路由器的責任動態(tài)分配到局域網上的 VRRP 路由器中的一臺。其中的虛擬路由即Virtual路由是由VRRP路由群組創(chuàng)建的一個不真實存在的路由,這個虛擬路由也是有對應的IP地址。而且VRRP路由1和VRRP路由2之間會有競爭選擇,通過選擇會產生一個Master路由和一個Backup路由。
2.路由容錯協(xié)議
Master路由和Backup路由之間會有一個心跳檢測,Master會定時告知Backup自己的狀態(tài),如果在指定的時間內,Backup沒有接收到這個通知內容,Backup就會替代Master成為新的Master。Master路由有一個特權就是虛擬路由和后端服務器都是通過Master進行數據傳遞交互的,而備份節(jié)點則會直接丟棄這些請求和數據,不做處理,只是去監(jiān)聽Master的狀態(tài)
用了Keepalived后,解決方案如下:
在兩個nginx服務器上分別裝Keepalived,通過VRRP的選擇協(xié)議定出一個主節(jié)點和備份節(jié)點,再通過VRRP協(xié)議虛擬出一個ip地址,(虛擬IP地址使得用戶不需要關注有幾個nginx節(jié)點,只需訪問虛擬ip),虛擬ip收到請求后,找對應的主節(jié)點來處理請求,如果主節(jié)點宕機,備份節(jié)點升級為主節(jié)點去處理請求。
環(huán)境準備
VIP | IP | 主機名 | 主/從 |
---|---|---|---|
192.168.221.199 | keepalived1 | Master | |
192.168.221.222 | |||
192.168.221.198 | keepalived2 | Backup |
keepalived的安裝
1.從官方網站下載keepalived,官網地址https://keepalived.org/
2.將下載的資源上傳到服務器
keepalived-2.0.20.tar.gz
3.創(chuàng)建keepalived目錄,方便管理資源
mkdir keepalived
4.將壓縮文件進行解壓縮,解壓縮到指定的目錄
tar -zxf keepalived-2.0.20.tar.gz -C keepalived/
5.對keepalived進行配置,編譯和安裝
cd keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install
安裝完成后,需要認識兩個文件,一個是 /etc/keepalived/keepalived.conf
(keepalived的系統(tǒng)配置文件,主要操作的就是該文件),一個是/usr/local/sbin目錄下的keepalived
,是系統(tǒng)配置腳本,用來啟動和關閉keepalived。
Keepalived配置文件
打開keepalived.conf配置文件
第一部分是global全局配置、第二部分是vrrp相關配置、第三部分是LVS相關配置。
主要是使用keepalived實現高可用部署,沒有用到LVS,所以重點關注的是前兩部分
global全局部分:
global_defs {
#通知郵件,當keepalived發(fā)送切換(主節(jié)點備份節(jié)點切換)時需要給指定的郵箱地址發(fā)email(收件人)
notification_email {
tom@itcast.cn
jerry@itcast.cn
}
#設置發(fā)件人的郵箱信息
notification_email_from zhaomin@itcast.cn
#指定smpt服務地址
smtp_server 192.168.200.1
#指定smpt服務連接超時時間
smtp_connect_timeout 30
#運行keepalived服務器的一個標識,可以用作發(fā)送郵件的主題信息
router_id LVS_DEVEL
#默認是不跳過檢查。檢查收到的VRRP通告中的所有地址可能會比較耗時,設置此命令的意思是,如果通告與接收的上一個通告來自相同的master路由器,則不執(zhí)行檢查(跳過檢查)
vrrp_skip_check_adv_addr
#嚴格遵守VRRP協(xié)議。
vrrp_strict
#在一個接口發(fā)送的兩個免費ARP之間的延遲。可以精確到毫秒級。默認是0
vrrp_garp_interval 0
#在一個網卡上每組na消息之間的延遲時間,默認為0
vrrp_gna_interval 0
}
VRRP部分,該部分可以包含以下四個子模塊
1. vrrp_script
2. vrrp_sync_group
3. garp_group
4. vrrp_instance
我們會用到第一個和第四個,
#設置keepalived實例的相關信息,VI_1為VRRP實例名稱
vrrp_instance VI_1 {
state MASTER #有兩個值可選MASTER主 BACKUP備
interface ens33 #vrrp實例綁定的接口,用于發(fā)送VRRP包[當前服務器使用的網卡名稱]
virtual_router_id 51 #指定VRRP實例ID,范圍是0-255(虛擬ip)
priority 100 #指定優(yōu)先級,優(yōu)先級高的將成為MASTER
advert_int 1 #指定發(fā)送VRRP通告的間隔,單位是秒
authentication { #vrrp之間通信的認證信息
auth_type PASS #指定認證方式。PASS簡單密碼認證(推薦)
auth_pass 1111 #指定認證使用的密碼,最多8位
}
virtual_ipaddress { #虛擬IP地址設置虛擬IP地址,供用戶訪問使用,可設置多個,一行一個
192.168.221.222
}
}
配置內容如下:
192.168.221.199
global_defs {
notification_email {
tom@itcast.cn
jerry@itcast.cn
}
notification_email_from zhaomin@itcast.cn
smtp_server 192.168.221.1
smtp_connect_timeout 30
router_id keepalived1
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.221.222
}
}
192.168.221.198
! Configuration File for keepalived
global_defs {
notification_email {
tom@itcast.cn
jerry@itcast.cn
}
notification_email_from zhaomin@itcast.cn
smtp_server 192.168.221.1
smtp_connect_timeout 30
router_id keepalived2
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.221.222
}
}
訪問測試
- 啟動keepalived之前,咱們先使用命令
ip a
,查看192.168.221.199和192.168.221.198這兩臺服務器的IP情況。
- 分別啟動兩臺服務器的keepalived
cd /usr/local/sbin
./keepalived
再次通過 ip a
查看ip
- 當把192.168.221.199服務器上的keepalived關閉后,再次查看ip
通過上述的測試會發(fā)現,虛擬IP(VIP)會在MASTER節(jié)點上,當MASTER節(jié)點上的keepalived出問題以后,因為BACKUP無法收到MASTER發(fā)出的VRRP狀態(tài)通過信息,就會直接升為MASTER。VIP也會"漂移"到新的MASTER。
上面測試和Nginx有什么關系?
192.168.221.199服務器的keepalived再次啟動下,由于它的優(yōu)先級高于服務器192.168.221.198的,所以它會再次成為MASTER,VIP也會"漂移"過去,然后我們再次通過瀏覽器訪問:
http://192.168.221.222/
#數據來自192.168.221.199
如果把192.168.221.199服務器的keepalived關閉掉,再次訪問相同的地址,變成198的nginx首頁
效果實現了以后, 會發(fā)現要想讓vip進行切換,就必須要把服務器上的keepalived進行關閉,而什么時候關閉keepalived呢?應該是在keepalived所在服務器的nginx出現問題后,把keepalived關閉掉,就可以讓VIP執(zhí)行另外一臺服務器,但是現在這所有的操作都是通過手動來完成的,我們如何能讓系統(tǒng)自動判斷當前服務器的nginx是否正確啟動,如果沒有,要能讓VIP自動進行"漂移",這個問題該如何解決?
keepalived之vrrp_script
keepalived只能做到對網絡故障和keepalived本身的監(jiān)控,即當出現網絡故障或者keepalived本身出現問題時,進行切換。但是這些還不夠,我們還需要監(jiān)控keepalived所在服務器上的其他業(yè)務,比如Nginx,如果Nginx出現異常了,僅僅keepalived保持正常,是無法完成系統(tǒng)的正常工作的,因此需要根據業(yè)務進程的運行狀態(tài)決定是否需要進行主備切換,這個時候,可以通過編寫腳本對業(yè)務進程進行檢測監(jiān)控。
實現步驟:
- 在keepalived配置文件中添加對應的配置像
vrrp_script 腳本名稱
{
script "腳本位置"
interval 3 #執(zhí)行時間間隔
weight -20 #動態(tài)調整vrrp_instance的優(yōu)先級
}
- 編寫腳本 ck_nginx.sh
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then #沒有Nginx進程
/usr/local/nginx/sbin/nginx #啟動nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then #沒有nginx進程
killall keepalived # 刪掉keepalived進程
fi
fi
Linux ps命令用于顯示當前進程 (process) 的狀態(tài)。
-C(command) :指定命令的所有進程
--no-header 排除標題
- 為腳本文件設置權限
chmod 755 ck_nginx.sh
- 將腳本添加到
vrrp_script ck_nginx {
script "/etc/keepalived/ck_nginx.sh" #執(zhí)行腳本的位置
interval 2 #執(zhí)行腳本的周期,秒為單位
weight -20 #權重的計算方式,優(yōu)先級-20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111
}
track_script {
ck_nginx
}
}
- 如果效果沒有出來,可以使用
tail -f /var/log/messages
查看日志信息,找對應的錯誤信息。
問題思考:
通常如果master服務死掉后backup會變成master,但是當master服務又好了的時候master此時會搶占VIP,這樣就會發(fā)生兩次切換對業(yè)務繁忙的網站來說是不好的。所以要在配置文件加入 nopreempt 非搶占,但是這個參數只能用于state 為backup,故我們在用HA的時候最好master 和backup的state都設置成backup 讓其通過priority來競爭。
Nginx制作下載站點
打開一個網站http://nginx.org/download/
,該網站主要就是用來提供用戶來下載相關資源的網站,就叫做下載網站。
如何制作一個下載站點?
nginx使用的是模塊ngx_http_autoindex_module來實現的,該模塊處理以斜杠(“/”)結尾的請求,并生成目錄列表。nginx編譯的時候會自動加載該模塊,但是該模塊默認是關閉的,需要使用下來指令來完成對應的配置。
autoindex: 啟用或禁用目錄列表輸出
語法 | autoindex on|off; |
---|---|
默認值 | autoindex off; |
位置 | http、server、location |
autoindex_exact_size: 對應HTLM格式,指定是否在目錄列表展示文件的詳細大小
默認為on,顯示出文件的確切大小,單位是bytes。
改為off后,顯示出文件的大概大小,單位是kB或者MB或者GB
語法 | autoindex_exact_size on|off; |
---|---|
默認值 | autoindex_exact_size on; |
位置 | http、server、location |
autoindex_format: 設置目錄列表的格式
語法 | autoindex_format html|xml|json|jsonp; |
---|---|
默認值 | autoindex_format html; |
位置 | http、server、location |
注意:該指令在1.7.9及以后版本中出現
autoindex_localtime: 對應HTML格式,是否在目錄列表上顯示時間。
默認為off,顯示的文件時間為GMT時間。
改為on后,顯示的文件時間為文件的服務器時間
語法 | autoindex_localtime on | off; |
---|---|
默認值 | autoindex_localtime off; |
位置 | http、server、location |
配置方式如下:
# 下載站點相關配置
location /download{
# 下載資源位置
root /usr/local;
autoindex on; #off頁面會有403錯誤
autoindex_exact_size on; #on顯示大小byte,off KB單位
autoindex_format html; # 顯示格式XML/JSON格式[一般不用這兩種方式]
autoindex_localtime on; # on在服務器上的時間(什么時候放在服務器上)
}
Nginx的用戶認證模塊
對應系統(tǒng)資源的訪問,往往需要限制誰能訪問,誰不能訪問。這塊就是通常所說的認證部分,認證需要做的就是根據用戶輸入的用戶名和密碼來判定用戶是否為合法用戶,如果是則放行訪問,如果不是則拒絕訪問。
Nginx對應用戶認證這塊是通過ngx_http_auth_basic_module模塊來實現的,它允許通過使用"HTTP基本身份驗證"協(xié)議驗證用戶名和密碼來限制對資源的訪問。默認情況下nginx是已經安裝了該模塊,如果不需要則使用–without-http_auth_basic_module進行排除。
auth_basic: 使用“ HTTP基本認證”協(xié)議啟用用戶名和密碼的驗證
語法 | auth_basic string|off; |
---|---|
默認值 | auth_basic off; |
位置 | http,server,location,limit_except |
開啟后,服務端會返回401,指定的字符串會返回到客戶端,給用戶以提示信息,但是不同的瀏覽器對內容的展示不一致。
auth_basic_user_file: 指定用戶名和密碼所在文件
語法 | auth_basic_user_file file; |
---|---|
默認值 | — |
位置 | http,server,location,limit_except |
指定文件路徑,該文件中的用戶名和密碼的設置,密碼需要進行加密??梢圆捎霉ぞ咦詣由?/p>
實現步驟:
1.nginx.conf添加如下內容
location /download{
root /usr/local;
autoindex on;
autoindex_exact_size on;
autoindex_format html;
autoindex_localtime on;
auth_basic 'please input your auth';
# htpasswd存放路徑
auth_basic_user_file htpasswd;
}
2.我們需要使用htpasswd
工具生成用戶名密碼
yum install -y httpd-tools
相關指令:文章來源:http://www.zghlxwxcb.cn/news/detail-705060.html
//創(chuàng)建一個新文件記錄用戶名和密碼
htpasswd -c /usr/local/nginx/conf/htpasswd username
//在指定文件追加一個用戶名和密碼
htpasswd -b /usr/local/nginx/conf/htpasswd username password
//從指定文件刪除一個用戶信息
htpasswd -D /usr/local/nginx/conf/htpasswd username
//驗證用戶名和密碼是否正確
htpasswd -v /usr/local/nginx/conf/htpasswd username
上述方式雖然能實現用戶名和密碼的驗證,但是所有的用戶名和密碼信息都記錄在文件里面,如果用戶量過大的話,這種方式就顯得有點麻煩了,這時候就得通過后臺業(yè)務代碼來進行用戶權限的校驗了。文章來源地址http://www.zghlxwxcb.cn/news/detail-705060.html
到了這里,關于Nginx(7)Nginx實現服務器端集群搭建的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!