Nginx也是一款服務器,我們常用它做如:反向代理、負載均衡、動態與靜態資源的分離的工作 反向代理:相對應的是正向代理,如果你使用過代理服務器的話就明白,我們訪問某一個網站并非直接訪問目標網站,而是告訴代理服務器我需要訪問什么目標網站,由代理服務器發出請求給目標網站,將目標網站訪問結果再轉發給你,此時,你是請求代理方。而反向代理是此時代理服務器做服務器的代理,我們的訪問請求并非直接訪問到目標服務器上,而是訪問代理服務器,由代理服務器決定什么樣的請求以什么樣的方式訪問正式服務器 負載均衡:目前大多數的網站都會采用負載均衡手段來針對目前用戶的指數級增長來減少對單點服務器的負載壓力,比如目前我們擁有3臺真實服務器,我們需要根據相應策略決定什么樣的用戶請求分配到哪個真實服務器,比如按照輪詢的方式,用戶請求挨個到達代理服務器,此時代理服務器按照第一個請求轉發至第一臺真實服務器,第二個請求轉發到第二個服務器上,依次類推,這樣可以防止大量的用戶請求全部訪問到同一臺物理機上,單點物理機的性能始終有限的,當然這可能對服務器數據訪問時候造成事務性的失效,在Web方面可能造成Session訪問的問題,這不在本文討論方面內 動態靜態資源分離:最方便列舉就是Java的JSP和靜態資源如:.js/.css/.html/.png方面的資源分離,之前開發web方面的程序時候我們習慣將html、css等資源文件也放置于Tomcat之中,用戶訪問后tomcat需要將請求的這些靜態資源文件一并返回給用戶,再者如果有多臺同業務邏輯的tomcat服務器的話,同樣的資源還需要在每個服務器上放一份,同時也增加了tomcat服務器的網絡IO,十分不合算的,如果我們只講JSP之類的請求交給tomcat,而代理服務器上存放靜態資源,當用戶的請求非動態資源的時候,我們完全可以將代理服務器的靜態資源直接返回給用戶,而不去增大Tomcat的壓力,tomcat只需要負責邏輯處理和動態資源的加載就可以了 基于上述的Nginx優勢,決定搭建一下Nginx+Tomcat的組合來進行測試,包括參數傳遞,post、get傳遞參數是否有影響,還有Nginx的工作模式master和worker的工作方式進行一些淺薄的總結 1 2 3 4 5 6 7 8 9 10
安裝部分這里就不在細說了,網上的教程很多,我們直接從配置文件開始吧 1 2
#user nobody; #這里是核心worker數,一般設置為與cpu核心數相同的數目,避免進程切換造成的上下文切換耗費資源,cpu信息可以從/proc/cpuinfo中查看 worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { #use epoll model使用epoll模型,采用異步非阻塞模型加快處理速度 use epoll; worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; #設定通過nginx上傳文件的大小 client_max_body_size 300m; #使用sendfile函數在兩個文件描述符之間直接傳遞數據(完全在內核中操作,傳送),從而避免了內核緩沖區數據和用戶緩沖區數據之間的拷貝,操作效率很高,被稱之為零拷貝。 sendfile on; #tcp_nopush on; #keepalive_timeout 0; #連接活躍時間 keepalive_timeout 65; #使用壓縮數據減少IO量,但是在不支持數據解壓瀏覽器可能產生亂碼 #gzip on; #靜態服務器組 #設定靜態資源服務器訪問接口 upstream static.zh-jieli.com { server localhost:808 weight=1; } #動態服務器組 upstream zh-jieli.com { #設置Hash輪詢規則 #ip_hash; #weight: server ip:port weight=10 #默認 輪詢 #fair:按照后端服務器的響應時間來分配 #url_hash:按照url規則進行分配,使得固定的請求分配到固定的服務器上 server localhost:8080; server localhost:8081; } server{ listen 808; server_name static; location / { } location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) { #所有靜態文件直接讀取硬盤內容:讀取的靜態資源存放位置 root /apache-tomcat-8.5.24/webapps/ROOT ; #資源是否進行緩存與緩存時間 expires 30d; #緩存30天 } } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index1.html index.htm; } location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) { #proxy_cache cache_one; proxy_cache_valid 200 304 302 5d; proxy_cache_valid any 5d; proxy_cache_key '$host:$server_port$request_uri'; add_header X-Cache '$upstream_cache_status from $host'; proxy_pass http://static.zh-jieli.com; # 所有靜態文件直接讀取硬盤 root /apache-tomcat-8.5.24/webapps/ROOT; expires 30d; #緩存30天 } #其他頁面反向代理到tomcat容器 location ^~ /tomcat { index index; # proxy_pass http://localhost:8080/; #設定代理服務器組 proxy_pass http://zh-jieli.com/; } error_page 500 502 503 504 /50x.html; location=/50x.html { root html; } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 整個nginx工作時當http請求到來時,由nginx針對nginx.conf配置好的規則,對location進行正則匹配,匹配到相應的正則,進行location內部的處理 關于Nginx的location配置附上一篇博客,很nice http://seanlook.com/2015/05/17/nginx-location-rewrite/ 里面很詳細列出了各種要求的location匹配規則,值得注意的一點是: location匹配遵循最長原則,即滿足了之前的匹配規則后,除了遇見^會終止向下繼續匹配,其他情況會依次向下搜索,知道找到合適的location匹配規則然后進行處理 Nginx在模塊功能上分三個模塊: Handlers(處理器模塊)。此類模塊直接處理請求,并進行輸出內容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。 Filters (過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最后由Nginx輸出。 Proxies (代理類模塊)。此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與后端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能。 因為是測試,所以我的兩個tomcat都安裝到了同一臺本地機器上 生產環境中根據需要進行配置相應的IP就好了 本地寫好相應的測試代碼+log4j將信息日志打到相應的位置用來觀察參數是否傳遞過來 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
TestOne.java
package com.nginx.controllers; import com.nginx.utils.Log4jUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("/test") public class TestOne { @RequestMapping("/getname") public void test(@RequestParam(value="name") String name) { //用來記錄獲取的參數name,可以通過查看日志進行確認 Log4jUtils.getLogger().info("my name is" + name); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Log4jUtils.java
package com.nginx.utils; import org.apache.log4j.Logger; public class Log4jUtils { private static final Logger logger=Logger.getLogger(Logger.class); public static Logger getLogger() { return logger; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 這里簡單做了兩個的demo程序,做相應的測試,將項目打成war包后上傳至Linux服務器,移動到tomcat/webapps中,tomcat進行熱部署 先測試當前的tomcat是否能正常運行,由于沒有做區別頁面,就直接看日志來判斷了 1 2 3
如圖:以輪詢方式進行訪問8080和8081監聽的tomcat 上述方式是get請求進行的測試,我們來試試post 1 2 3 4 <!DOCTYPE html> <html> <body> <form action="http://123.207.85.242/tomcat/nginx/test/getname" method="post"> <input type="text" name="name"> <input type="submit" value="提交"> </form> </body> </html> 1 2 3 4 5 6 7 8 9 測試結果依舊可以正常接收參數,這里就不貼圖了 1 2
現在試試直接訪問 1 2 http://ip/tomcat 1 我們會直接跳轉到tomcat的主頁面,如果檢索tomcat.png的話 1 2 http://ip/tomcat/tomcat.png 1 可以直接檢索到tomcat.png,它是來自tomcat服務器的資源,如果需要檢索nginx的靜態資源,可以使用 1 2 http://ip/tomcat.png 1 這樣我們的資源就來自于nginx.conf文件中配置的關于靜態資源的訪問路徑了,為了證明此事資源來自于nginx,我嘗試將8080端口的tomcat/webapps/ROOT/tomcat.png更名為tomcat1.png,然后嘗試訪問http://ip/tomcat1.png訪問成功,這時候如果刷新http://ip/tomcat/訪問tomcat主頁的時候會發現圖標會在出現和不出現之間輪轉,原因就是這里請求了tomcat服務器本身去拿資源,tomcat:8080的圖片名被更改,如果代理訪問的服務器正好是tomcat:8080的話,它是找不到tomcat.png的,當然輪轉到tomcat:8081時候,圖片還是會出現滴 1 2
如圖nginx啟動后會有兩個進程 如果你將nginx.conf的 1 2 3 worker_processes 1;更改為worker_processes 2; 1 那么出現的就是 1 2
那我們來說說master和worker進程分別的是干什么的,從pid來看,matser的父進程是init進程,而worker的父進程都是master,這里就很有意思了,那nginx這兩個進程都到底是干嘛的嘞??? 感謝baidu與google的強大,對于疑問的解釋很清楚 原地址:http://blog.csdn.net/hguisu/article/details/8930668 感興趣的同學可以看一看,這里只簡單總結一下 1 2 3 4 5 6 7
主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程退出后(異常情況下),會自動重新啟動新的worker進程。 master的平滑重啟很有意思,master只負責接收外界信號,那么當我們更改了nginx.conf文件需要重新啟動nginx時候怎么辦????只需要通過kill向master進程發送信號就行了。比如kill -HUP pid,這時候master并不會干掉自己所有的worker然后自殺,而是重新加載nginx.conf后,重新啟動一批worker,在這之后的請求全部由新的worker進行處理,而老的worker也并不是立即終止,而是在運行完當前的請求后,被終止掉,接下來的請求就全部交給新的worker了,當然這個方式后來被改成了 1 2 3 nginx -s reload 1 這個命令重新加載配置和上面的略有不一樣,其會新啟動一個nginx然后向Master發送信號,當然接下來就和上面的過程一致了 1 2
ntroduction
部署是指將Web應用程序(第三方WAR或您自己的自定義Web應用程序)安裝到Tomcat服務器的過程。
Web應用程序部署可以在Tomcat服務器中以多種方式完成。
Tomcat Manager是一個Web應用程序,可以通過HTML GUI交互使用,或以編程方式(通過基于URL的API)來部署和管理Web應用程序。
有許多方法可以執行依賴Manager Web應用程序的部署。 Apache Tomcat為Apache Ant構建工具提供任務。Apache Tomcat Maven Plugin project提供與Apache Maven的集成。還有一個名為Client Deployer的工具,可以從命令行使用它,并提供其他功能,例如編譯和驗證Web應用程序以及將Web應用程序打包到Web應用程序資源(WAR)文件中。
Installation
靜態部署Web應用程序不需要安裝,因為Tomcat提供了開箱即用的功能。使用Tomcat Manager的部署功能也不需要任何安裝,盡管需要進行一些配置,詳細說明在下一節。但是,如果您希望使用Tomcat客戶端部署程序(TCD),則需要安裝。
TCD未與Tomcat核心發行版一起打包,因此必須從“下載”區域單獨下載。下載通常是標記的apache-tomcat-9.0.x-deployer.
TCD需要先安裝Apache Ant 1.6.2+和Java。您需要設置指向Ant安裝根目錄的ANT_HOME環境值,以及指向Java安裝根目錄的JAVA_HOME值。此外,您應該確保Ant的ant命令,以及Java javac編譯器命令可以在shell中運行。
A word on Contexts
在談論Web應用程序的部署時,Context這個概念需要被理解。 Context在Tomcat中被稱為Web應用程序。
為了在Tomcat中配置一個Context ,一個Context Descriptor(Context描述)是必須的。Context Descriptor只是一個XML文件,它包含上下文的Tomcat相關配置,例如命名資源或會話管理器配置。在早期版本的Tomcat中,Context Descriptor配置的內容通常存儲在Tomcat的主配置文件中server.xml。但現在不鼓勵這種做法(盡管目前仍然有效)。
Context Descriptor不僅幫助Tomcat知道如何配置上下文,而且其他工具(如Tomcat Manager和TCD)通常使用這些上下文描述符來正確執行其角色。
Context Descriptor的位置是:
(1)中的文件名為[webappname] .xml,但(2)中的文件名為context.xml。如果沒有為Context提供Context Descriptor,Tomcat將使用默認值配置Context。
在Tomcat啟動時部署
如果您對使用Tomcat Manager或TCD不感興趣,那么您需要將Web應用程序靜態部署到Tomcat,然后啟動Tomcat,此類部署的位置稱為appBase,它對于每個主機是指定的。你要么復制一個所謂的exploded web application到此位置,或壓縮的Web應用程序資源.WAR文件。
還有當Host的deployOnStartup屬性為“true”時,在Tomcat啟動時應用才會部署到appBase指定的位置。
在這種情況下,Tomcat啟動時將發生以下部署順序:
在正在運行的Tomcat服務器上部署
可以將Web應用程序部署到正在運行的Tomcat服務器。
如果 Host的 autoDeploy屬性為“true”,主機將嘗試根據需要動態部署和更新Web應用程序,例如,如果將新的.WAR放入appBase。為此,主機需要啟用后臺處理,這是默認配置。
autoDeploy設置為“true”,運行Tomcat允許:
請注意,也可以在加載程序中配置Web應用程序重新加載,在這種情況下,將跟蹤已加載的類以進行更改。
使用客戶端部署程序包進行部署
最后,可以使用Tomcat Client Deployer實現Web應用程序的部署。這是一個包,可用于驗證,編譯,壓縮到.WAR,以及將Web應用程序部署到生產或開發Tomcat服務器。應該注意,此功能使用Tomcat Manager,因此目標Tomcat服務器應該運行。
假設用戶熟悉Apache Ant以使用TCD。 Apache Ant是一個腳本化的構建工具。 TCD預先打包了要使用的構建腳本。只需要對Apache Ant有一定的了解(本頁前面列出的安裝,熟悉使用操作系統命令shell和配置環境變量)。
TCD包括Ant任務,部署前用于JSP編譯的Jasper頁面編譯器,以及驗證Web應用程序上下文描述符的任務。驗證器任務(類org.apache.catalina.ant.ValidatorTask)僅允許一個參數:解壓的Web應用程序的基本路徑。
TCD使用解壓的Web應用程序作為輸入(請參閱下面使用的屬性列表)。以部署程序編程部署的Web應用程序可以包括上下文描述符/META-INF/context.xml.
TCD包含一個即用型Ant腳本,具有以下目標:
為了配置部署,請創建一個名為的文件deployer.properties在TCD安裝目錄root中。在此文件中,每行添加以下name=value對:
此外,您需要確保已為目標Tomcat Manager(TCD使用)設置了用戶,否則TCD將不會使用Tomcat Manager進行身份驗證,部署將失敗。要執行此操作,請參閱Tomcat Manager頁面。
Tomcat是Apache軟件基金會(Apache Software Foundation)的Jakarta 項目中的一個核心項目,由Apache、Sun和其他一些公司及個人共同開發而成。
Tomcat服務器是一個免費的開放源代碼的Web應用服務器,屬于輕量級應用服務器,在中小型系統和并發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP程序的首選。
Tomcat和Nginx、Apache(httpd)、lighttpd等Web服務器一樣,具有處理HTML頁面的功能,另外它還是一個Servlet和JSP容器,獨立的Servlet容器是Tomcat的默認模式。不過,Tomcat處理靜態HTML的能力不如Nginx/Apache服務器。
JDK是 Java 語言的軟件開發工具包,主要用于移動設備、嵌入式設備上的java應用程序。JDK是整個java開發的核心,它包含了JAVA的運行環境(JVM+Java系統類庫)和JAVA工具。
JDK包含了一批用于Java開發的組件,其中包括:
javac:編譯器,將后綴名為.java的源代碼編譯成后綴名為“.class”的字節碼
java:運行工具,運行.class的字節碼
jar:打包工具,將相關的類文件打包成一個文件
javadoc:文檔生成器,從源碼注釋中提取文檔,注釋需匹配規范
jdb debugger:調試工具
jps:顯示當前java程序運行的進程狀態
javap:反編譯程序
appletviewer:運行和調試applet程序的工具,不需要使用瀏覽器
javah:從Java類生成C頭文件和C源文件。這些文件提供了連接膠合,使Java和C代碼可進行交互。
javaws:運行JNLP程序
extcheck:一個檢測jar包沖突的工具
apt:注釋處理工具
jhat:java堆分析工具
jstack:棧跟蹤程序
jstat:JVM檢測統計工具
jstatd:jstat守護進程
jinfo:獲取正在運行或崩潰的java程序配置信息
jmap:獲取java進程內存映射信息
idlj:IDL-to-Java編譯器。將IDL語言轉化為java文件
policytool:一個GUI的策略文件創建和管理工具
jrunscript:命令行腳本運行
JDK中還包括完整的JRE(Java Runtime Environment),Java運行環境,也被稱為private runtime。包括了用于產品環境的各種庫類,如基礎類庫rt.jar,以及給開發人員使用的補充庫,如國際化與本地化的類庫、IDL庫等等。
JDK中還包括各種樣例程序,用以展示Java API中的各部分。
安裝時候選擇tomcat軟件版本要與程序開發使用的版本一致。jdk版本要進行與tomcat保持一致。
[root@web03 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@web03 ~]# uname -a
Linux web03 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@web03 ~]# getenforce
Disabled
[root@web03 ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
命令集:
tar xf jdk-8u60-linux-x64.tar.gz -C /application/
ln -s /application/jdk1.8.0_60 /application/jdk
# 設置環境變量
sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
source /etc/profile
測試jdk是否安裝成功↓
[root@web03 ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
命令集:
tar xf apache-tomcat-8.0.27.tar.gz -C /application/
ln -s /application/apache-tomcat-8.0.27 /application/tomcat
# 設置環境變量
echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
source /etc/profile
# 注意授權,統一權限
chown -R root.root /application/jdk/ /application/tomcat/
檢查tomcat是否安裝成功
[root@web03 ~]# /application/tomcat/bin/version.sh
Using CATALINA_BASE: /application/tomcat
Using CATALINA_HOME: /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.27
Server built: Sep 28 2015 08:17:25 UTC
Server number: 8.0.27.0
OS Name: Linux
OS Version: 3.10.0-693.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_60-b27
JVM Vendor: Oracle Corporation
[root@web03 ~]# cd /application/tomcat/
[root@web03 tomcat]# tree -L 1
.
├── bin #存放tomcat管理腳本
├── conf # tomcat 配置文件存放目錄
├── lib # web應用調用的jar包存放路徑
├── LICENSE
├── logs # tomcat 日志存放目錄,catalina.out 為主要輸出日志
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp # 存放臨時文件
├── webapps # web程序存放目錄
└── work # 存放編譯產生的.java 與 .class文件
7 directories, 4 files
[root@web03 tomcat]# cd webapps/
[root@web03 webapps]# tree -L 1
.
├── docs # tomcat 幫助文檔
├── examples # web應用實例
├── host-manager # 主機管理
├── manager # 管理
└── ROOT # 默認站點根目錄
5 directories, 0 files
[root@web03 conf]# tree -L 1
.
├── Catalina
├── catalina.policy
├── catalina.properties
├── context.xml
├── logging.properties
├── logs
├── server.xml # tomcat 主配置文件
├── server.xml.bak
├── server.xml.bak2
├── tomcat-users.xml # tomcat 管理用戶配置文件
├── tomcat-users.xsd
└── web.xml
2 directories, 10 files
# 啟動程序/application/tomcat/bin/startup.sh
# 關閉程序/application/tomcat/bin/shutdown.sh
啟動停止
[root@web03 ~]# /application/tomcat/bin/shutdown.sh
Using CATALINA_BASE: /application/tomcat
Using CATALINA_HOME: /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
[root@web03 ~]# /application/tomcat/bin/startup.sh
Using CATALINA_BASE: /application/tomcat
Using CATALINA_HOME: /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.
注意:tomcat未啟動的情況下使用shutdown腳本,會有大量的輸出信息。
檢查tomcat是否啟動正常
[root@web03 ~]# netstat -lntup |grep java
tcp6 0 0 :::8080 :::* LISTEN 30560/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 30560/java
tcp6 0 0 :::8009 :::* LISTEN 30560/java
說明:所有與java相關的,服務啟動都是java命名的進程
http://10.0.0.17:8080/
[root@web03 ~]# tailf /application/tomcat/logs/catalina.out
24-Nov-2017 15:09:51.654 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
24-Nov-2017 15:09:51.665 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
24-Nov-2017 15:09:51.670 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 60037 ms
發現啟動時間較長,其中有一項的啟動時間占據了絕大多數
24-Nov-2017 15:09:50.629 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /application/apache-tomcat-8.0.27/webapps/memtest.war has finished in 58,892 ms
發現耗時在這里:是session引起的隨機數問題導致的。Tocmat的Session ID是通過SHA1算法計算得到的,計算Session ID的時候必須有一個密鑰。為了提高安全性Tomcat在啟動的時候會通過隨機生成一個密鑰。
Tomcat啟動慢主要原因是生成隨機數的時候卡住了,導致tomcat啟動不了。
是否有足夠的熵來用于產生隨機數,可以通過如下命令來查看
[root@web03 ~]# cat /proc/sys/kernel/random/entropy_avail
6
為了加速/dev/random提供隨機數的速度,你可以通過操作設備的外設,讓其產生大量的中斷,網絡傳輸數據,按鍵,移動鼠標,在命令行敲幾個不同的命令,俗稱聚氣。
cat /dev/random 會消耗能量
方法1:
vim $JAVA_HOME/jre/lib/security/java.security
securerandom.source=file:/dev/random
改為
securerandom.source=file:/dev/urandom
方法2:
vim $TOMCAT_HOME/bin/catalina.sh
if [[ "$JAVA_OPTS" !=*-Djava.security.egd=* ]]; then
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
fi
這個系統屬性egd表示熵收集守護進程(entropy gathering daemon)
方法3:(推薦)
yum install rng-tools # 安裝rngd服務(熵服務,增大熵池)
systemctl start rngd # 啟動服務
注意:測試功能,生產環境不要用
Tomcat管理功能用于對Tomcat自身以及部署在Tomcat上的應用進行管理的web應用。在默認情況下是處于禁用狀態的。如果需要開啟這個功能,就需要配置管理用戶,即配置tomcat-users.xml 文件。
[root@web03 ~]# vim /application/tomcat/conf/tomcat-users.xml
……
39 <role rolename="manager-gui"/>
40 <role rolename="admin-gui"/>
41 <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
42 </tomcat-users> # 在此行前加入上面三行
未修改文件前進行訪問
<role rolename="manager-gui"/>
<user username="tomcat" password="s3cret" roles="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="s3cret" roles="admin-gui"/>
從而得出上面的配置文件信息。
輸入之前配置的賬戶與密碼即可
頂級組件:位于整個配置的頂層,如server。
容器類組件:可以包含其它組件的組件,如service、engine、host、context。
連接器組件:連接用戶請求至tomcat,如connector。
被嵌套類組件:位于一個容器當中,不能包含其他組件,如Valve、logger。
<server>
<service>
<connector />
<engine>
<host>
<context></context>
</host>
<host>
<context></context>
</host>
</engine>
</service>
</server>
<?xml version='1.0' encoding='utf-8'?>
<!--
<Server>元素代表整個容器,是Tomcat實例的頂層元素.由org.apache.catalina.Server接口來定義.它包含一個<Service>元素.并且它不能做為任何元素的子元素.
port指定Tomcat監聽shutdown命令端口.終止服務器運行時,必須在Tomcat服務器所在的機器上發出shutdown命令.該屬性是必須的.
shutdown指定終止Tomcat服務器運行時,發給Tomcat服務器的shutdown監聽端口的字符串.該屬性必須設置
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!--service服務組件-->
<Service name="Catalina">
<!-- Connector主要參數說明(見下表) -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!--engine,核心容器組件,catalina引擎,負責通過connector接收用戶請求,并處理請求,將請求轉至對應的虛擬主機host
defaultHost指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的
-->
<Engine name="Catalina" defaultHost="localhost">
<!--Realm表示存放用戶名,密碼及role的數據庫-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!-- 詳情常見下表(host參數詳解)-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!-- 詳情常見下表(Context參數說明 )-->
<Context path="" docBase="" debug=""/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
上線的代碼有兩種方式:
第一種方式是直接將程序目錄放在webapps目錄下面,這種方式大家已經明白了,就不多說了。
第二種方式是使用開發工具將程序打包成war包,然后上傳到webapps目錄下面。
[root@web03 webapps]# pwd
/application/tomcat/webapps
[root@web03 webapps]# wget http://10.0.0.1/apache/tomcat/memtest.war
站點主動解壓部署
[root@web03 webapps]# ls
docs examples host-manager logs manager memtest memtest.war ROOT
瀏覽器訪問:
http://10.0.0.17:8080//memtest/meminfo.jsp
上面訪問的網址為 http://10.0.0.3:8080/memtest/meminfo.jsp
現在想訪問格式為http://10.0.0.3:8080/meminfo.jsp
方法一
將meminfo.jsp或其他程序放在tomcat/webapps/ROOT目錄下即可。因為默認網站根目錄為tomcat/webapps/ROOT
方法二
[root@web03 ~]# vim /application/tomcat/conf/server.xml +125
…… #添加上這兩行
<Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>
<Context path="/40team" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>
……
修改配置文件后,要重啟服務
[root@web03 ~]# /application/tomcat/bin/shutdown.sh
[root@web03 ~]# /application/tomcat/bin/startup.sh
jpress官網:http://jpress.io
下載地址:https://github.com/JpressProjects/jpress
第一個里程碑:安裝配置數據庫
yum -y install mariadb-server
systemctl start mariadb.service
#配置數據庫
mysql
create database jpress DEFAULT CHARACTER SET utf8;
grant all on jpress.* to jpress@'localhost' identified by '123456';
exit
第二個里程碑:jpress站點上線
[root@web03 webapps]# pwd
/application/tomcat/webapps
[root@web03 webapps]# wget http://10.0.0.1/apache/tomcat/jpress-web-newest.war
第三個里程碑:瀏覽器訪問
瀏覽器訪問: http://10.0.0.17:8080/jpress-web-newest/install
填寫數據庫信息
設置站點名稱等
安裝完成
重啟tomcat服務
[root@web03 ~]# /application/tomcat/bin/shutdown.sh
[root@web03 ~]# /application/tomcat/bin/startup.sh
多虛擬主機:nginx 多個Server標簽(域名,ip,端口) 進程數量固定 master+worker
多實例(多進程):同一個程序啟動多次,分為兩種情況:
第一種:一臺機器跑多個站點;
第二種:一個機器跑一個站點多個實例,配合負載均衡
cd /application/tools/
tar xf apache-tomcat-8.0.27.tar.gz
cp -a apache-tomcat-8.0.27 tomcat8_1
cp -a apache-tomcat-8.0.27 tomcat8_2
修改端口,以啟動多實例。多實例之間端口不能一致
sed -i 's#8005#8011#;s#8080#8081#' tomcat8_1/conf/server.xml
sed -i 's#8005#8012#;s#8080#8082#' tomcat8_2/conf/server.xml
[root@web03 application]# diff tomcat8_1/conf/server.xml tomcat8_2/conf/server.xml
22c22
< <Server port="8011" shutdown="SHUTDOWN">
---
> <Server port="8012" shutdown="SHUTDOWN">
67c67
< Define a non-SSL/TLS HTTP/1.1 Connector on port 8081
---
> Define a non-SSL/TLS HTTP/1.1 Connector on port 8082
69c69
< <Connector port="8081" protocol="HTTP/1.1"
---
> <Connector port="8082" protocol="HTTP/1.1"
75c75
< port="8081" protocol="HTTP/1.1"
---
> port="8082" protocol="HTTP/1.1"
將配置好的tomcat程序打包,以備之后使用
tar zcf muti_tomcat8.tar.gz ./tomcat8_1 ./tomcat8_2
啟動tomcat多實例
/application/tomcat8_1/bin/startup.sh
/application/tomcat8_2/bin/startup.sh
檢查端口是否啟動
[root@web03 tomcat8_1]# netstat -lntup |grep java
tcp6 0 0 127.0.0.1:8011 :::* LISTEN 31906/java
tcp6 0 0 127.0.0.1:8012 :::* LISTEN 31932/java
tcp6 0 0 :::8080 :::* LISTEN 31812/java
tcp6 0 0 :::8081 :::* LISTEN 31906/java
tcp6 0 0 :::8082 :::* LISTEN 31932/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 31812/java
tcp6 0 0 :::8009 :::* LISTEN 31812/java
將每個實例的網頁進行區分
echo 8081 >>/application/tomcat8_1/webapps/ROOT/index.jsp
echo 8082 >>/application/tomcat8_2/webapps/ROOT/index.jsp
檢查多實例的啟動
http://10.0.0.17:8082
http://10.0.0.17:8081
[root@lb01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@lb01 ~]# uname -a
Linux lb01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[root@lb01 ~]# getenforce
Disabled
[root@lb01 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
負載均衡軟件使用nginx,詳情參照
http://www.cnblogs.com/clsn/p/7750615.html
備份原配置文件
mv /application/nginx/conf/nginx.conf{,.20171127}
egrep -v '#|^$' /application/nginx/conf/nginx.conf.default > /application/nginx/conf/nginx.conf
配置文件內容
[root@lb01 ~]# cat /application/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_pools {
server 10.0.0.17:8081;
server 10.0.0.17:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.htm;
proxy_pass http://web_pools;
}
error_page 500 502 503 504 /50x.html;
location=/50x.html {
root html;
}
}
}
配置完成后重啟nginx服務
/application/nginx/sbin/nginx -s stop
/application/nginx/sbin/nginx
使用curl 命令進行測試,tail進行關鍵字提取
[root@lb01 ~]# curl -s 10.0.0.5|tail -1
8081
[root@lb01 ~]# curl -s 10.0.0.5|tail -1
8082
使用curl 命令進行測試,awk進行關鍵字提取
[root@lb01 ~]# curl -s 10.0.0.5|awk 'END{print}'
8082
[root@lb01 ~]# curl -s 10.0.0.5|awk 'END{print}'
8081
使用curl 命令進行測試,sed進行關鍵字提取
[root@lb01 ~]# curl -s 10.0.0.5|sed -n '$p'
8082
[root@lb01 ~]# curl -s 10.0.0.5|sed -n '$p'
8081
建議使用google瀏覽器chrome 的隱身模式進行訪問,使用ctrl+f5 進行強制刷新
[root@web03 tomcat8_1]# cat /application/tomcat/webapps/memtest/meminfo.jsp
<%
Runtime rtm=Runtime.getRuntime();
long mm=rtm.maxMemory()/1024/1024;
long tm=rtm.totalMemory()/1024/1024;
long fm=rtm.freeMemory()/1024/1024;
out.println("JVM memory detail info :<br>");
out.println("Max memory:"+mm+"MB"+"<br>");
out.println("Total memory:"+tm+"MB"+"<br>");
out.println("Free memory:"+fm+"MB"+"<br>");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"<br>");
%>
[root@web03 ~]# jps -lvm
31906 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_1/endorsed -Dcatalina.base=/application/tomcat8_1 -Dcatalina.home=/application/tomcat8_1 -Djava.io.tmpdir=/application/tomcat8_1/temp
31812 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp
31932 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_2/endorsed -Dcatalina.base=/application/tomcat8_2 -Dcatalina.home=/application/tomcat8_2 -Djava.io.tmpdir=/application/tomcat8_2/temp
32079 sun.tools.jps.Jps -lvm -Denv.class.path=.:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar -Dapplication.home=/application/jdk1.8.0_60 -Xms8m
修改配置文件,開啟遠程監控
vim /application/tomcat8_1/bin/catalina.sh +97
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=10.0.0.17"
重啟服務,檢查12345端口是否開啟
/application/tomcat8_1/bin/shutdown.sh
/application/tomcat8_1/bin/startup.sh
netstat -tunlp|grep 12345
檢查端口
[root@web03 ~]# netstat -tunlp|grep 12345
tcp6 0 0 :::12345 :::* LISTEN 33158/java
在windows上監控tomcat
注意:windwos需要安裝jdk環境!
查考:http://www.oracle.com/technetwork/java/javase/downloads/index.html
軟件路徑
C:\Program Files\Java\jdk1.8.0_31\bin
jconsole.exe jvisualvm.exe
jconsole.exe 使用說明
連接成功即可進行監控,連接的時候注意端口信息。
jvisualvm.exe使用說明
輸入ip地址
主機添加完成,添加JMX監控
注意添加的時候輸入端口信息。
添加完成后就能夠多tomcat程序進行監控。
zabbix搭建詳情參考:http://www.cnblogs.com/clsn/p/7885990.html
服務端安裝配置java監控服務
[root@m01 ~]# yum install zabbix-java-gateway -y
查看配置文件
配置文件路徑:/etc/zabbix/zabbix_java_gateway.conf
sed -i -e '220a JavaGateway=127.0.0.1' -e '236a StartJavaPollers=5' /etc/zabbix/zabbix_server.conf
啟動zabbix-java-gateway服務,與zabbix服務
systemctl start zabbix-java-gateway.service
systemctl restart zabbix-server.service
檢查java端口是否開啟
[root@m01 ~]# netstat -lntup |grep java
tcp6 0 0 :::10052 :::* LISTEN 72971/java
檢查java進程是否存在
[root@m01 ~]# ps -ef |grep [j]ava
zabbix 72971 1 0 11:29 ? 00:00:00 java -server -Dlogback.configurationFile=/etc/zabbix/zabbix_java_gateway_logback.xml -classpath lib:lib/android-json-4.3_r3.1.jar:lib/logback-classic-0.9.27.jar:lib/logback-core-0.9.27.jar:lib/slf4j-api-1.6.1.jar:bin/zabbix-java-gateway-3.0.13.jar -Dzabbix.pidFile=/var/run/zabbix/zabbix_java.pid -Dzabbix.timeout=3 -Dsun.rmi.transport.tcp.responseTimeout=3000 com.zabbix.gateway.JavaGateway
zabbix 73255 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #1 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix 73256 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #2 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix 73257 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #3 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix 73258 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #4 [got 0 values in 0.000002 sec, idle 5 sec]
zabbix 73259 73226 0 11:35 ? 00:00:00 /usr/sbin/zabbix_server: java poller #5 [got 0 values in 0.000004 sec, idle 5 sec]
web界面添加
添加主機
主機管理模板,注意是JMX模板
監控完成
a. 查看catalina.out
b. 使用sh show-busy-java-threads.sh腳本進行檢測
腳本下載地址
https://files.cnblogs.com/files/clsn/show-busy-java-threads.sh
[root@web03 ~]# useradd tomcat
[root@web03 ~]# cp -a /application/tools/tomcat8_1 /home/tomcat/
[root@web03 ~]# chown -R tomcat.tomcat /home/tomcat/tomcat8_1/
[root@web03 ~]# su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
Using CATALINA_BASE: /home/tomcat/tomcat8_1
Using CATALINA_HOME: /home/tomcat/tomcat8_1
Using CATALINA_TMPDIR: /home/tomcat/tomcat8_1/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /home/tomcat/tomcat8_1/bin/bootstrap.jar:/home/tomcat/tomcat8_1/bin/tomcat-juli.jar
Tomcat started.
[root@web03 ~]# ps -ef|grep tomcat
1. 配置部分(${ CATALINA_HOME }conf/server.xml)
<Server port="8527" shutdown=" dangerous">
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
<Connector port="8080" server="webserver"/>
<!-- Define an AJP 1.3 Connector on port 8528 -->
<!--Define an accesslog -->
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log." suffix=".txt"
pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" resolveHosts="false"/>
<Connector port="8528" protocol="AJP/1.3" />
<Context path="" docBase="/home/work/local/tomcat_webapps" debug="0" reloadable="false" crossContext="true"/>
2. 配置部分(${ CATALINA_HOME }conf/web.xml或者WEB-INF/web.xml)
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>
3. 刪除如下tomcat的默認目錄和默認文件
tomcat/webapps/*
tomcat/conf/tomcat-user.xml
4. 去除其他用戶對tomcat 起停腳本的執行權限
chmod 744 –R tomcat/bin/*
tomcat性能取決于 內存大小
上策:優化代碼
該項需要開發經驗足夠豐富,對開發人員要求較高
中策:jvm優化機制 垃圾回收機制 把不需要的內存回收
優化jvm--優化垃圾回收策略
優化catalina.sh配置文件。在catalina.sh配置文件中添加以下代碼
# tomcat分配1G內存模板
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms800m -Xmx800m -XX:NewSize=400m -XX:MaxNewSize=400m -XX:PermSize=400m -XX:MaxPermSize=400m"
# 重啟服務
su -c '/home/tomcat/tomcat8_1/bin/shutdown.sh' tomcat
su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
修改之前
修改之后
*請認真填寫需求信息,我們會在24小時內與您取得聯系。