Nginx+Tomcat——負載均衡與動靜分離群集 理論知識+實驗部署+報錯排坑 詳細講解一看秒懂!!!

2020-09-28 10:00:56

Tomcat與Nginx

具體介紹可以點選後面的連結
Nginx介紹
Tomcat

這裡我們只講解兩個人之間的關係

Tomcat目錄與組態檔

(1)主要目錄說明

—bin/ :存放 Windows 或 Linux 平臺上啟動和關閉 Tomcat 的指令碼檔案。
—conf/:存放 Tomcat 伺服器的各種全域性組態檔,其中最重要的是 server.xml 和 web.xml。
—lib/:存放 Tomcat 執行需要的庫檔案(JARS)。
—logs:存放 Tomcat 執行時的 LOG 檔案。
—webapps:Tomcat 的主要 Web 釋出目錄(包括應用程式範例)。
—work:存放 JSP 編譯後產生的 class 檔案

(2)組態檔說明 執行「ll conf/」命令,便可看到組態檔清單。

●catalina.policy:許可權控制組態檔。
●catalina.properties:Tomcat 屬性組態檔。
● context.xml:上下文組態檔。
● logging.properties:紀錄檔 log 相關組態檔。
● server.xml:主組態檔。
●tomcat-users.xml :manager-gui 管 理 用 戶 配 置 文 件 ( Tomcat 安 裝 後 提 供 一 個manager-gui 的管理介面,通過設定該檔案可以開啟存取)。
●web.xml:Tomcat 的 servlet、servlet-mapping、filter、MIME 等相關設定。

Nginx負載均衡實現原理

Nginx是一款非常優秀的HTTP伺服器軟體
支援高達50 000個並行連線數的響應
擁有強大的靜態資源處理能力
執行穩定
記憶體、CPU等系統資源消耗非常低

目前很多大型網站都應用Nginx伺服器作為後端網站程式的反向代理及負載均衡器,提升整個站點的負載並行能力

在這裡插入圖片描述

Nginx設定反向代理的主要引數
upstream服務池名{}設定後端伺服器池,以提供響應資料
proxy_pass http://服務池名設定將存取請求轉發給後端伺服器池的伺服器處理

在這裡插入圖片描述
如上圖:
使用者端傳送請求過來:有動態也有靜態
靜態交給Nginx處理,動態交給Tomcat處理

Nginx靜態處理優勢
Nginx處理靜態頁面的效率遠高於Tomcat的處理能力
若Tomcat的請求量為1000次,則Nginx的請求量為6000次
Tomcat每秒的吞吐量為0.6M,Nginx的每秒吞吐量為3.6M
Nginx處理靜態資源的能力是Tomcat處理的6倍

負載均衡與動靜分離部署

拓撲圖

在這裡插入圖片描述
Nginx這個時候相當於排程器的角色,靜態自己處理,動態Tomcat處理

網路環境

【排程器1】【WEB1】【WEB2】
20.0.0.2320.0.0.2420.0.0.25
NginxTomcat1Tomcat2
其他:防火牆,核心防護關閉
閘道器:全部指向20.0.0.1
最小安裝在開局前需要安裝:
yum -y install net-tools最小安裝必裝,可以使用ifconfig,netstat等
yum -y install bash-completion這個是最小安裝自動補全命令

Tomcat1 20.0.0.24

2、檢視JDK是否安裝
執行 java -version 命令檢視 Java 是否安裝。如果沒有安裝需要自行下載安裝
[root@localhost ~]# java -version

可以yum 安裝 java-1.8.0-openjdk或者上傳包到opt下
[root@localhost ~]# cd /opt
[root@localhost ~]# tar xf apache-tomcat-8.5.16.tar.gz
#解壓後生成 apache-tomcat-8.5.16 資料夾,將該資料夾移動到/usr/local/下,並 改名為 tomcat8。
[root@localhost ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8

#啟動 tomcat。
#建立軟連線tomcatup   
ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup  
#建立軟連線tomcatdown   
ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown               

[root@localhost opt]# tomcatup                                                                 ######啟動tomcat
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.

 #檢測是否啟動,8080埠是否工作正常
[root@localhost opt]# netstat -anpt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      68238/java   
               

#建立 Java 的 Web 站點
在根目錄下建立一個 web 目錄,並在裡面建立一個 webapp1 目錄,用於存放網站檔案。
[root@localhost ~]# mkdir -pv /web/webapp1
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
	<head>
		<title>JSP test1 page</title>
	</head>
	<body> 
		<% out.println("動態頁面 1,http://www.5111111.com");%>
	</body>
	<body>
 		<div>靜態頁面的圖片 1</div><br><img src="2.jpg">
	</body>
</html>

###注意#####
<div>靜態頁面的圖片 1</div><br><img src="2.jpg">
這裡的2.jpg是等一下  Nginx(20.0.0.23):/usr/local/nginx/html/img/下的圖片名稱
因為我們將靜態網頁交給Nginx處理了,Tomcat只處理動態的
tomcat指路徑,Nginx放圖片
########

#修改 Tomcat 的 server.xml 檔案。
定義一個虛擬主機,並將網站檔案路徑指向已經建立的/web/webapp1,
在 host 段增加 context 段
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
<Host name="localhost" appBase="webapps"                                   
	unpackWARs="true" autoDeploy="true">               ##在這條命令下新增下面兩行
<Context docBase="/web/webapp1" path="" reloadable="false" >         
</Context> 

###docBase:web 應用的檔案基準目錄 
###reloadable 設定監視"類"是否變化 
###path="" 設定預設"類"

#關閉 Tomcat,再重新啟動。
[root@localhost ~]# tomcatdown
[root@localhost ~]# tomcatup

通過瀏覽器存取 http://192.168.100.22:8080/
顯示「靜態頁面的圖片 1」文字,並沒有出現logo.jpg 圖片,原因是由於靜態圖片暫時沒配,所以載入不出來



###測試#####在筆電上測試
http://20.0.0.24:8080/    檢視預設測試頁是否正常顯示 

在這裡插入圖片描述

Tomcat2 20.0.0.25

2、檢視JDK是否安裝
執行 java -version 命令檢視 Java 是否安裝。如果沒有安裝需要自行下載安裝
[root@localhost ~]# java -version

可以yum 安裝 java-1.8.0-openjdk或者上傳包到opt下
[root@localhost ~]# cd /opt
[root@localhost ~]# tar xf apache-tomcat-8.5.16.tar.gz
#解壓後生成 apache-tomcat-8.5.16 資料夾,將該資料夾移動到/usr/local/下,並 改名為 tomcat8。
[root@localhost ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8

#啟動 tomcat。
#建立軟連線tomcatup   
ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup  
#建立軟連線tomcatdown   
ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown               

[root@localhost opt]# tomcatup                                                                 ######啟動tomcat
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.

 #檢測是否啟動,8080埠是否工作正常
[root@localhost opt]# netstat -anpt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      68238/java   
               

#建立 Java 的 Web 站點
在根目錄下建立一個 web 目錄,並在裡面建立一個 webapp1 目錄,用於存放網站檔案。

[root@localhost ~]# mkdir -pv /web/webapp1
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
	<head>
		<title>JSP test1 page</title>
	</head>
	<body> 
		<% out.println("動態頁面 2,http://www.52222222.com");%>
	</body>
	<body>
 		<div>靜態頁面的圖片 2</div><br><img src="3.jpg">
	</body>
</html>

●修改 Tomcat 的 server.xml 檔案。
定義一個虛擬主機,並將網站檔案路徑指向已經建立的/web/webapp1,
在 host 段增加 context 段
[root@localhost ~]# vim /usr/local/tomcat8/conf/server.xml
<Host name="localhost" appBase="webapps"                                   
	unpackWARs="true" autoDeploy="true">                                          ##在這條命令下新增下面兩行
<Context docBase="/web/webapp1" path="" reloadable="false" >         
</Context> 

###docBase:web 應用的檔案基準目錄 
###reloadable 設定監視"類"是否變化 
###path="" 設定預設"類"

●關閉 Tomcat,再重新啟動。
[root@localhost ~]# tomcatdown
[root@localhost ~]# tomcatup


通過瀏覽器存取 http://20.0.0.25:8080/
顯示「靜態頁面的圖片 1」文字,並沒有出現 logo.jpg 圖片,原因是由於靜態圖片暫時沒配,所以載入不出來

在這裡插入圖片描述

Nginx 伺服器設定 20.0.0.23

在 Nginx 伺服器 20.0.0.23 上安裝 Nginx,反向代理到兩個 Tomcat 站點,並實現 負載均衡
(1)關閉防火牆。
(2)安裝相關軟體包。

[root@localhost ~]# yum -y install pcre-devel zlib-devel openssl-devel gcc-c++3)解壓並安裝 Nginx。
 [root@localhost ~]# groupadd www
[root@localhost ~]# useradd -g www www -s /bin/false

cd /opt

[root@localhost opt]# tar xzvf nginx-1.15.9.tar.gz
[root@localhost opt]# cd nginx-1.15.9/
[root@localhost nginx-1.15.9]# 
./configure --prefix=/usr/local/nginx --user=www --group=www --with-file-aio --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_modu


[root@localhost nginx-1.12.0]# make && make install 

[root@localhost nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.12.0]# ls -l /usr/local/sbin/nginx
lrwxrwxrwx 1 root root 27 516 16:50 /usr/local/sbin/nginx -> /usr/local/nginx/sbin/nginx

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@localhost ~]#  killall -3 nginx                                                     ###停止服務
如果出現: -bash: killall: command not found
[root@localhost ~]#  yum -y install psmisc
[root@localhost ~]# nginx                                ####啟動
yum -y install net-tools
[root@localhost ~]# netstat -anpt | grep nginx     
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN

[root@localhost ~]# vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking 
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

########################################

[root@localhost ~]# chmod 754 /lib/systemd/system/nginx.service
killall -3 nginx
systemctl start nginx
[root@localhost ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to
/usr/lib/systemd/system/nginx.service.
這樣一來, 就可以 systemctl 命令來啟動、 停止、 重新啟動、 過載 Nginx 伺服器了, 方法是
在執行時新增相應的 start、 stop、 restart、 reload 引數

#######重新啟動系統#########

systemctl start nginx.service
systemctl stop nginx.service
systemctl reload nginx.service
systemctl restart nginx.service
systemctl status nginx.service


(4)設定 nginx.conf。 
設定命令如下: 下面只是告訴你新增的位置

[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf 
把 Nginx 的預設站點通過 proxy_pass 方法代理到了設定好的 tomcat_server 負載均衡
伺服器組上。設定完成的 nginx.conf 檔案內容如下。
 …… //省略部分內容 

http { 
…… 		###省略部分內容     第一個新增內容為:
#gzip on;
upstream tomcat_server {
	server 20.0.0.24:8080 weight=1;
	server 20.0.0.25:8080 weight=1;
	}

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;      在這條命令下面新增以下內容:

        location ~ .*.jsp$ {
                proxy_set_header HOST $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header Client-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://tomcat_server;
                }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
                root /usr/local/nginx/html/img;
                expires 30d;
        }

        location / {                        這個是系統自帶不需要動
            root   html;
            index  index.html index.htm;
        }


###檢查語法問題
[root@localhost nginx-1.15.9]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful


#下面在 Nginx 上準備靜態圖片
#建立靜態檔案目錄 
[root@nginx ~]# mkdir /usr/local/nginx/html/img 	
[root@nginx ~]# cp /opt/2.jpg /usr/local/nginx/html/img
[root@nginx ~]# cp /opt/3.jpg /usr/local/nginx/html/img

或者用Xshell直接傳兩張叫23的圖片到img下面,圖片格式字尾名字為jpg

實驗測試

(1)測試靜態頁面效果 開啟瀏覽器存取 http://20.0.0.23/,可以看到存取到 nginx 靜態頁面,
(2)測試負載均衡效果 開啟瀏覽器存取 http://20.0.0.23/index.jsp。 不斷重新整理瀏覽器測試,

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
可以看到由於權重相同,頁面會反覆在以下兩個頁面來回切換。 第一次存取,出現 5111111的測試頁面,
並且能正常載入 nginx 上的靜態頁面圖片,重新整理後,第二次存取,出現 5222222 的測試頁面,
示。,就說明負載均衡群集搭建成功,已經可以 在兩個 Tomcat server 站點進行切換了。

排錯集

#(1)當你在安裝Nginx後
#killall -3 nginx  想使用systemctl進行管理時,不可以直接使用,需要操作流程如下
killall -3 nginx                             
systemctl stop nginx.service
systemctl start nginx.service
#不然會一直報錯

#(2)新增Nginx.conf完畢後,檢查一下下面的兩個},一個是http的,一個是server的
#如果缺少,就算提示你哪裡錯誤,你也想不到是括號的問題

#(3)<div>靜態頁面的圖片 1</div><br><img src="3.jpg">
這裡的3.jpg是等一下  Nginx(20.0.0.23):/usr/local/nginx/html/img/下的圖片名稱
因為我們將靜態網頁交給Nginx處理了,Tomcat只處理動態的
tomcat指路徑,Nginx放圖片