[轉(zhuǎn)][筆記] 2. Tomcat系列之服務(wù)器的安裝與配置以及各組件詳解

轉(zhuǎn)自陳明乾的博客,可能有一定更新翻翩。

轉(zhuǎn)原文聲明:
原創(chuàng)作品都许,允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章 原始出處 嫂冻、作者信息和本聲明胶征。否則將追究法律責(zé)任。http://freeloda.blog.51cto.com/2033581/1299644

大綱


  • 一桨仿、前言
  • 二睛低、安裝與配置Tomcat
  • 三、Tomcat 目錄的結(jié)構(gòu)
  • 四服傍、Tomcat 配置文件

注钱雷,本文的測(cè)試的操作系統(tǒng)為 CentOS 6.8 x86_64,軟件版本為 jdk-8u101吹零、apache-tomcat-7.0.70急波。

軟件下載地址:

一、前言


在上一篇博文中我們主要講解的Tomcat的基礎(chǔ)知識(shí)以及相關(guān)的Java知識(shí)瘪校,對(duì)于不怎么清楚的博友可以參考一下:http://freeloda.blog.51cto.com/2033581/1298687澄暮。

在這博客中我們主要講解Tomcat的安裝與配置詳解。那下面我們就來說一下吧阱扬!

二泣懊、安裝與配置Tomcat


1.查看一下安裝文件

[root@tomcat1 ~]# ls -1
apache-tomcat-7.0.70.tar.gz
jdk-8u101-linux-x64.rpm

2.同步一下時(shí)間

[root@tomcat java]# ntpdate 202.120.2.101

3.安裝JDK

[root@tomcat1 ~]# rpm -ivh jdk-8u101-linux-x64.rpm

4.修改環(huán)境變量

注意,CentOS 6.8 預(yù)先安裝了 OpenJDK:

[root@tomcat1 ~]# /usr/bin/java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

要使用我們安裝 jdk麻惶,應(yīng)該設(shè)置 PATH 環(huán)境變量馍刮,在搜索命令時(shí),首先查找 $JAVA_HOME/bin 下的路徑窃蹋,設(shè)置環(huán)境變量如下:

[root@tomcat1 ~]# cat /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_101/
export PATH=$JAVA_HOME/bin:$PATH

使其立即生效:

[root@tomcat1 ~]# source /etc/profile.d/java.sh

5.測(cè)試一下

[root@tomcat1 ~]# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)

注:好了卡啰,到這里我們的jdk就安裝成功了。下面我們來安裝一下Tomcat警没!

6.解壓并創(chuàng)建鏈接

[root@tomcat1 ~]# tar -xf apache-tomcat-7.0.70.tar.gz -C /usr/local/
[root@tomcat1 ~]# cd /usr/local/
[root@tomcat1 local]# ln -sv apache-tomcat-7.0.70/ tomcat
`tomcat' -> `apache-tomcat-7.0.70/'

7.修改環(huán)境變量

[root@tomcat1 local]# cat /etc/profile.d/tomcat.sh
export CATALINA_HOME=/usr/local/tomcat
export PATH=$PATH:$CATALINA_HOME/bin

使其立即生效:

[root@tomcat1 local]# source /etc/profile.d/tomcat.sh

8.測(cè)試一下匈辱,啟動(dòng) tomcat

[root@tomcat1 local]# catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_101/
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

9.查看啟動(dòng)的端口

[root@tomcat1 local]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1094/sshd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1173/master
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      1383/java
tcp        0      0 :::8009                     :::*                        LISTEN      1383/java
tcp        0      0 :::8080                     :::*                        LISTEN      1383/java
tcp        0      0 :::22                       :::*                        LISTEN      1094/sshd
tcp        0      0 ::1:25                      :::*                        LISTEN      1173/master

這里有三個(gè) java 進(jìn)程:8005 是 tomcat 實(shí)例的端口,8080 是 HTTP 連接器端口杀迹,8009 是 AJP 連接器的端口:

ff

測(cè)試訪問一下:

Snip20160801_15.png

注亡脸,好了到這里我們的Tomcat就安裝完成了,下面我們就來看看我們安裝的內(nèi)容。

三浅碾、Tomcat 目錄的結(jié)構(gòu)


1.Tomcat的安裝


其實(shí)對(duì)于完全由Java寫成的Tomcat大州,Windows版本和Linux版本沒有多大區(qū)別,比如Linux版本垂谢,在Solaris下也沒有問題厦画。這里,主要以Linux版本作為示例滥朱。

注根暑,在安裝使用Tomcat之前,先安裝JDK焚虱,最好是Sun的JDK 1 .5 以上版购裙。我們上面已經(jīng)安裝過了,這里我們就不在多說鹃栽。

2.Tomcat的目錄結(jié)構(gòu)


首先躏率,我們先來簡(jiǎn)單查看一下目錄文件,

[root@tomcat1 ~]# cd /usr/local/tomcat/
[root@tomcat1 tomcat]# ls -1 -F
bin/
conf/
lib/
LICENSE
logs/
NOTICE
RELEASE-NOTES
RUNNING.txt
temp/
webapps/
work/

下面我們來簡(jiǎn)單說明下民鼓,

  • bin ——Tomcat執(zhí)行腳本目錄
  • conf ——Tomcat配置文件
  • lib ——Tomcat運(yùn)行需要的庫文件(JARS)
  • logs ——Tomcat執(zhí)行時(shí)的 LOG 文件
  • temp ——Tomcat臨時(shí)文件存放目錄
  • webapps ——Tomcat 的主要 Web 發(fā)布目錄(存放我們自己的JSP, SERVLET,類)
  • work ——Tomcat的工作目錄薇芝,Tomcat將從JSP文件轉(zhuǎn)譯生成的Java文件和class文件放在這里。

下面我們來說一說各目錄中包含的文件丰嘉,

bin目錄下的文件:

[root@tomcat1 tomcat]# ls bin/
bootstrap.jar                 daemon.sh         startup.sh
catalina.bat                  digest.bat        tomcat-juli.jar
catalina.sh                   digest.sh         tomcat-native.tar.gz
catalina-tasks.xml            setclasspath.bat  tool-wrapper.bat
commons-daemon.jar            setclasspath.sh   tool-wrapper.sh
commons-daemon-native.tar.gz  shutdown.bat      version.bat
configtest.bat                shutdown.sh       version.sh
configtest.sh                 startup.bat

我們來說說最主要主文件有夯到,

  • catalina.sh 用于啟動(dòng)和關(guān)閉tomcat服務(wù)器
  • configtest.sh 用于檢查配置文件
  • startup.sh 啟動(dòng)Tomcat的腳本
  • shutdown.sh 關(guān)閉Tomcat的腳本

conf目錄下的文件:

[root@tomcat1 tomcat]# ls -F conf/
Catalina/        catalina.properties  logging.properties  tomcat-users.xml
catalina.policy  context.xml          server.xml          web.xml

最主要的配置文件有,

  • server.xml Tomcat 的全局配置文件
  • web.xml 為不同的Tomcat配置的web應(yīng)用設(shè)置缺省值的文件
  • tomcat-users.xml Tomcat用戶認(rèn)證的配置文件

lib目錄下的文件:

[root@tomcat1 tomcat]# ls lib/
annotations-api.jar  el-api.jar             tomcat-api.jar      tomcat-jdbc.jar
catalina-ant.jar     jasper-el.jar          tomcat-coyote.jar   tomcat-util.jar
catalina-ha.jar      jasper.jar             tomcat-dbcp.jar     websocket-api.jar
catalina.jar         jsp-api.jar            tomcat-i18n-es.jar
catalina-tribes.jar  servlet-api.jar        tomcat-i18n-fr.jar
ecj-4.4.2.jar        tomcat7-websocket.jar  tomcat-i18n-ja.jar

包含被Tomcat使用的各種各樣的jar文件饮亏。在Linux/UNIX上耍贾,任何這個(gè)目錄中的文件將被附加到Tomcat的classpath中。

logs目錄下的文件:

[root@tomcat1 tomcat]# ls logs/
catalina.2016-08-01.log      localhost.2016-08-01.log
catalina.out                 localhost_access_log.2016-08-01.txt
host-manager.2016-08-01.log  manager.2016-08-01.log

主要的配置文件有路幸,

  • localhost_access_log.2016-08-01.txt 訪問日志
  • localhost.2016-08-01.log 錯(cuò)誤和其它日志
  • manager.2016-08-01.log 管理日志
  • catalina.2016-08-01.log Tomcat啟動(dòng)或關(guān)閉日志文件

webapps目錄下的文件:

[root@tomcat1 tomcat]# ls -F webapps/
docs/  examples/  host-manager/  manager/  ROOT/

含Web應(yīng)用的程序 (JSP荐开、Servlet和JavaBean等)

work目錄下的配置文件:

[root@tomcat1 tomcat]# ls work/
Catalina
[root@tomcat1 tomcat]# ls work/Catalina/
localhost
[root@tomcat1 tomcat]# ls -F work/Catalina/localhost/
_/  docs/  examples/  host-manager/  manager/

它們由Tomcat自動(dòng)生成,這是Tomcat放置它運(yùn)行期間的中間(intermediate)文件(諸如編譯的JSP文件)地方简肴。 如果當(dāng)Tomcat運(yùn)行時(shí)晃听,你刪除了這個(gè)目錄那么將不能夠執(zhí)行包含JSP的頁面。

好了砰识,Tomcat的目錄結(jié)構(gòu)我們就說到這了能扒,下面我們來說說Tomcat應(yīng)用程序的組成。

3.Tomcat 應(yīng)用程序的組成


注辫狼,上面的內(nèi)容中我們講解了Tomcat的目錄結(jié)構(gòu)初斑,其中有個(gè)目錄是webapps,主要存放Web應(yīng)用程序予借。那我們下面來說一說Web應(yīng)用程序的組成越平。

按照Tomcat的規(guī)范频蛔,Tomcat的Web應(yīng)用程序應(yīng)該由如下目錄組成灵迫,

(1).頁面內(nèi)容等文件的存放位置:*.html, *.jsp等可以有許多目錄層次秦叛,由用戶的網(wǎng)站結(jié)構(gòu)而定,實(shí)現(xiàn)的功能應(yīng)該是網(wǎng)站的界面瀑粥,也就是用戶主要的可見部分挣跋。除了HTML文件、JSP文件外狞换,還有js(JavaScript)文件和css(樣式表)文件以及其他多媒體文件等避咆。

(2).Web-INF/web.xml 這是一個(gè)Web應(yīng)用程序的描述文件。這個(gè)文件是一個(gè)XML文件修噪,描述了Servlet和這個(gè)Web應(yīng)用程序的其他組件信息查库,此外還包括一些初始化信息和安全約束等等。

(3).Web-INF/classes/ 這個(gè)目錄及其下的子目錄應(yīng)該包括這個(gè)Web應(yīng)用程序的所有JavaBean及Servlet等編譯好的Java類文件(.class)文件黄琼,以及沒有被壓縮打入JAR包的其他class文件和相關(guān)資源樊销。注意,在這個(gè)目錄下的Java類應(yīng)該按照其所屬的包層次組織目錄(即如果該.class文件具有包的定義脏款,則該*.class文件應(yīng)該放在.\WEB-INF\classes\包名下)围苫。

(4).通常Web-INF/classes/ 這個(gè)目錄下的類文件也可以打包成JAR文件,并可以放到WEB-INF下的lib目錄下撤师。如將 classes目錄下的各個(gè)*.class文件打包成WebMis.jar文件(jar cvf WebMis.jar .
注剂府,

  • WEB-INF目錄中包含應(yīng)用軟件所使用的資源,但是WEB-INF卻不在公共文檔根目錄之中剃盾。在這個(gè)目錄中所包含的文件都不能被客戶機(jī)所訪問腺占。
  • 類目錄中(在WEB-INF下)包含運(yùn)行Web應(yīng)用程序時(shí)所需的Servlets,Beans等類痒谴。
  • lib目錄(在WEB-INF下)包含有Java archive files (JARs)衰伯,例如標(biāo)簽庫或者Servlets,Beans等類的*.jar文件闰歪。
  • 如果一個(gè)類出現(xiàn)在JAR文件中同時(shí)也出現(xiàn)在類的目錄中嚎研,類加載器會(huì)加載位于類目錄中的那一個(gè)。

(5). common/lib/ 這個(gè)目錄下包含了所有壓縮到JAR文件中的類文件和相關(guān)文件库倘。比如:第三方提供的Java庫文件临扮、JDBC驅(qū)動(dòng)程序等。

  • 其中msbase.jar教翩、mssqlserver.jar杆勇、msutil.jar文件為SqlServer2000的JDBC驅(qū)動(dòng)程序
  • 其中servlet-api.jar和jsp-api.jar為Servlet和JSP的API所在的包

好了,Tomcat的應(yīng)用程序的能成我們就基本說到這里了饱亿,下面我們來看一下默認(rèn)Web程序的目錄結(jié)構(gòu)蚜退。

[root@tomcat1 WEB-INF]# cd /usr/local/tomcat/
[root@tomcat1 tomcat]# ls -F
bin/   lib/     logs/   RELEASE-NOTES  temp/     work/
conf/  LICENSE  NOTICE  RUNNING.txt    webapps/
[root@tomcat1 tomcat]# cd webapps/;
[root@tomcat1 webapps]# ls -F
docs/  examples/  host-manager/  manager/  ROOT/
[root@tomcat1 webapps]# cd examples/
[root@tomcat1 examples]# ls -F
index.html  jsp/  servlets/  WEB-INF/  websocket/  websocket-deprecated/
[root@tomcat1 examples]# cd WEB-INF/
[root@tomcat1 WEB-INF]# ls -F
classes/  jsp/  jsp2/  lib/  tags/  web.xml

到這里我們的Tomcat的目錄結(jié)構(gòu)就講解完成了闰靴,下面我們得來詳細(xì)說說,Tomcat的配置文件钻注。

四蚂且、Tomcat 配置文件


1.簡(jiǎn)介

查看一下默認(rèn)配置文件,

[root@tomcat1 WEB-INF]# ls -F /usr/local/tomcat/conf/
Catalina/        catalina.properties  logging.properties  tomcat-users.xml
catalina.policy  context.xml          server.xml          web.xml

Tomcat的配置文件默認(rèn)存放在 $CATALINA_HOME/conf 目錄中幅恋,主要有以下幾個(gè):

  • server.xml: Tomcat的主配置文件杏死,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關(guān)配置信息;
  • web.xml:遵循Servlet規(guī)范標(biāo)準(zhǔn)的配置文件捆交,用于配置servlet淑翼,并為所有的Web應(yīng)用程序提供包括MIME映射等默認(rèn)配置信息;
  • tomcat-user.xml:Realm認(rèn)證時(shí)用到的相關(guān)角色品追、用戶和密碼等信息玄括;Tomcat自帶的manager默認(rèn)情況下會(huì)用到此文件;在Tomcat中添加/刪除用戶肉瓦,為用戶指定角色等將通過編輯此文件實(shí)現(xiàn)遭京;
  • catalina.policy:Java相關(guān)的安全策略配置文件,在系統(tǒng)資源級(jí)別上提供訪問控制的能力风宁;
  • catalina.properties:Tomcat內(nèi)部package的定義及訪問相關(guān)的控制洁墙,也包括對(duì)通過類裝載器裝載的內(nèi)容的控制;Tomcat在啟動(dòng)時(shí)會(huì)事先讀取此文件的相關(guān)設(shè)置戒财;
  • logging.properties: Tomcat通過自己內(nèi)部實(shí)現(xiàn)的JAVA日志記錄器來記錄操作相關(guān)的日志热监,此文件即為日志記錄器相關(guān)的配置信息,可以用來定義日志記錄的組件級(jí)別以及日志文件的存在位置等饮寞;
  • context.xml:所有host的默認(rèn)配置信息孝扛;

注,下面我們對(duì)常用的配置文件進(jìn)行詳解幽崩。

2.server.xml

首先苦始,我們來查看一下默認(rèn)的server.xml文件,
Tomcat以面向?qū)ο蟮姆绞竭\(yùn)行慌申,它可以在運(yùn)行時(shí)動(dòng)態(tài)加載配置文件中定義的對(duì)象結(jié)構(gòu)陌选,這有點(diǎn)類似于apache的httpd模塊的調(diào)用方式。server.xml中定義的每個(gè)主元素都會(huì)被創(chuàng)建為對(duì)象蹄溉,并以某特定的層次結(jié)構(gòu)將這些對(duì)象組織在一起咨油。下面是默認(rèn)配置,

[root@tomcat1 WEB-INF]# cd /usr/local/tomcat/conf/
[root@tomcat1 conf]# cat server.xml
<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <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>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container",
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">

    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->


    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the BIO implementation that requires the JSSE
         style configuration. When using the APR/native implementation, the
         OpenSSL style configuration is required as described in the APR/native
         documentation -->
    <!--
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
    -->
    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->

      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <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>

注柒爵,看上去很復(fù)雜役电。其實(shí),大部分都是注釋棉胀。下面是一個(gè)簡(jiǎn)圖說明了各組件之間的關(guān)系法瑟!

<Server>      頂層元素冀膝,代表一個(gè)服務(wù)器
    <Service>  頂層元素,是Connector的集合霎挟,只有一個(gè)Engine
        <Connectior/>        連接器類元素窝剖,代表通信接口
        <Engine>   容器類元素,為特定的Service組件處理所有客戶請(qǐng)求氓扛,可包含多個(gè)Host
            <Host>    為特定的虛擬主機(jī)處理所有客戶請(qǐng)求
                <Context>     為特定的WEB應(yīng)用處理所有客戶請(qǐng)求
                </Context>
            </Host>
        </Engine>
    </Service>
</Server>
tomcat體系架構(gòu)

server.xml文件中可定義的元素非常多枯芬,包括 Server, Service, Connector, Engine, Cluster, Host, Alias, Context, Realm, Valve, Manager, Listener, Resources, Resource, ResourceEnvRef, ResourceLink, WatchedResource, GlobalNameingResources, Store, Transaction, Channel, Membership, Transport, Member, ClusterListener等论笔。

下面簡(jiǎn)單介紹幾個(gè)常用組件:

(1).Server組件
如上面示例文件中定義的:

<Server port=”8005” shutdown=”SHUTDOWN”>

這會(huì)讓Tomcat啟動(dòng)一個(gè)server實(shí)例(即一個(gè)JVM)采郎,它監(jiān)聽在8005端口以接收shutdown命令妖谴。各Server的定義不能使用同一個(gè)端口隙畜,這意味著如果在同一個(gè)物理機(jī)上啟動(dòng)了多個(gè)Server實(shí)例,必須配置它們使用不同的端口沸柔。這個(gè)端口的定義用于為管理員提供一個(gè)關(guān)閉此實(shí)例的便捷途徑最楷,因此整份,管理員可以直接telnet至此端口使用SHUTDOWN命令關(guān)閉此實(shí)例。不過籽孙,基于安全角度的考慮烈评,這通常不允許遠(yuǎn)程進(jìn)行。

Server的相關(guān)屬性:

  • className: 用于實(shí)現(xiàn)此Server容器的完全限定類的名稱犯建,默認(rèn)為org.apache.catalina.core.StandardServer讲冠;
  • port: 接收shutdown指令的端口,默認(rèn)僅允許通過本機(jī)訪問适瓦,默認(rèn)為8005竿开;
  • shutdown:發(fā)往此Server用于實(shí)現(xiàn)關(guān)閉tomcat實(shí)例的命令字符串,默認(rèn)為SHUTDOWN玻熙;

(2).Service組件

Service主要用于關(guān)聯(lián)一個(gè)引擎和與此引擎相關(guān)的連接器否彩,每個(gè)連接器通過一個(gè)特定的端口和協(xié)議接收入站請(qǐng)求,將其轉(zhuǎn)發(fā)至關(guān)聯(lián)的引擎進(jìn)行處理嗦随。因此列荔,Service要包含一個(gè)引擎、一個(gè)或多個(gè)連接器枚尼。

如上面示例中的定義:

<Service name=”Catalina”>

這定義了一個(gè)名為Catalina的Service贴浙,此名字也會(huì)在產(chǎn)生相關(guān)的日志信息時(shí)記錄在日志文件當(dāng)中。
Service相關(guān)的屬性:

  • className: 用于實(shí)現(xiàn)service的類名姑原,一般都是org.apache.catalina.core.StandardService悬而。
  • name:此服務(wù)的名稱,默認(rèn)為Catalina锭汛;

(3).Connector組件

進(jìn)入Tomcat的請(qǐng)求可以根據(jù)Tomcat的工作模式分為如下兩類:

  • Tomcat作為應(yīng)用程序服務(wù)器:請(qǐng)求來自于前端的web服務(wù)器笨奠,這可能是Apache, IIS, Nginx等袭蝗;
  • Tomcat作為獨(dú)立服務(wù)器:請(qǐng)求來自于web瀏覽器;

Tomcat應(yīng)該考慮工作情形并為相應(yīng)情形下的請(qǐng)求分別定義好需要的連接器才能正確接收來自于客戶端的請(qǐng)求般婆。一個(gè)引擎可以有一個(gè)或多個(gè)連接器到腥,以適應(yīng)多種請(qǐng)求方式。

定義連接器可以使用多種屬性蔚袍,有些屬性也只適用于某特定的連接器類型乡范。一般說來,常見于server.xml中的連接器類型通常有4種:

  • HTTP連接器
  • SSL連接器
  • AJP 1.3連接器
  • proxy連接器

如上面示例server.xml中定義的HTTP連接器:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

定義連接器時(shí)可以配置的屬性非常多啤咽,但通常定義HTTP連接器時(shí)必須定義的屬性只有“port”晋辆,定義AJP連接器時(shí)必須定義的屬性只有"protocol",因?yàn)槟J(rèn)的協(xié)議為HTTP宇整。以下為常用屬性的說明:

  • address:指定連接器監(jiān)聽的地址瓶佳,默認(rèn)為所有地址,即0.0.0.0鳞青;
  • maxThreads:支持的最大并發(fā)連接數(shù)霸饲,默認(rèn)為200;
  • port:監(jiān)聽的端口臂拓,默認(rèn)為0厚脉;
  • protocol:連接器使用的協(xié)議,默認(rèn)為HTTP/1.1胶惰,定義AJP協(xié)議時(shí)通常為AJP/1.3傻工;
  • redirectPort:如果某連接器支持的協(xié)議是HTTP,當(dāng)接收客戶端發(fā)來的HTTPS請(qǐng)求時(shí)童番,則轉(zhuǎn)發(fā)至此屬性定義的端口精钮;
  • connectionTimeout:等待客戶端發(fā)送請(qǐng)求的超時(shí)時(shí)間,單位為毫秒剃斧,默認(rèn)為60000轨香,即1分鐘;
  • enableLookups:是否通過request.getRemoteHost()進(jìn)行DNS查詢以獲取客戶端的主機(jī)名幼东;默認(rèn)為true臂容;
  • acceptCount:設(shè)置等待隊(duì)列的最大長(zhǎng)度;通常在tomcat所有處理線程均處于繁忙狀態(tài)時(shí)根蟹,新發(fā)來的請(qǐng)求將被放置于等待隊(duì)列中脓杉;

下面是一個(gè)定義了多個(gè)屬性的SSL連接器:

<Connector port="8443"
 maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
 enableLookups="false" acceptCount="100" debug="0" scheme="https" secure="true"
 clientAuth="false" sslProtocol="TLS" />

(4).Engine組件

Engine是Servlet處理器的一個(gè)實(shí)例,即servlet引擎简逮,默認(rèn)為定義在 server.xml 中的 Catalina球散。Engine 需要 defaultHost 屬性來為其定義一個(gè)接收所有發(fā)往非明確定義虛擬主機(jī)的請(qǐng)求的host組件。如前面示例中定義的:

<Engine name="Catalina" defaultHost="localhost">

常用的屬性定義:

  • defaultHost:Tomcat支持基于FQDN的虛擬主機(jī)散庶,這些虛擬主機(jī)可以通過在Engine容器中定義多個(gè)不同的Host組件來實(shí)現(xiàn)蕉堰;但如果此引擎的連接器收到一個(gè)發(fā)往非非明確定義虛擬主機(jī)的請(qǐng)求時(shí)則需要將此請(qǐng)求發(fā)往一個(gè)默認(rèn)的虛擬主機(jī)進(jìn)行處理凌净,因此,在Engine中定義的多個(gè)虛擬主機(jī)的主機(jī)名稱中至少要有一個(gè)跟defaultHost定義的主機(jī)名稱同名屋讶;
  • name:Engine組件的名稱冰寻,用于日志和錯(cuò)誤信息記錄時(shí)區(qū)別不同的引擎;

注皿渗,Engine容器中可以包含Realm斩芭、Host、Listener和Valve子容器乐疆。

(5).Host組件

位于Engine容器中用于接收請(qǐng)求并進(jìn)行相應(yīng)處理的主機(jī)或虛擬主機(jī)划乖,如前面默認(rèn)配置文件中定義:

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>

常用屬性說明:

  • appBase:此Host的webapps目錄,即存放非歸檔的web應(yīng)用程序的目錄或歸檔后的WAR文件的目錄路徑诀拭;可以使用基于$CATALINA_HOME的相對(duì)路徑迁筛;
  • autoDeploy:在Tomcat處于運(yùn)行狀態(tài)時(shí)放置于appBase目錄中的應(yīng)用程序文件是否自動(dòng)進(jìn)行deploy;默認(rèn)為true耕挨;
  • unpackWars:在啟用此webapps時(shí)是否對(duì)WAR格式的歸檔文件先進(jìn)行展開;默認(rèn)為true尉桩;

下面是虛擬主機(jī)定義示例:

<Engine name="Catalina" defaultHost="localhost">
    <Host name="localhost" appBase="webapps">
        <Context path="" docBase="ROOT"/>
        <Context path="/bbs" docBase="/web/bss"
            reloadable="true" crossContext="true"/>
    </Host>
    <Host name="mail.test.com" appBase="/web/mail">
        <Context path="" docBase="ROOT"/>
    </Host>
</Engine>

主機(jī)別名定義:
如果一個(gè)主機(jī)有兩個(gè)或兩個(gè)以上的主機(jī)名筒占,額外的名稱均可以以別名的形式進(jìn)行定義,如下:

<Host name="www.test.com" appBase="webapps" unpackWARs="true">
    <Alias>test.com</Alias>
</Host>

(6).Context組件

Context在某些意義上類似于apache中的路徑別名蜘犁,一個(gè)Context定義用于標(biāo)識(shí)tomcat實(shí)例中的一個(gè)Web應(yīng)用程序翰苫;如下面的定義:

<!-- Tomcat Root Context -->
<Context path="" docBase="/web/webapps"/>
<!-- buzzin webapp -->
<Context path="/bbs"
 docBase="/web/threads/bbs"
 reloadable="true">
</Context>
<!-- chat server -->
 <Context path="/chat" docBase="/web/chat"/>
<!-- darian web -->
<Context path="/darian" docBase="darian"/>

在Tomcat中,每一個(gè)context定義也可以使用一個(gè)單獨(dú)的XML文件進(jìn)行这橙,其文件的目錄為

$CATALINA_HOME/conf/<engine name>/<hostname>奏窑。

可以用于Context中的XML元素有Loader,Manager屈扎,Realm埃唯,Resources和WatchedResource。

常用的屬性定義有:

  • docBase:相應(yīng)的Web應(yīng)用程序的存放位置鹰晨;也可以使用相對(duì)路徑墨叛,起始路徑為此Context所屬Host中appBase定義的路徑;切記模蜡,docBase的路徑名不能與相應(yīng)的Host中appBase中定義的路徑名有包含關(guān)系漠趁,比如,如果appBase為deploy忍疾,而docBase絕不能為deploy-bbs類的名字闯传;
  • path:相對(duì)于Web服務(wù)器根路徑而言的URI;如果為空“”卤妒,則表示為此webapp的根路徑甥绿;如果context定義在一個(gè)單獨(dú)的xml文件中叠必,此屬性不需要定義;
  • reloadable:是否允許重新加載此context相關(guān)的Web應(yīng)用程序的類妹窖;默認(rèn)為false纬朝;

(7).Realm組件

一個(gè)Realm表示一個(gè)安全上下文,它是一個(gè)授權(quán)訪問某個(gè)給定Context的用戶列表和某用戶所允許切換的角色相關(guān)定義的列表骄呼。因此共苛,Realm就像是一個(gè)用戶和組相關(guān)的數(shù)據(jù)庫。定義Realm時(shí)惟一必須要提供的屬性是classname蜓萄,它是Realm的多個(gè)不同實(shí)現(xiàn)隅茎,用于表示此Realm認(rèn)證的用戶及角色等認(rèn)證信息的存放位置。

  • JAASRealm:基于Java Authintication and Authorization Service實(shí)現(xiàn)用戶認(rèn)證嫉沽;
  • JDBCRealm:通過JDBC訪問某關(guān)系型數(shù)據(jù)庫表實(shí)現(xiàn)用戶認(rèn)證辟犀;
  • JNDIRealm:基于JNDI使用目錄服務(wù)實(shí)現(xiàn)認(rèn)證信息的獲取绸硕;
  • MemoryRealm:查找tomcat-user.xml文件實(shí)現(xiàn)用戶信息的獲忍镁埂;
  • UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)實(shí)現(xiàn)用戶認(rèn)證玻佩,它實(shí)現(xiàn)是一個(gè)完全可更新和持久有效的MemoryRealm出嘹,因此能夠跟標(biāo)準(zhǔn)的MemoryRealm兼容;它通過JNDI實(shí)現(xiàn)咬崔;

下面是一個(gè)常見的使用UserDatabase的配置:

<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
 resourceName=”UserDatabase”/>

下面是一個(gè)使用JDBC方式獲取用戶認(rèn)證信息的配置:

 <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
 driverName="org.gjt.mm.mysql.Driver"
 connectionURL="jdbc:mysql://localhost/authority"
 connectionName="test" connectionPassword="test"
 userTable="users" userNameCol="user_name"
 userCredCol="user_pass"
 userRoleTable="user_roles" roleNameCol="role_name" />

(8).Valve組件
Valve類似于過濾器税稼,它可以工作于Engine和Host/Context之間、Host和Context之間以及Context和Web應(yīng)用程序的某資源之間垮斯。一個(gè)容器內(nèi)可以建立多個(gè)Valve郎仆,而且Valve定義的次序也決定了它們生效的次序。Tomcat中實(shí)現(xiàn)了多種不同的Valve:

  • AccessLogValve:訪問日志Valve
  • ExtendedAccessValve:擴(kuò)展功能的訪問日志Valve
  • JDBCAccessLogValve:通過JDBC將訪問日志信息發(fā)送到數(shù)據(jù)庫中兜蠕;
  • RequestDumperValve:請(qǐng)求轉(zhuǎn)儲(chǔ)Valve扰肌;
  • RemoteAddrValve:基于遠(yuǎn)程地址的訪問控制;
  • RemoteHostValve:基于遠(yuǎn)程主機(jī)名稱的訪問控制牺氨;
  • SemaphoreValve:用于控制Tomcat主機(jī)上任何容器上的并發(fā)訪問數(shù)量狡耻;
  • JvmRouteBinderValve:在配置多個(gè)Tomcat為以Apache通過mod_proxy或mod_jk作為前端的集群架構(gòu)中,當(dāng)期望停止某節(jié)點(diǎn)時(shí)猴凹,可以通過此Valve將用記請(qǐng)求定向至備用節(jié)點(diǎn)夷狰;使用此Valve,必須使用JvmRouteSessionIDBinderListener郊霎;
  • ReplicationValve:專用于Tomcat集群架構(gòu)中沼头,可以在某個(gè)請(qǐng)求的session信息發(fā)生更改時(shí)觸發(fā)session數(shù)據(jù)在各節(jié)點(diǎn)間進(jìn)行復(fù)制;
  • SingleSignOn:將兩個(gè)或多個(gè)需要對(duì)用戶進(jìn)行認(rèn)證webapp在認(rèn)證用戶時(shí)連接在一起,即一次認(rèn)證即可訪問所有連接在一起的webapp进倍;
  • ClusterSingleSingOn:對(duì)SingleSignOn的擴(kuò)展土至,專用于Tomcat集群當(dāng)中,需要結(jié)合ClusterSingleSignOnListener進(jìn)行工作猾昆;

RemoteHostValve和RemoteAddrValve可以分別用來實(shí)現(xiàn)基于主機(jī)名稱和基于IP地址的訪問控制陶因,控制本身可以通過allow或deny來進(jìn)行定義,這有點(diǎn)類似于Apache的訪問控制功能垂蜗;如下面的Valve則實(shí)現(xiàn)了僅允許本機(jī)訪問/probe:

<Context path="/probe" docBase="probe">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
    allow="127\.0\.0\.1"/>
</Context>

其中相關(guān)屬性定義有:

  • className:相關(guān)的java實(shí)現(xiàn)的類名楷扬,相應(yīng)于分別應(yīng)該為org.apache.catalina.valves.RemoteHostValve或org.apache.catalina.valves.RemoteAddrValve;
  • allow:以逗號(hào)分開的允許訪問的IP地址列表贴见,支持正則表達(dá)式烘苹,因此,點(diǎn)號(hào)“.”用于IP地址時(shí)需要轉(zhuǎn)義片部;僅定義allow項(xiàng)時(shí)镣衡,非明確allow的地址均被deny;
  • deny: 以逗號(hào)分開的禁止訪問的IP地址列表档悠,支持正則表達(dá)式廊鸥;使用方式同allow;

(9).GlobalNamingResources

應(yīng)用于整個(gè)服務(wù)器的JNDI映射站粟,此可以避免每個(gè)Web應(yīng)用程序都需要在各自的web.xml創(chuàng)建黍图,這在web應(yīng)用程序以WAR的形式存在時(shí)尤為有用。它通撑樱可以包含三個(gè)子元素:

  • Environment;
  • Resource;
  • ResourceEnvRef;

(10).WatchedResource
WatchedResource可以用于Context中監(jiān)視指定的webapp程序文件的改變,并且能夠在監(jiān)視到文件內(nèi)容發(fā)生改變時(shí)重新裝載此文件剖张。

(11).Listener
Listener用于創(chuàng)建和配置LifecycleListener對(duì)象切诀,而LifecycleListener通常被開發(fā)人員用來創(chuàng)建和刪除容器。

(12).Loader
Java的動(dòng)態(tài)裝載功能是其語言功能強(qiáng)大表現(xiàn)之一搔弄,Servlet容器使用此功能在運(yùn)行時(shí)動(dòng)態(tài)裝載servlet和它們所依賴的類幅虑。Loader可以用于Context中控制java類的加載。

(13).Manager
Manger對(duì)象用于實(shí)現(xiàn)HTTP會(huì)話管理的功能顾犹,Tomcat中有5種Manger的實(shí)現(xiàn):

  1. StandardManager
    Tomcat的默認(rèn)會(huì)話管理器倒庵,用于非集群環(huán)境中對(duì)單個(gè)處于運(yùn)行狀態(tài)的Tomcat實(shí)例會(huì)話進(jìn)行管理。當(dāng)Tomcat關(guān)閉時(shí)炫刷,這些會(huì)話相關(guān)的數(shù)據(jù)會(huì)被寫入磁盤上的一個(gè)名叫SESSION.ser的文件擎宝,并在Tomcat下次啟動(dòng)時(shí)讀取此文件。

  2. PersistentManager
    當(dāng)一個(gè)會(huì)話長(zhǎng)時(shí)間處于空閑狀態(tài)時(shí)會(huì)被寫入到swap會(huì)話對(duì)象浑玛,這對(duì)于內(nèi)存資源比較吃緊的應(yīng)用環(huán)境來說比較有用绍申。
    3)DeltaManager
    用于Tomcat集群的會(huì)話管理器,它通過將改變了會(huì)話數(shù)據(jù)同步給集群中的其它節(jié)點(diǎn)實(shí)現(xiàn)會(huì)話復(fù)制。這種實(shí)現(xiàn)會(huì)將所有會(huì)話的改變同步給集群中的每一個(gè)節(jié)點(diǎn)极阅,也是在集群環(huán)境中用得最多的一種實(shí)現(xiàn)方式胃碾。

  3. BackupManager
    用于Tomcat集群的會(huì)話管理器,與DeltaManager不同的是筋搏,某節(jié)點(diǎn)會(huì)話的改變只會(huì)同步給集群中的另一個(gè)而非所有節(jié)點(diǎn)仆百。

5)SimpleTcpReplicationManager
Tomcat4時(shí)用到的版本,過于老舊了奔脐。

(14).Stores
PersistentManager必須包含一個(gè)Store元素以指定將會(huì)話數(shù)據(jù)存儲(chǔ)至何處俄周。這通常有兩種實(shí)現(xiàn)方式:FileStore和JDBCStore。

(15).Resources
經(jīng)常用于實(shí)現(xiàn)在Context中指定需要裝載的但不在Tomcat本地磁盤上的應(yīng)用資源帖族,如Java類栈源,HTML頁面,JSP文件等竖般。

(16).Cluster
專用于配置Tomcat集群的元素甚垦,可用于Engine和Host容器中。在用于Engine容器中時(shí)涣雕,Engine中的所有Host均支持集群功能艰亮。在Cluster元素中,需要直接定義一個(gè)Manager元素挣郭,這個(gè)Manager元素有一個(gè)其值為org.apache.catalina.ha.session.DeltaManager或org.apache.catalina.ha.session.BackupManager的className屬性迄埃。同時(shí),Cluster中還需要分別定義一個(gè)Channel和ClusterListener元素兑障。

  • Channel 用于Cluster中給集群中同一組中的節(jié)點(diǎn)定義通信“信道”侄非。Channel中需要至少定義Membership、Receiver和Sender三個(gè)元素流译,此外還有一個(gè)可選元素Interceptor逞怨。
  • Membership 用于Channel中配置同一通信信道上節(jié)點(diǎn)集群組中的成員情況,即監(jiān)控加入當(dāng)前集群組中的節(jié)點(diǎn)并在各節(jié)點(diǎn)間傳遞心跳信息福澡,而且可以在接收不到某成員的心跳信息時(shí)將其從集群節(jié)點(diǎn)中移除叠赦。Tomcat中Membership的實(shí)現(xiàn)是org.apache.catalina.tribes.membership.McastService。
  • Sender 用于Channel中配置“復(fù)制信息”的發(fā)送器革砸,實(shí)現(xiàn)發(fā)送需要同步給其它節(jié)點(diǎn)的數(shù)據(jù)至集群中的其它節(jié)點(diǎn)除秀。發(fā)送器不需要屬性的定義,但可以在其內(nèi)部定義一個(gè)Transport元素算利。
  • Transport 用于Sender內(nèi)部册踩,配置數(shù)據(jù)如何發(fā)送至集群中的其它節(jié)點(diǎn)。Tomcat有兩種Transport的實(shí)現(xiàn): 1) PooledMultiSender基于Java阻塞式IO笔时,可以將一次將多個(gè)信息并發(fā)發(fā)送至其它節(jié)點(diǎn)棍好,但一次只能傳送給一個(gè)節(jié)點(diǎn)。 2)PooledParallelSener 基于Java非阻塞式IO,即NIO借笙,可以一次發(fā)送多個(gè)信息至一個(gè)或多個(gè)節(jié)點(diǎn)扒怖。
  • Receiver 用于Channel定義某節(jié)點(diǎn)如何從其它節(jié)點(diǎn)的Sender接收復(fù)制數(shù)據(jù),Tomcat中實(shí)現(xiàn)的接收方式有兩種BioReceiver和NioReceiver业稼。

3.web.xml
web.xml基于Java Servlet規(guī)范盗痒,可被用于每一個(gè)Java servlet容器,通常有兩個(gè)存放位置低散,$CATALINA_BASE/conf和每個(gè)Web應(yīng)用程序(通常是WEB-INF/web.xml)俯邓。Tomcat在deploy一個(gè)應(yīng)用程序時(shí)(包括重啟或重新載入),它首先讀取conf/web.xml熔号,而后讀取WEB-INF/web.xml稽鞭。

好了,到這里Tomcat服務(wù)器的安裝與配置以及各組件詳解就說到這里了引镊,希望大家有所收獲_…… 在前面的兩篇博客中我們主要講解了朦蕴,Tomcat相關(guān)的理論知識(shí)與相關(guān)組件的講解,從下一篇博客開始弟头,我們將講解Tomcat的相關(guān)操作吩抓,包括Nginx結(jié)合Tomcat、Apache結(jié)合Tomcat赴恨、Tomcat集群講解等疹娶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伦连,隨后出現(xiàn)的幾起案子雨饺,更是在濱河造成了極大的恐慌,老刑警劉巖惑淳,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沛膳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡汛聚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門短荐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倚舀,“玉大人,你說我怎么就攤上這事忍宋『勖玻” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵糠排,是天一觀的道長(zhǎng)舵稠。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么哺徊? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任室琢,我火速辦了婚禮,結(jié)果婚禮上落追,老公的妹妹穿的比我還像新娘盈滴。我一直安慰自己,他們只是感情好轿钠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布巢钓。 她就那樣靜靜地躺著,像睡著了一般疗垛。 火紅的嫁衣襯著肌膚如雪症汹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天贷腕,我揣著相機(jī)與錄音背镇,去河邊找鬼。 笑死花履,一個(gè)胖子當(dāng)著我的面吹牛芽世,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诡壁,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼济瓢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了妹卿?” 一聲冷哼從身側(cè)響起旺矾,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎夺克,沒想到半個(gè)月后箕宙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铺纽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年柬帕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狡门。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陷寝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出其馏,到底是詐尸還是另有隱情凤跑,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布叛复,位于F島的核電站仔引,受9級(jí)特大地震影響扔仓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咖耘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一翘簇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鲤看,春花似錦缘揪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慷吊,卻和暖如春袖裕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溉瓶。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工急鳄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人堰酿。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓疾宏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親触创。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坎藐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容