1. 程式人生 > >java的簡單入門,tomcat伺服器

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 &quot;%r&quot; %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查詢.