java的簡單入門,tomcat伺服器
Tomcat是一款開源的處理動態非常牛逼的web伺服器。是sun公司開發的,在喪屍危機之後被收購了。
安裝Tomcat需要的支援安裝包
JDK下載:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html Tomcat下載:http://tomcat.apache.org/
沒有JDK就不能安裝Tomcat
開始部署環境
#jdk的解壓安裝 [[email protected] ~]# tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local/ [[email protected] ~]# ln -s /usr/local/jdk1.8.0_60 /usr/local/jdk #配置java環境變數 [[email protected] ~]# sed -i.ori '$a export JAVA_HOME=/usr/local/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile [[email protected] ~]# tail -3/etc/profile export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar #讓java環境變數立刻生效 [[email protected] ~]# source /etc/profile #檢查java環境安裝情況 [[email protected] ~]# which java /usr/local/jdk/bin/java [[email protected]~]# 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)
關於上面那個sed命令的說明:
sed -i.ori :-i表示對檔案本身操作,.ori表示修改的同時備份原始檔
$a :$表示檔案內容的最後一行,a表示在下面進行資料插入
\n :表示插入資料時換行
環境支援已經安裝好了,我們開始安裝Tomcat
#解壓安裝Tomcat [[email protected] ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/ [[email protected] ~]# ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat #配置Tomcat環境變數 [[email protected] ~]# echo 'export TOMCAT_HOME=/usr/local/tomcat' >> /etc/profile [[email protected] ~]# source /etc/profile #對jdk及Tomcat安裝目錄遞迴授權root [[email protected] ~]# chown -R root.root /usr/local/jdk/ /usr/local/tomcat/ #檢查環境變數配置情況 [[email protected] ~]# tail -4 /etc/profile export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar export TOMCAT_HOME=/usr/local/tomcat
簡單介紹下Tomcat的目錄介紹
[[email protected] tomcat]# cd /usr/local/tomcat/ [[email protected] tomcat]# tree -L 1 . ├── bin #用以啟動,關閉Tomcat或者其他功能的指令碼(.bat檔案和.sh檔案) ├── conf #用以配置Tomcat的XML及DTD檔案 ├── lib #存放web應用能訪問的JAR包 ├── LICENSE ├── logs #Catalina和其他Web應用程式的日誌檔案 ├── NOTICE ├── RELEASE-NOTES ├── RUNNING.txt ├── temp #臨時檔案 ├── webapps #Web應用程式根目錄 └── work #用以產生有JSP編譯出的Servlet的.java和.class檔案 7 directories, 4 files [[email protected] tomcat]# cd webapps/ [[email protected] webapps]# ll total 20 drwxr-xr-x. 14 root root 4096 Oct 24 09:07 docs #tomcat幫助文件 drwxr-xr-x. 6 root root 4096 Oct 24 09:07 examples #web應用例項 drwxr-xr-x. 5 root root 4096 Oct 24 09:07 host-manager #管理 drwxr-xr-x. 5 root root 4096 Oct 24 09:07 manager #管理 drwxr-xr-x. 3 root root 4096 Oct 24 09:07 ROOT #預設網站根目錄
啟動Tomcat,
啟動程式:/usr/local/tomcat/bin/startup.sh
關閉程式:/usr/local/tomcat/bin/shutdown.sh
啟動了會出現一下的資訊
[[email protected] webapps]# /usr/local/tomcat/bin/startup.sh #程式啟動 Using CATALINA_BASE: /usr/local/tomcat #檢查環境變數CATALINA_BASE Using CATALINA_HOME: /usr/local/tomcat #檢查環境變數CATALINA_HOME Using CATALINA_TMPDIR: /usr/local/tomcat/temp #檢查環境變數CATALINA_TMPDIR Using JRE_HOME: /usr/local/jdk #檢查環境變數JRE_HOME Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started. [[email protected] webapps]# netstat -antup | grep java tcp 0 0 :::8080 :::* LISTEN 1352/java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1352/java tcp 0 0 :::8009 :::* LISTEN 1352/java
然後在ie瀏覽器上就可以簡單的實驗開啟沒有能不能上網
檢視Tomcat的日誌,Tomcat的日誌跟一般的叫的名字不一樣
#檢視Tomcat的日誌 [[email protected] webapps]# cd /usr/local/tomcat/logs/ [[email protected] logs]# ls catalina.2017-10-24.log localhost.2017-10-24.log catalina.out localhost_access_log.2017-10-24.txt host-manager.2017-10-24.log manager.2017-10-24.log
[[email protected] logs]# cat catalina.out
ploying web application directory /usr/local/apache-tomcat-8.0.27/webapps/docs
12-Nov-2018 12:50:25.400 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/apache-tomcat-8.0.27/webapps/docs has finished in 35 ms
12-Nov-2018 12:50:25.403 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/apache-tomcat-8.0.27/webapps/host-manager
12-Nov-2018 12:50:25.456 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/apache-tomcat-8.0.27/webapps/host-manager has finished in 53 ms
12-Nov-2018 12:50:25.458 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
12-Nov-2018 12:50:25.469 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
12-Nov-2018 12:50:25.482 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 1667 ms
寫配置檔案,配置檔案是最重要的
[[email protected] logs]# cd /usr/local/tomcat/conf/ [[email protected] conf]# ll -h total 216K drwxr-xr-x. 3 root root 4.0K Oct 24 09:20 Catalina -rw-------. 1 root root 13K Sep 28 2015 catalina.policy -rw-------. 1 root root 7.0K Sep 28 2015 catalina.properties -rw-------. 1 root root 1.6K Sep 28 2015 context.xml -rw-------. 1 root root 3.4K Sep 28 2015 logging.properties -rw-------. 1 root root 6.4K Sep 28 2015 server.xml #主配置檔案 -rw-------. 1 root root 1.8K Sep 28 2015 tomcat-users.xml #Tomcat管理使用者配置檔案 -rw-------. 1 root root 1.9K Sep 28 2015 tomcat-users.xsd -rw-------. 1 root root 164K Sep 28 2015 web.xml
Tomcat的管理功能
Tomcat管理功能用於對Tomcat自身以及部署在Tomcat上的應用進行管理的Web應用。在預設情況下是處於禁用狀態的。如果需要開啟這個功能,就需要配置管理使用者,即配置裡面說過的tomcat-users.xml。
#找到配置檔案的第38行 [[email protected] conf]# cat -n /usr/local/tomcat/conf/tomcat-users.xml | sed -n '38p' 38 </tomcat-users> #在38行上加入如下三行程式碼 [[email protected] conf]# tail -4 /usr/local/tomcat/conf/tomcat-users.xml <role rolename="manager-gui"/> #加入此行 <role rolename="admin-gui"/> #加入此行 <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/> #加入此行 </tomcat-users> #重啟tomcat服務 [[email protected] conf]# /usr/local/tomcat/bin/shutdown.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/jdk Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar [[email protected] conf]# /usr/local/tomcat/bin/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/jdk Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started.
輸入網址和設定的賬號和密碼
Tomcat的主配置文鍵server.xml裡的東東
頂級元件:位於整個配置的頂層,如server。
容器類元件:可以包含其他元件的元件,如service,engine,host,context
聯結器元件:連線使用者請求至tomcat,如connector。
被巢狀類元件:位於一個容器當中,不能包含其他元件,如Valve,logger。
大概就是下邊這樣,把裡邊的東西給掏空了
<server> <service> <connector /> <engine> <host> <context></context> </host> <host> <context></context> </host> </engine> </service> </server>
配置詳解
engine:核心容器元件,catalina引擎,負責通過connector接收使用者請求,並處理請求,將請求轉至對應的虛擬主機host。 host:類似於httpd中的虛擬主機,一般而言支援基於FQDN的虛擬主機。 context:定義一個應用程式,是一個最內層的容器類元件(不能再巢狀)。配置context的主要目的指定對應對的webapp的根目錄,類似於httpd的alias,其還能為webapp指定額外的屬性,如部署方式等。 connector:接收使用者請求,類似於httpd的listen配置監聽埠。 service(服務):將connector關聯至engine,因此一個service內部可以有多個connector,但只能又一個引擎engine。service內部有兩個connector,一個engine。因此,一般情況下一個server內部只有一個service,一個service內部只有一個engine,但一個service內部可以有多個connector。 server:表示一個運行於JVM中的tomcat例項。 Valve:閥門,攔截請求並在將其轉至對應的webapp前進行某種處理操作,可以用於任何容器中,比如記錄日誌(access log valve),基於IP做訪問控制(remote address filer valve)。 logger:日誌記錄器,用於記錄元件內部的狀態資訊,可以用於除context外的任何容器中。 realm:可以用於任意容器類的元件中,關聯一個使用者認證庫,實現認證和授權。可以關聯的認證庫有兩種:UserDatabaseRealm,MemoryRealm和JDBCRealm。 UserDatabaseRealm:使用JNDI自定義的使用者認證庫。 MemoryRealm:認證資訊定義在tomcat-users.xml中。 JDBCRealm:認證資訊定義在資料庫中,並通過JDBC連線至資料庫中查詢認證使用者。
配置裡邊都是啥意思
<?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:接收使用者請求,類似於httpd的listen配置監聽埠. port指定伺服器端要建立的埠號,並在這個埠監聽來自客戶端的請求。 address:指定聯結器監聽的地址,預設為所有地址(即0.0.0.0) protocol聯結器使用的協議,支援HTTP和AJP。AJP(Apache Jserv Protocol)專用於tomcat與apache建立通訊的, 在httpd反向代理使用者請求至tomcat時使用(可見Nginx反向代理時不可用AJP協議)。 minProcessors伺服器啟動時建立的處理請求的執行緒數 maxProcessors最大可以建立的處理請求的執行緒數 enableLookups如果為true,則可以通過呼叫request.getRemoteHost()進行DNS查詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址 redirectPort指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號 acceptCount指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理佇列中的請求數,超過這個數的請求將不予處理 connectionTimeout指定超時的時間數(以毫秒為單位) --> <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表示一個虛擬主機 name指定主機名 appBase應用程式基本目錄,即存放應用程式的目錄.一般為appBase="webapps" ,相對於CATALINA_HOME而言的,也可以寫絕對路徑。 unpackWARs如果為true,則tomcat會自動將WAR檔案解壓,否則不解壓,直接從WAR檔案中執行應用程式 autoDeploy:在tomcat啟動時,是否自動部署。 xmlValidation:是否啟動xml的校驗功能,一般xmlValidation="false"。 xmlNamespaceAware:檢測名稱空間,一般xmlNamespaceAware="false"。 --> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- Context表示一個web應用程式,通常為WAR檔案 docBase應用程式的路徑或者是WAR檔案存放的路徑,也可以使用相對路徑,起始路徑為此Context所屬Host中appBase定義的路徑。 path表示此web應用程式的url的字首,這樣請求的url為http://localhost:8080/path/**** reloadable這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,可以在不重啟tomcat的情況下改變應用程式 --> <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目錄下面。下面讓我們見識一下這種方式。
具體步驟
#部署war包 [[email protected]t ~]# ls -l memtest.war -rw-r--r--. 1 root root 643 Oct 24 13:39 memtest.war #同學們將此war包拷貝到Linux虛擬機器中 [[email protected] ~]# cp memtest.war /usr/local/tomcat/webapps/ [[email protected] ~]# ls /usr/local/tomcat/webapps/ docs examples host-manager manager memtest.war ROOT #重啟tomcat服務 [[email protected] ~]# /usr/local/tomcat/bin/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/jdk Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started. [[email protected] ~]# netstat -antup | grep java tcp 0 0 :::8080 :::* LISTEN 1972/java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 1972/java tcp 0 0 :::8009 :::* LISTEN 1972/java #檢視war包的解壓縮情況 [[email protected] webapps]# ls /usr/local/tomcat/webapps/ docs examples host-manager manager memtest memtest.war ROOT #war包已經被解壓出來了
檢視結果
自定義網址的目錄
方法一:
將meminfo.jsp或其他程式放在tomcat/webapps/ROOT目錄下即可。因為預設網站根目錄為tomcat/webapps/ROOT
方法二:
[[email protected] ~]# vim /application/tomcat/conf/server.xml <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/usr/local/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/> #在虛擬主機這裡新增一行程式碼限定web站點的根目錄路徑 [[email protected] ~]# /application/tomcat/bin/shutdown.sh [[email protected] ~]# /application/tomcat/bin/startup.sh
Tomcat多例項的做法
先複製Tomcat的目錄。
[[email protected] ~]# cd /usr/local/ [[email protected] local]# ls apache-tomcat-8.0.27 etc include jdk1.8.0_60 lib64 sbin src bin games jdk lib libexec share tomcat [[email protected] local]# cp -a apache-tomcat-8.0.27 tomcat8_1 [[email protected] local]# cp -a apache-tomcat-8.0.27 tomcat8_2
在修改配置檔案
#建立多例項的網頁根目錄 [[email protected] local]# mkdir -p /data/www/www/ROOT #將網頁程式拷貝到,多例項根目錄ROOT下 [[email protected] local]# cp /usr/local/tomcat/webapps/memtest/meminfo.jsp /data/www/www/ROOT/ #修改多例項配置檔案的以下三行 [[email protected] local]# cat -n /usr/local/tomcat/conf/server.xml | sed -n '22p;69p;123p' 22 <Server port="8005" shutdown="SHUTDOWN"> #管理埠及停止命令 69 <Connector port="8080" protocol="HTTP/1.1" #對外提供服務的埠 123 <Host name="localhost" appBase="webapps" #網站域名及網頁根目錄路徑 #修改第一個多例項配置檔案 [[email protected] local]# sed -i '22s#8005#8011#;69s#8080#8081#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_1/conf/server.xml [[email protected] local]# sed -n '22p;69p;123p' /usr/local/tomcat8_1/conf/server.xml <Server port="8011" shutdown="SHUTDOWN"> <Connector port="8081" protocol="HTTP/1.1" <Host name="localhost" appBase="/data/www/www" #修改第二個多例項配置檔案 [[email protected] local]# sed -i '22s#8005#8012#;69s#8080#8082#;123s#appBase=".*"#appBase="/data/www/www"#' /usr/local/tomcat8_2/conf/server.xml [[email protected] local]# sed -n '22p;69p;123p' /usr/local/tomcat8_2/conf/server.xml <Server port="8012" shutdown="SHUTDOWN"> <Connector port="8082" protocol="HTTP/1.1" <Host name="localhost" appBase="/data/www/www"
修改完了就可以啟動多例項了
#啟動多例項服務 [[email protected] ~]# /usr/local/tomcat8_1/bin/startup.sh Using CATALINA_BASE: /usr/local/tomcat8_1 Using CATALINA_HOME: /usr/local/tomcat8_1 Using CATALINA_TMPDIR: /usr/local/tomcat8_1/temp Using JRE_HOME: /usr/local/jdk Using CLASSPATH: /usr/local/tomcat8_1/bin/bootstrap.jar:/usr/local/tomcat8_1/bin/tomcat-juli.jar Tomcat started. [[email protected] ~]# /usr/local/tomcat8_2/bin/startup.sh Using CATALINA_BASE: /usr/local/tomcat8_2 Using CATALINA_HOME: /usr/local/tomcat8_2 Using CATALINA_TMPDIR: /usr/local/tomcat8_2/temp Using JRE_HOME: /usr/local/jdk Using CLASSPATH: /usr/local/tomcat8_2/bin/bootstrap.jar:/usr/local/tomcat8_2/bin/tomcat-juli.jar Tomcat started. #檢視多例項程序啟動情況 [[email protected] ~]# netstat -antup | grep java tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 2295/java tcp 0 0 ::ffff:127.0.0.1:8012 :::* LISTEN 2321/java tcp 0 0 :::8080 :::* LISTEN 2031/java tcp 0 0 :::8081 :::* LISTEN 2295/java tcp 0 0 :::8082 :::* LISTEN 2321/java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 2031/java tcp 0 0 :::8009 :::* LISTEN 2031/java
在瀏覽器裡可以分別訪問不同的埠號就可以訪問不同的網頁了。
使用Nginx反向代理,建立Tomcat叢集
安裝Nginx
[[email protected] ~]# yum -y install pcre-devel openssl-devel [[email protected] ~]# wget -q http://nginx.org/download/nginx-1.10.2.tar.gz [[email protected] ~]# useradd -s /sbin/nologin -M nginx [[email protected] ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src/ [[email protected] ~]# cd /usr/src/nginx-1.10.2/ [[email protected] nginx-1.10.2]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module [[email protected] nginx-1.10.2]# make && make install
修改Nginx的配置檔案,作為反向代理
#建立配置檔案模版 [[email protected] nginx]# egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf.default > /usr/local/nginx/conf/nginx.conf #修改配置檔案內容如下: [[email protected] nginx]# cat /usr/local/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 127.0.0.1:8081; server 127.0.0.1:8082; } server { listen 80; server_name localhost; location / { root html; index index.jsp index.html index.htm; proxy_pass http://web_pools; } } } #檢測語法並啟動nginx [[email protected] nginx]# /usr/local/nginx/sbin/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 [[email protected] nginx]# /usr/local/nginx/sbin/nginx [[email protected] nginx]# netstat -antup | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4833/nginx
使用Tomcat安裝jpress
jpress就是java的部落格,需要安裝支援包maven
[[email protected] ~]# tar xf apache-maven-3.3.9-bin.tar.gz -C /usr/local/ [[email protected] ~]# ln -s /usr/local/apache-maven-3.3.9 /usr/local/maven [[email protected] ~]# tail -2 /etc/profile export MAVEN_HOME=/usr/local/maven export PATH="$MAVEN_HOME/bin:$PATH" [[email protected] ~]# source /etc/profile [[email protected] ~]# mvn -version #出現這個表示成功 Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-10T11:41:47-05:00) Maven home: /usr/local/maven Java version: 1.8.0_60, vendor: Oracle Corporation Java home: /usr/local/jdk1.8.0_60/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "2.6.32-431.el6.x86_64", arch: "amd64", family: "unix"
將jpress解壓到Tomcat的根目錄下
#將war包放到網站根目錄下 [[email protected] ~]# ls -l jpress-web-newest.war -rw-r--r--. 1 root root 20797013 Oct 24 17:04 jpress-web-newest.war [[email protected] ~]# mv jpress-web-newest.war /data/www/www/ROOT/ #解壓war包 [[email protected] ~]# which jar /usr/local/jdk/bin/jar [[email protected] ~]# cd /data/www/www/ROOT/ [[email protected] ROOT]# jar xf jpress-web-newest.war #jar是war包的解壓命令 [[email protected] ROOT]# ls jpress-web-newest.war META-INF static WEB-INF meminfo.jsp robots.txt templates
特別提示:
雖然,Tomcat已經打開了自動解壓縮war包的功能,但是細心的會發現我並沒有重啟Tomcat服務,因此,war包並沒有被自動解壓縮。故,我們需要通過jar命令進行解壓縮,命令的引數和tar是一樣的。
接下來我們就需要為jpress安裝資料庫了,之後的所有流程和閱讀材料LNMP的章節完全一樣。因此,我這裡就不繼續操作了。
最最重要的優化引數
最重要的優化為如下4項,但並不止這四種 降權啟動 telnet管理埠保護 ajp連線埠保護 禁用管理端 具體操作如下: (1)降權啟動(同nginx優化部分的監牢模式) 降權的原則就是利用普通使用者來啟動Tomcat (1)將Tomcat程式目錄拷貝到普通使用者家目錄下 (2)修改家目錄下程式的配置檔案(啟動埠,檢測埠等),並重新指定網頁根目錄路徑。 (3)遞迴授權拷貝後的Tomcat程式的屬主屬組為普通使用者。 (4)用su命令切換為普通使用者,啟動Tomcat程序 (5)此時Tomcat程序的許可權為普通使用者許可權 (6)如果利用/etc/rc.local檔案配置普通使用者程式的開機啟動,那麼需要利用su -c臨時切換身份啟動。具體可參考linux基礎教案裡的使用者管理部分 (2)telnet管理埠保護 [[email protected] ~]# sed -n '22p' /usr/local/tomcat/conf/server.xml <Server port="8005" shutdown="SHUTDOWN"> #表示通過8005埠來接受SHUTDOWN,用來停止Tomcat程序。預設的方式是非常危險的。需要進行修改 [[email protected] ~]# netstat -antup | grep java tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 2295/java #本地8011埠接收SHUTDOWN命令 tcp 0 0 ::ffff:127.0.0.1:8012 :::* LISTEN 2321/java #本地8012埠接收SHUTDOWN命令 tcp 0 0 :::8080 :::* LISTEN 2031/java tcp 0 0 :::8081 :::* LISTEN 2295/java tcp 0 0 :::8082 :::* LISTEN 2321/java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 2031/java #本地8005埠接收SHUTDOWN命令 tcp 0 0 :::8009 :::* LISTEN 2031/java Tomcat預設通過8005埠來接收SHUTDOWN這個字串來關閉Tomcat程序,但這是非常危險的,因此需要修改埠號來防護。否則,通過telnet命令即可強行關閉Tomcat程序 #利用Telnet來關閉Tomcat程序 [[email protected] ~]# telnet 127.0.0.1 8005 #通過telnet連線本地8005埠 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. SHUTDOWN #傳送SHUTDOWN字串 Connection closed by foreign host. [[email protected] ~]# netstat -antup | grep java #可以發現8005埠和8080埠的Tomcat程序沒了 tcp 0 0 ::ffff:127.0.0.1:8011 :::* LISTEN 2295/java tcp 0 0 ::ffff:127.0.0.1:8012 :::* LISTEN 2321/java tcp 0 0 :::8081 :::* LISTEN 2295/java tcp 0 0 :::8082 :::* LISTEN 2321/java [[email protected] ~]# (3)ajp連線埠保護 [[email protected] ~]# sed -n '91p' /usr/local/tomcat/conf/server.xml <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> #這是AJP協議開啟的埠,我們並不需要開啟這個埠,因此註釋掉本行 (4)禁用管理端 Tomcat預設在安裝完成後的網頁目錄裡有很多多餘的目錄,刪除所有不需要用到的目錄,並清空ROOT網頁預設根目錄下的所有東西,規避可能的程式碼漏洞 [[email protected] ~]# cd /usr/local/tomcat/webapps/ [[email protected] webapps]# ls docs examples host-manager manager memtest memtest.war ROOT #有很多多餘的東西,只留下ROOT目錄,其他都刪掉或者mv移走 [[email protected] webapps]# ls ROOT/ #很多多餘的東西,因此清空本目錄,或者都移走 asf-logo.png bg-button.png bg-nav-item.png bg-upper.png favicon.ico meminfo.jsp tomcat.css tomcat.png tomcat.svg asf-logo-wide.gif bg-middle.png bg-nav.png build.xml index.jsp RELEASE-NOTES.txt tomcat.gif tomcat-power.gif WEB-INF 6.2 效能優化 6.2.1 遮蔽DNS查詢 enableLookups="false" DNS查詢非常消耗時間,如果開啟會影響Tomcat效能,因此關閉。 #預設沒有,需新增配置檔案如下程式碼段,在Connector標籤位置。表示禁止DNS查詢 <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="6000" enableLookups="false" acceptCount="800" redirectPort="8443" /> 6.2.2 jvm調優 Tomcat最吃記憶體,只要記憶體足夠,這隻貓就跑的很快。 如果系統資源有限,那就需要進行調優,提高資源使用率。 #優化catalina.sh初始化指令碼。在catalina.sh初始化指令碼中新增以下程式碼: #catalina.sh的路徑為:/usr/local/tomcat/bin/catalina.sh #此行優化程式碼需要加在指令碼的最開始,宣告位置。不要放在後邊 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" #程式碼說明: server:一定要作為第一個引數,在多個CPU時效能佳 -Xms:初始堆記憶體Heap大小,使用的最小記憶體,cpu效能高時此值應設的大一些 -Xmx:初始堆記憶體heap最大值,使用的最大記憶體 上面兩個值是分配JVM的最小和最大記憶體,取決於硬體實體記憶體的大小,建議均設為實體記憶體的一半。 -XX:PermSize:設定記憶體的永久儲存區域 -XX:MaxPermSize:設定最大記憶體的永久儲存區域 -XX:MaxNewSize: -Xss 15120 這使得JBoss每增加一個執行緒(thread)就會立即消耗15M記憶體,而最佳值應該是128K,預設值好像是512k. +XX:AggressiveHeap 會使得 Xms沒有意義。這個引數讓jvm忽略Xmx引數,瘋狂地吃完一個G實體記憶體,再吃盡一個G的swap。 -Xss:每個執行緒的Stack大小 -verbose:gc 現實垃圾收集資訊 -Xloggc:gc.log 指定垃圾收集日誌檔案 -Xmn:young generation的heap大小,一般設定為Xmx的3、4分之一 -XX:+UseParNewGC :縮短minor收集的時間 -XX:+UseConcMarkSweepGC :縮短major收集的時間 JVM的調優比較複雜,對於初學的同學們來說掌握這些就足夠了。如果想要更詳細的理解JVM如何調優,那麼請參考網友文章:http://www.cnblogs.com/xingzc/p/5756119.html 附錄1:企業案例:Linux下java/http程序高解決案例 生產環境下某臺tomcat7伺服器,在剛釋出的時候一切都很正常,在執行一段時間後就出現CPU佔用很高的問題,基本上是負載一天比一天高。諸如此類問題,請排查! 問題分析: (1)程式屬於CPU密集型,和開發溝通過,排除此類情況 (2)程式程式碼有問題,出現死迴圈,可能性極大 問題解決: (1)開發那邊無法排查程式碼某個模組有問題,從日誌上也無法分析得出 (2)我們可以嘗試通過jstack命令來精確定位出現錯誤的程式碼段,從而拿給開發排查。 (1)首先查詢程序高的PID號(先找到是哪個PID號的程序導致的) top -H (2)檢視這個程序所有系統呼叫(再找到是哪個PID號的執行緒導致的) strace -p 程序的PID (3)如果是Web應用,可以繼續列印該執行緒的堆疊資訊(找出有問題的程式碼塊) printf "%x\n" 執行緒的PID --->#將有問題的執行緒的PID號轉換成16進位制格式 jstack 程序的PID | grep 執行緒PID號的十六進位制格式 -A 30 #過濾出有問題的執行緒的堆疊資訊,找出問題程式碼塊 實際操作演示: [[email protected] ROOT]# pgrep -l java 2031 java #java程序及對應PID號 2295 java 2321 java [[email protected] ROOT]# strace -p 2031 #檢視PID號為2031的java程序的所有執行緒呼叫情況 Process 2031 attached - interrupt to quit futex(0x7f4cdd0e79d0, FUTEX_WAIT, 2032, NULL #只有一個執行緒,執行緒的PID號為2032 ^C <unfinished ...> Process 2031 detached [[email protected] ROOT]# printf "%x\n" 2032 #將執行緒的PID號2032轉換成十六進位制格式 7f0 [[email protected] ROOT]# jstack 2031 | grep 7f0 -A 30 #追蹤進稱號為2031的程序的所有執行緒呼叫,從裡面過濾出16進製為7f0的執行緒的程式碼呼叫情況 "main" #1 prio=5 os_prio=0 tid=0x00007f4cd4008800 nid=0x7f0 runnable [0x00007f4cdd0e5000] java.lang.Thread.State: RUNNABLE at java.net.PlainSocketImpl.socketAccept(Native Method) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:409) #圓括號裡顯示的是(程式碼類名:具體呼叫的程式碼行號) at java.net.ServerSocket.implAccept(ServerSocket.java:545) at java.net.ServerSocket.accept(ServerSocket.java:513) at org.apache.catalina.core.StandardServer.await(StandardServer.java:446) at org.apache.catalina.startup.Catalina.await(Catalina.java:713) at org.apache.catalina.startup.Catalina.start(Catalina.java:659) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485) "VM Thread" os_prio=0 tid=0x00007f4cd406d000 nid=0x7f1 runnable "VM Periodic Task Thread" os_prio=0 tid=0x00007f4cd40b8800 nid=0x7f8 waiting on condition JNI global references: 244 附錄2:jstack命令(Java stack Trace) (1)介紹 jstack用於打印出給定的java程序ID或core file或遠端除錯服務的Java堆疊資訊,如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支援以下的這種方式: jstack [-l] pid 如果java程式崩潰生成core檔案,jstack工具可以用來獲得core檔案的java stack和native stack的資訊,從而可以輕鬆地知道java程式是如何崩潰和在程式何處發生問題。另外,jstack工具還可以附屬到正在執行的java程式中,看到當時執行的java程式的java stack和native stack的資訊, 如果現在執行的java程式呈現hung的狀態,jstack是非常有用的。 (2)命令格式 jstack [ option ] pid jstack [ option ] executable core jstack [ option ] [server[email protected]]remote-hostname-or-IP (3)常用引數說明 1)、options: executable Java executable from which the core dump was produced. (可能是產生core dump的java可執行程式) core 將被列印資訊的core dump檔案 remote-hostname-or-IP 遠端debug服務的主機名或ip server-id 唯一id,假如一臺主機上多個遠端debug服務 2)、基本引數: -F:當’jstack [-l] pid’沒有相應的時候強制列印棧資訊 -l:長列表. 列印關於鎖的附加資訊,例如屬於java.util.concurrent的ownable synchronizers列表. -m:列印java和native c/c++框架的所有棧資訊. -h | -help:列印幫助資訊 pid :需要被列印配置資訊的java程序id,可以用jps查詢.