Tomcat+Nginx實現動靜分離和負載均衡架構部署

weixin_50344843發表於2020-12-14

Tomcat

Tomcat簡介

  • 最初是由Sun的軟體構架師詹姆斯鄧肯.戴維森開發
  • 安裝Tomcat後, 安裝路徑下面的目錄和檔案,是使用或者配置Tomcat的重要檔案

Tomcat重要目錄

  • bin:存放啟動和關閉Tomcat指令碼
  • conf:存放Tomcat不同的配置檔案
  • doc:存放Tomcat文件
  • lib:存放Tomcat執行需要的庫檔案
  • logs:存放Tomcat執行時的LOG檔案
  • src:存放Tomcat的原始碼
  • webapps:Tomcat的主要Web釋出目錄
  • work:存放jsp編譯後產生的class檔案

Tomcat部署與測試網站的搭建

  • 要求部署兩臺後端Tomcat伺服器
  • 為了進行測試,搭建兩個內容不同的網站
  • Tomcat部署與網站搭建步驟
    • 關閉firewall防火牆
    • 安裝JDK,配置JAVA環境
    • 安裝Tomcat
    • 建立 /web/webapp1目錄,修改server.html,將網站檔案目錄更改到/web/webapp1/路徑下
    • /web/webapp1/下建立測試頁面index.jsp,並進行測試

Nginx

Nginx應用

  • Nginx是一款非常優秀的HTTP伺服器軟體
    • 支援高達50000個併發連線數的響應
    • 擁有強大的靜態資源處理能力
    • 執行穩定
    • 記憶體、CPU等系統資源消耗非常低
  • 目前很多大型網站都應用Nginx伺服器作為後端網站程式的反向代理及負載均衡器,提升整個站點的負載併發能力

Nginx負載均衡實現原理

  • Nginx實現負載均衡是通過反向代理實現
  • 反向代理原理
    在這裡插入圖片描述
  • Nginx配置反向代理的主要引數
    • upstream 服務池名 { }
      • 配置後端伺服器池,以提供響應資料
    • proxy_pass http://服務池名
      • 配置將訪問請求轉發給後端伺服器池的伺服器處理

Nginx動靜分離實現原理

  • 動靜分離原理
    • 服務端接收來自客戶端的請求中,既有靜態資源也有動態資源,靜態資源由Nginx提供服務,動態資源Nginx轉發至後端
      在這裡插入圖片描述
  • Nginx靜態處理優勢
    • Nginx處理靜態頁面的效率遠高於Tomcat的處理能力
    • 若Tomcat的請求量為1000次,則Nginx的請求量為6000次
    • Tomcat每秒的吞吐量為0.6M,Nginx的每秒吞吐量為3.6M
    • Nginx處理靜態資源的能力是Tomcat處理的6倍

Nginx配置負載均衡、動靜分離

  • 在Nginx伺服器上安裝Nginx,反向代理兩個Tomcat站點,並實現負載均衡
    • 關閉Firewalld防火牆
    • 安裝Nginx依賴軟體包
    • 解壓並編譯安裝Nginx
    • 配置nginx.conf,新增location靜態頁面處理及新增upstream配置段與proxy_pass
    • 檢測配置檔案與啟動Nginx
    • 測試負載均衡、動靜分離效果

實現動靜分離和負載均衡架構部署專案

專案準備

nginx1 : 20.0.0.13
nginx2 : 20.0.0.14
tomcat1 : 20.0.0.15
tomcat2 : 20.0.0.16
nfs : 20.0.0.17
client : 20.0.0.18

專案配置

在nfs上

[root@nfs ~]# systemctl stop firewalld
[root@nfs ~]# setenforce 0
[root@nfs ~]# mkdir /web1
[root@nfs ~]# mkdir /web2
[root@nfs ~]# cd /web1
[root@nfs web1]# vi index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat1</title>
</head>
<body>
<% out.println("this is tomcat1 server");%>
<div>動態頁面</div><br/><img src="1.jpg" />
</body>
</html>

[root@nfs web1]# cp index.jsp /web2
[root@nfs web1]# cd /web2
[root@nfs web2]# vi index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
<html>
<head>
<title>tomcat2</title>
</head>
<body>
<% out.println("this is tomcat2 server");%>
<div>動態頁面</div><br/><img src="2.jpg" />
</body>
</html>

[root@nfs web2]#cd

在這裡插入圖片描述

在這裡插入圖片描述

[root@nfs ~]# vi /etc/exports

/web1 20.0.0.15(ro)
/web2 20.0.0.16(ro)

[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl restart rpcbind
[root@nfs ~]# showmount -e

在這裡插入圖片描述
在這裡插入圖片描述
在tomcat1上編輯
先加入安裝包
在這裡插入圖片描述
在這裡插入圖片描述

[root@tomcat1 ~]# systemctl stop firewalld
[root@tomcat1 ~]# setenforce 0
[root@tomcat1 ~]# ll
[root@tomcat1 ~]# tar zxvf apache-tomcat-8.5.16.tar.gz #解壓軟體包
[root@tomcat1 ~]# tar zxvf jdk-8u91-linux-x64.tar.gz
[root@tomcat1 ~]# mv jdk1.8.0_91/ /usr/local/java
[root@tomcat1 ~]# vi /etc/profile

在末尾新增
export JAVA_HOME=/usr/local/java # 設定全域性變數
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre #設定環境變數

[root@tomcat1 ~]# source /etc/profile
[root@tomcat1 ~]# echo $PATH
[root@tomcat1 ~]# java -version #檢視版本
[root@tomcat1 ~]# vi abc.java #編寫一個Java小程式來驗證

public class abc {
        public static void main (String[] args) {
                System.out.println("你好。。。。。");
        }
}

[root@tomcat1 ~]# javac abc.java #編譯
[root@tomcat1 ~]# java abc
#可以顯示出測試內容,則Java元件是好的

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
安裝tomcat

先解壓縮安裝包
[root@tomcat1 ~]# mv apache-tomcat-8.5.16/ /usr/local/tomcat8
[root@tomcat1 ~]# mkdir /webapp1
[root@tomcat1 ~]# mount 20.0.0.17:/web1 /webapp1 #掛載
[root@tomcat1 ~]# df -Th
[root@tomcat1 ~]# vi /usr/local/tomcat8/conf/server.xml #站點目錄

在這裡插入圖片描述

 [root@tomcat1 ~]# vi /usr/local/tomcat8/conf/server.xml 
 新增
 <Context docBase="/webapp1" path="" reloadable="false">
 </Context>

驗證
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
[root@tomcat1 ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown

[root@tomcat1 ~]#tomcatup
[root@tomcat1 ~]# netstat -anpt | grep 8080
[root@tomcat1 ~]# curl http://localhost:8080

在這裡插入圖片描述
在這裡插入圖片描述
在/webapp1的資料夾中加入圖片
在這裡插入圖片描述
訪問測試
在這裡插入圖片描述

在tomcat2上
步驟與部署tomcat1一致
修改web1,webapp1為web2,webapp2即可
在webapp2檔案中加入
在這裡插入圖片描述
在這裡插入圖片描述
訪問測試
在這裡插入圖片描述
部署排程器
在nginx1上部署
先新增nginx,keepalived安裝包
在這裡插入圖片描述

[root@nginx1 ~]# ls -lh
[root@nginx1 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
[root@nginx1 ~]# useradd -M -s /sbin/nologin nginx  #建立不可登入,不帶宿主的使用者
[root@nginx1 ~]# tar zxvf nginx-1.12.2.tar.gz      # 解壓縮
[root@nginx1 ~]# cd nginx-1.12.2/
[root@nginx1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx   #安裝路徑,屬主,屬組設定
[root@nginx1 nginx-1.12.2]# make && make install  # 編譯安裝
[root@nginx1 nginx-1.12.2]# ln -s /usr/local/nginx/conf/nginx.conf /etc/     #建立設定連結
[root@nginx1 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/    #  建立命令連結
[root@nginx1 nginx-1.12.2]# cd

在這裡插入圖片描述
在這裡插入圖片描述

[root@nginx1 ~]# vi /usr/local/nginx/conf/nginx.conf

upstream tomcat_server {
             server 20.0.0.15:8080 weight=1;
             server 20.0.0.16:8080 weight=1;
}
        location ~ \.jsp$ {
             proxy_pass http://tomcat_server;  
}

[root@nginx1 ~]# nginx -t   #檢查語法
[root@nginx1 ~]# nginx    #服務啟動
[root@nginx1 ~]# netstat -anpt | grep 80  # 檢視埠狀態

在這裡插入圖片描述
在/usr/local/nginx/html中新增圖片
在這裡插入圖片描述

訪問測試
在這裡插入圖片描述
安裝keepalived

[root@nginx1 ~]# modprobe ip_vs #載入ip_vs模組
[root@nginx1 ~]# yum -y install ipvsadm.x86_64 #安裝管理軟體ipvsadm
[root@nginx1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel #安裝編譯工具及外掛
[root@nginx1 ~]# tar zxvf keepalived-2.0.13.tar.gz #解壓keepalived安裝包
[root@nginx1 ~]# cd keepalived-2.0.13/
[root@nginx1 keepalived-2.0.13]# ./configure --prefix=/ #配置安裝到/目錄下
[root@nginx1 keepalived-2.0.13]# make && make install #編譯與安裝
[root@nginx1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d/ #加入系統管理服務,用以支援systemctl管理
[root@nginx1 keepalived-2.0.13]# systemctl enable keepalived #設定開機啟動
[root@nginx1 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf #編輯配置檔案

刪除所有
新增
! Configuration File for keepalived

global_defs {
     router_id nginx1      # 本伺服器的名稱
}
vrrp_script chk_http_port {
     script "/usr/local/src/nginx.sh"  #指令碼路徑 最後手動執行此指令碼,以確保指令碼能夠正常執行
     interval 2          #檢測間隔時間 單位秒
     weight 2
}
vrrp_instance vi_1 {
     state MASTER
     interface ens33    
     virtual_router_id 51   #虛擬路由編號,主從要一致
     priority 110            #優先順序
     adver_int 1             #檢查間隔,預設為1s (vrrp組播週期秒數)
     authentication {
          auth_type PASS
          auth_pass 1111
}
track_script {         
       chk_http_port     #呼叫檢測指令碼  
}
virtual_ipaddress {
     20.0.0.100    虛擬ip
}
}

[root@nginx1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d
[root@nginx1 keepalived-2.0.13]# vi /etc/init.d/keepalived   
[root@nginx1 keepalived-2.0.13]# chmod 755 /etc/init.d
[root@nginx1 keepalived-2.0.13]# chkconfig --add keepalived
[root@nginx1 keepalived-2.0.13]# chkconfig --list

# chkconfig: 35 21 79  執行級別

在這裡插入圖片描述

在這裡插入圖片描述
配置keepalived
在這裡插入圖片描述
在這裡插入圖片描述
編寫指令碼

[root@nginx1 keepalived-2.0.13]# vi /usr/local/src/nginx.sh
[root@nginx1 keepalived-2.0.13]# chmod +x /usr/local/src/nginx.sh
[root@nginx1 keepalived-2.0.13]# systemctl start keepalived
[root@nginx1 keepalived-2.0.13]# systemctl status keepalived
[root@nginx1 ~]# tail -100 /var/log/messages  #檢視日誌
[root@nginx1 ~]# ip addr   #檢視虛擬地址

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

在nginx2上
新增安裝包
在這裡插入圖片描述
在這裡插入圖片描述
在html檔案中新增圖片
在這裡插入圖片描述

[root@nginx2 ~]# ls -lh
[root@nginx2 ~]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel
[root@nginx2 ~]# useradd -M -s /sbin/nologin nginx  #建立不可登入,不帶宿主的使用者
[root@nginx2 ~]# tar zxvf nginx-1.12.2.tar.gz       #解壓縮
[root@nginx2 ~]# cd nginx-1.12.2/
[root@nginx2 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx   #安裝路徑,屬主,屬組設定
[root@nginx2 nginx-1.12.2]# make && make install   #編譯安裝
[root@nginx2 nginx-1.12.2]# ln -s /usr/local/nginx/conf/nginx.conf /etc/     #建立設定連結
[root@nginx2 nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/      #建立命令連結
[root@nginx2 nginx-1.12.2]# cd
[root@nginx2 ~]# cd /usr/local/nginx/html
新增圖片

在這裡插入圖片描述

在這裡插入圖片描述
訪問測試
在這裡插入圖片描述
在nginx2上安裝keepalived

與nginx1上配置相同
[root@nginx2 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@nginx2 ~]# tar zxvf keepalived-2.0.13.tar.gz    #解壓縮
[root@nginx2 ~]# cd keepalived-2.0.13/
[root@nginx2 keepalived-2.0.13]# ./configure --prefix=/      #路徑設定
[root@nginx2 keepalived-2.0.13]# make && make install   #編譯安裝
[root@nginx2 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d
[root@nginx2 keepalived-2.0.13]# vi /etc/init.d/keepalived   
[root@nginx2 keepalived-2.0.13]# chmod 755 /etc/init.d
[root@nginx2 keepalived-2.0.13]# chkconfig --add keepalived
[root@nginx2 keepalived-2.0.13]# chkconfig --list

新增執行級別
# chkconfig: 35 21 79

[root@nginx2 keepalived-2.0.13]# vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
     router_id nginx2      
}
vrrp_script chk_http_port {
     script "/usr/local/src/nginx.sh"  
     interval 2          
     weight 2
}
vrrp_instance vi_1 {
     state BACKUP
     interface ens33    
     virtual_router_id 51   
     priority 105
     adver_int 1             
     authentication {
          auth_type PASS
          auth_pass 1111
}
track_script {         
       chk_http_port     
}
virtual_ipaddress {
     20.0.0.100    
}
}


在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
編寫指令碼

[root@nginx2 keepalived-2.0.13]# vi /usr/local/src/nginx.sh
[root@nginx2 keepalived-2.0.13]# chmod +x /usr/local/src/nginx.sh
[root@nginx2 keepalived-2.0.13]# systemctl start keepalived
[root@nginx2 keepalived-2.0.13]# systemctl status keepalived

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`    查詢程式數
if [ $A -eq 0 ]          
then /usr/local/nginx/sbin/nginx
   if [ `ps -C nginx --no-header | wc -l` -eq 0 ]
    then exit 1
    else exit 0
   fi
else
   exit 0
fi

[root@nginx2 keepalived-2.0.13]# tail -100 /var/log/messages
[root@nginx2 keepalived-2.0.13]# ip addr

在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述

關閉主排程器上面的keepalive服務後,虛擬地址將自行漂移到備用排程器上面
在這裡插入圖片描述

相關文章