實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

前言

​ 想必你們對於Nginx和Tomcat都很是熟悉了,Nginx的應用很是普遍,不只是對web靜態資源很是友好,並且也是很是實用的反向代理和負載均衡軟件。結合後端Tomcat的服務,從而搭建Nginx+Tomcat集羣。css

​ 對於直接想要實踐的朋友而言能夠獲取本文的連接中的軟件包後直接看第三備份的內容。html

1、集羣搭建結構及拓撲

1.1集羣架構圖示

Nginx+Tomcat集羣的結構示意圖以下:java

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

1.2系統環境與地址規劃

使用三臺Centos7服務器(7.4),規劃以下:linux

服務器 網卡模式 IP地址
Nginx NAT 20.0.0.128
Tomcat1 NAT 20.0.0.130
Tomcat2 NAT 20.0.0.136

1.3拓撲圖以下

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

1.4相關資源軟件

連接:https://pan.baidu.com/s/1Qdla-vrpcspcAKJucZdSUg
提取碼:40itnginx

2、搭建思路及核心部分配置

​ 根據上述的結構圖示,爲了完成該實踐內容,須要先梳理搭建的思路,搞清楚核心部分的操做與配置。c++

一、首先咱們須要在三臺服務器上編譯安裝對應的服務(軟件包在上面的連接中),測試服務是否正常;web

二、其次基於核心功能:負載均衡以及動態分離,須要一步一步理清楚算法

基於負載均衡

​ 負載均衡是在Nginx服務器上配置的,就須要對nginx的主配置文件進行配置,實現負載均衡的模塊是使用upstream模塊以及對應須要的算法(本文使用簡單的加權輪循算法實現負載均衡)。核心配置:shell

#server指令外層
upstream tomcat-server {
                server 20.0.0.130:8080 weight=1;
                server 20.0.0.136:8080 weight=1;
        }
#server指令中
location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat-server;
        }

訪問nginx的服務器地址,能夠輪循訪問後端的兩臺真實的Tomcat服務器。apache

基於動態分離

​ 咱們知道對於Nginx而言,其對靜態資源的支持是很是友好的,而Tomcat對於java的動態web頁面的支持很是好。因此須要實現動態分離就是將靜態請求給予nginx服務器運行,Tomcat負責處理相似jsp文件的動態請求。

​ 本次案例使用nginx服務器和一臺Tomcat服務器作動態分離。最終將結合靜態圖片讓nginx負責處理,而使用Tomcat處理動態頁面。

核心配置:

nginx服務器:

location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
            root html/demo;
            expires 30d;
        }
location ~.*.jsp$ {       ##匹配jsp頁面跳轉代理服務器池
           proxy_pass http://tomcat-server;
           proxy_set_header Host $host;
        }
 location / {
            root   html;
            index  index.html index.htm;
            #proxy_pass http://tomcat-server;
        }

tomcat服務器:

<Context docBase="/usr/local/tomcat/webapps/demo" path="" reloadable="false">
         </Context>

三、在部署和配置的過程當中,進行必要的驗證

好了大體的流程和核心配置講完了,下面開始本次案例的完整演示。

3、部署流程與實踐過程

負載均衡集羣搭建

3.1部署配置兩個tomcat服務器

​ 因爲部署兩個tomcat服務器的流程幾乎一致(除了頁面顯示的內容部分不一致,固然是爲了驗證負載均衡),而且不顯得本文過於冗長,就演示tomcat1服務器上的部署。

3.1.1安裝jdk

====================================================================================
tomcat1
[root@localhost ~]# hostnamectl set-hostname tomcat1
[root@localhost ~]# su
[root@tomcat1 ~]# cd /opt/
[root@tomcat1 opt]# ls
apache-tomcat-9.0.16.tar.gz  jdk-8u91-linux-x64.tar.gz  rh
[root@tomcat1 opt]# tar zxf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@tomcat1 opt]# vim /etc/profile  #聲明環境變量
#末尾
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_NAME}/bin:$PATH
[root@tomcat1 opt]# source /etc/profile

3.1.2部署安裝tomcat

[root@tomcat1 opt]# ls
apache-tomcat-9.0.16.tar.gz  jdk-8u91-linux-x64.tar.gz  rh
[root@tomcat1 opt]# tar zxf apache-tomcat-9.0.16.tar.gz -C /usr/local/
[root@tomcat1 opt]# cd /usr/local/
[root@tomcat1 local]# ls
apache-tomcat-9.0.16  bin  etc  games  include  jdk1.8.0_91  lib  lib64  libexec  sbin  share  src
[root@tomcat1 local]# mv apache-tomcat-9.0.16/ tomcat
[root@tomcat1 local]# cd tomcat/
[root@tomcat1 tomcat]# ls
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp         work
[root@tomcat1 bin]# ls  #將下面中的啓動腳本和關閉腳本創建軟連接
bootstrap.jar       ciphers.sh                    daemon.sh     setclasspath.bat  startup.sh            version.bat
catalina.bat        commons-daemon.jar            digest.bat    setclasspath.sh   tomcat-juli.jar       version.sh
catalina.sh         commons-daemon-native.tar.gz  digest.sh     shutdown.bat      tomcat-native.tar.gz
catalina-tasks.xml  configtest.bat                makebase.bat  shutdown.sh       tool-wrapper.bat
ciphers.bat         configtest.sh                 makebase.sh   startup.bat       tool-wrapper.sh
[root@tomcat1 bin]# ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin
[root@tomcat1 bin]# ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin

#建立站點目錄以及文件(web頁面)
[root@tomcat1 local]# mkdir -p /web/webapp1
[root@tomcat1 local]# cd /web/webapp1/
[root@tomcat1 webapp1]# vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
 <head>
    <title>JSP test1 page</title>  #網頁標題名字
 </head>
 <body>
    <% out.println("Welcome tomcat1 Web");%> #網頁內容爲:welcome tomcat1 web 惟一須要在tomcat2上面更改配置的部分(再次聲明這樣是爲了驗證效果,生產環境中是一致的哈~)
 </body>
</html>
[root@tomcat1 webapp1]# vim /usr/local/tomcat/conf/server.xml #配置服務文件在149行添加context標籤語句 
148       <Host name="localhost"  appBase="webapps"
149             unpackWARs="true" autoDeploy="true">
150          <Context docBase="/web/webapp1" path="" reloadable="false">
151          </Context>
[root@tomcat1 webapp1]# startup.sh #開啓服務
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_91/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat1 webapp1]# netstat -ntap | grep 8080 #檢查tomcat服務是否開啓
tcp6       0      0 :::8080                 :::*                    LISTEN      2020/java 

[root@tomcat1 webapp1]# systemctl status firewalld.service  #查看防火牆對防火牆進行設置
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2020-04-05 11:04:32 CST; 19min ago
   ......
[root@tomcat1 webapp1]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
[root@tomcat1 webapp1]# firewall-cmd --reload
success

3.2部署配置nginx服務器

3.2.1手工編譯安裝nginx服務(這裏沒必要多說了哈)

[root@nginx opt]# tar zxf nginx-1.12.0.tar.gz -C /usr/local/
[root@nginx opt]# yum install -y gcc gcc-c++ make zlib-devel pcre-devel

[root@nginx opt]# useradd -M -s /sbin/nologin nginx
[root@nginx opt]# cd /usr/local/nginx-1.12.0/
[root@nginx nginx-1.12.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_flv_module
[root@nginx nginx-1.12.0]# make && make install
[root@nginx nginx-1.12.0]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3.3配置驗證明現負載均衡

3.3.1upstream模塊實現負載均衡

[root@nginx nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf
#在nginx.conf的gzip下面寫入tomcat服務器池,tomcat-server表示一個名稱,能夠理解爲服務器的域名
#gzip  on;

    upstream tomcat-server {
                server 20.0.0.130:8080 weight=1;#根據加權輪循算法調度訪問後端的tomcat服務器
                server 20.0.0.136:8080 weight=1;
                }
location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat-server; #配置代理服務器
        }
[root@nginx nginx-1.12.0]# 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@nginx nginx-1.12.0]# nginx #啓動服務
[root@nginx nginx-1.12.0]# netstat -napt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      53804/nginx: master 
[root@nginx nginx-1.12.0]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@nginx nginx-1.12.0]# firewall-cmd --reload
success

3.3.2驗證負載均衡

​ 客戶機上訪問nginx服務器地址,而後刷新一次,結果以下面兩張圖:

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

動態分離實現過程演示

​ 這次只是爲了實現動靜分離的目的,因此只須要進行必要的演示便可,採用nginx服務器和一臺tomcat服務器便可。

3.4模擬訪問動靜態資源(非同一web頁面)

爲了方便管理仍是推薦寫一個nginx服務的管理腳本

[root@nginx nginx-1.12.2]# vim /etc/init.d/nginx  ##編寫service啓動腳本
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
    start)
        $PROG
        ;;
    stop)
        kill -s QUIT $(cat $PIDF)
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    reload)
        kill -s HUP $(cat $PIDF)
        ;;
    *)
                echo "Usage: $0 {start|stop|restart|reload}"
                exit 1
esac
exit 0
[root@nginx nginx-1.12.2]# chmod +x /etc/init.d/nginx 
[root@nginx nginx-1.12.2]# chkconfig --add nginx

3.4.1暫時註釋原有的nginx的代理服務配置

location / {
            root   html;
            index  index.html index.htm;
            #proxy_pass http://tomcat-server;
        }

3.4.2修改默認的站點目錄文件(顯示頁面)(聲明nginx做爲靜態資源訪問的請求處理端)

[root@nginx html]# vim index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p><em>this is a static web page.</em></p> #em表示斜體
</body>
</html>

重啓服務此時訪問nginx服務器,獲取的是:

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

3.4.3在tomcat1上寫一個jsp的動態頁面

#建立一個站點目錄demo,編寫一個jsp腳本
vim /usr/local/tomcat/webapps/demo/index.jsp 
<!DOCCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>動態頁面</title>
</head>
<body>
<div>動態頁面1</div>
</body>
</html>

更改server.xml
<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context docBase="/usr/local/tomcat/webapps/demo" path="" reloadable="false">
         </Context>
        <!--<Context docBase="/web/webapp1" path="" reloadable="false">
         </Context> -->

那麼此時在nginx服務器上須要location對訪問的jsp文件進行ip跳轉訪問的配置:

location ~.*.jsp$ {       ##匹配jsp頁面跳轉代理服務器池
           proxy_pass http://tomcat-server;
           proxy_set_header Host $host;
        }

3.4.4測試驗證

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

3.5對於同一web頁面實現動態訪問tomcat,靜態資源從nginx上獲取

使用一張圖片做爲jsp文件,其中包含一張jpg格式的圖片從nginx服務器上獲取

具體配置以下

nginx上:須要建立demo目錄(demo和tomcat上的目錄的名稱必須一致)存放jpg

#首先取消上面的代理註釋內容,由於測試的時候訪問的是20.0.0.128
server {
        listen       80;
        server_name  localhost;

        location ~.*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
            root html/demo;
            expires 30d;
        }
        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        location ~.*.jsp$ {       ##匹配jsp頁面跳轉代理服務器池
           proxy_pass http://tomcat-server;
           proxy_set_header Host $host;
        }
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcat-server;
        }

tomcat:

jsp文件中添加一個圖片連接:

[root@tomcat1 demo]# vim /usr/local/tomcat/webapps/demo/index.jsp 
<!DOCCTYPE html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>動態頁面</title>
</head>
<body>
<div>動態頁面1</div><br>
<img src="cat.jpg"> #添加的內容
</body>
</html>
~

jsp資源:在demo目錄下

[root@tomcat1 demo]# ls
index.jsp

圖片資源在:html目錄下

[root@nginx html]# ls
50x.html  demo  index.html
[root@nginx html]# cd demo/
[root@nginx demo]# ls
cat.jpg
[root@nginx demo]#

此時重啓nginx服務訪問20.0.0.128

第一次訪問的是文字+圖片,第二次因爲在第二臺服務器上沒有進行相關配置則訪問內容依舊和以前負載均衡的內容同樣。

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

實踐出真知——一文教你搭建Nginx+Tomcat集羣,實現負載均衡及動靜分離

簡單總結

​ 其實結合這次實踐,能夠理解如何將動靜分離和負載均衡結合起來,從而搭建nginx+tomcat集羣服務了。若是說最後實現動態文字所表明的動態資源,加上這個可愛的小貓表明的靜態資源(理解動靜分離),結合前面的負載均衡完善tomcat2服務器配置就能夠根據算法實現負載均衡了。

​ 總之,咱們須要對配置文件很是熟悉,瞭解其功能模塊,最後須要明白是如何基於各類模塊或指令上下文進行訪問跳轉的,匹配的關係須要理清楚(邏輯關係)。

相關文章
相關標籤/搜索