想必你們對於Nginx和Tomcat都很是熟悉了,Nginx的應用很是普遍,不只是對web靜態資源很是友好,並且也是很是實用的反向代理和負載均衡軟件。結合後端Tomcat的服務,從而搭建Nginx+Tomcat集羣。css
對於直接想要實踐的朋友而言能夠獲取本文的連接中的軟件包後直接看第三備份的內容。html
Nginx+Tomcat集羣的結構示意圖以下:java
使用三臺Centos7服務器(7.4),規劃以下:linux
服務器 | 網卡模式 | IP地址 |
---|---|---|
Nginx | NAT | 20.0.0.128 |
Tomcat1 | NAT | 20.0.0.130 |
Tomcat2 | NAT | 20.0.0.136 |
連接:https://pan.baidu.com/s/1Qdla-vrpcspcAKJucZdSUg
提取碼:40itnginx
根據上述的結構圖示,爲了完成該實踐內容,須要先梳理搭建的思路,搞清楚核心部分的操做與配置。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>
三、在部署和配置的過程當中,進行必要的驗證
好了大體的流程和核心配置講完了,下面開始本次案例的完整演示。
因爲部署兩個tomcat服務器的流程幾乎一致(除了頁面顯示的內容部分不一致,固然是爲了驗證負載均衡),而且不顯得本文過於冗長,就演示tomcat1服務器上的部署。
==================================================================================== 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
[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
[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/
[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
客戶機上訪問nginx服務器地址,而後刷新一次,結果以下面兩張圖:
這次只是爲了實現動靜分離的目的,因此只須要進行必要的演示便可,採用nginx服務器和一臺tomcat服務器便可。
爲了方便管理仍是推薦寫一個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
location / { root html; index index.html index.htm; #proxy_pass http://tomcat-server; }
[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服務器,獲取的是:
#建立一個站點目錄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; }
使用一張圖片做爲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集羣服務了。若是說最後實現動態文字所表明的動態資源,加上這個可愛的小貓表明的靜態資源(理解動靜分離),結合前面的負載均衡完善tomcat2服務器配置就能夠根據算法實現負載均衡了。
總之,咱們須要對配置文件很是熟悉,瞭解其功能模塊,最後須要明白是如何基於各類模塊或指令上下文進行訪問跳轉的,匹配的關係須要理清楚(邏輯關係)。