window下tomcat 按天生成日志_Tomcat原理(一)
生活随笔
收集整理的這篇文章主要介紹了
window下tomcat 按天生成日志_Tomcat原理(一)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
bin:文件是存放啟動和關閉tomcat的腳本。
webapps:是存放web應用程序。
work是存放的jsp編譯后產生的class文件
conf :存放tomcat相關配置的文件
- Catalina:用于存放每個虛擬機的Context配置
- context.xml 用于定義所有web應用均需要加載的Context配置,如果web定義了自己的context.xml將會被覆蓋。
- catalina.properties:tomcat的環境變量的配置。
- catalina.policy tomcat的安全策略配置。
- logging.properties tomcat的日志配置文件,可以通過修改tomcat的日志等級級別和路徑
- server.xml tomcat的核心配置文件
- tomcat-uesrs.xml 定義tomcat默認的用戶以及角色映射信息配置。
- web.xml:tomcat中所有應用默認的部署描述文件,主要定義了Servlet和MIEME映射。
work目錄是存放的jsp代碼和臨時編譯生成的文件。
Tomcat運行原理分析
server.xml配置文件的主要內容,也是tomcat大容器的結構
<?xml version="1.0" encoding="UTF-8"?> <!--指的是tomcat服務器一個jvm實例,包含多個組件,負責管理和啟動各個service,同時監聽8005端口發送的shutdown命令 用于關閉容器。這將意味著各個server不能使用同一個端口 屬性: className: 用于實現此Server容器的完全限定類的名稱,默認為org.apache.catalina.core.StandardServer; port: 接收shutdown指令的端口,默認僅允許通過本機訪問,默認為8005; shutdown:發往此Server用于實現關閉tomcat實例的命令字符串,默認為SHUTDOWN;--><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" /><!-- 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 resourcesDocumentation at /docs/jndi-resources-howto.html--><GlobalNamingResources><!-- Editable user database that can also be used byUserDatabaseRealm 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><!--定義一個名字為Catalina的service,因此名字也會在產生相關的日志信息時記錄在日志文件中name:此服務的名稱,默認為Catalina;--><Service name="Catalina"><!--進入tomcat的請求可以分為兩類:一類:tomcat作為應用服務器,請求來自于別的web服務器 這個可能是Apache/IIS/Nignx就是localhost:80/web/index--經過tomcat轉換---tomcat(localhost:8080/web/index.jsp)另一類:就是直接作為獨立服務器--》localhost:8080/web/index.jsp使用瀏覽器請求定義連接器可以使用多種屬性,有些屬性也只適用于某特定的連接器類型。一般說來,常見于server.xml中的連接器類型通常有4種:1) HTTP連接器 2) SSL連接器 3) AJP 1.3連接器 4) proxy連接器定義連接器時可以配置的屬性非常多,但通常定義HTTP連接器時必須定義的屬性只有“port“,定義AJP連接器時必須定義的屬性只有”protocol”,因為默認的協議為HTTP。以下為常用屬性的說明:1) address:指定連接器監聽的地址,默認為所有地址,即0.0.0.0; 可以自己指定地,如2) maxThreads:支持的最大并發連接數,默認為200;3) port:監聽的端口,默認為0;4) protocol:連接器使用的協議,默認為HTTP/1.1,定義AJP協議時通常為AJP/1.3;5) redirectPort:如果某連接器支持的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的端口;6) connectionTimeout:等待客戶端發送請求的超時時間,單位為毫秒,默認為60000,即1分鐘;7) enableLookups:是否通過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;默認為true; 進行反解的,可以設置為false8) acceptCount:設置等待隊列的最大長度;通常在tomcat所有處理線程均處于繁忙狀態時,新發來的請求將被放置于等待隊列中;--><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" />--><!--定義一個ssl/tls htpp/1.1在8843上的連接,使用nio(同步非阻塞IO)接口,默認SSLImplementation依賴于ARP/native的包并且使用userOpenSSL監聽--><!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443This connector uses the NIO implementation. The defaultSSLImplementation will depend on the presence of the APR/nativelibrary and the useOpenSSL attribute of theAprLifecycleListener.可以使用JSSE或OpenSSL樣式配置,不用管已經配置的SSLImplementation,下面是JSSE風格的配置Either JSSE or OpenSSL style configuration may be used regardless ofthe SSLImplementation selected. JSSE style configuration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/localhost-rsa.jks"type="RSA" /></SSLHostConfig></Connector>--><!--在8443端口定義一個SSL/TLS HTTP/1.1和http/2這個連接總是使用OpenSSLfor TLS使用APR/native實現。--><!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2This connector uses the APR/native implementation which always usesOpenSSL for TLS.Either JSSE or OpenSSL style configuration may be used. OpenSSL styleconfiguration is used below.--><!--<Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"maxThreads="150" SSLEnabled="true" ><UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /><SSLHostConfig><Certificate certificateKeyFile="conf/localhost-rsa-key.pem"certificateFile="conf/localhost-rsa-cert.pem"certificateChainFile="conf/localhost-rsa-chain.pem"type="RSA" /></SSLHostConfig></Connector>--><!--使用8443端口定義一個AJP1.3 連接--><!-- 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 processesevery request. The Engine implementation for Tomcat stand aloneanalyzes the HTTP headers included with the request, and passes themon to the appropriate Host (virtual host).Documentation at /docs/config/engine.html --><!--Engine是Servlet處理器的一個實例,即servlet引擎,默認為定義在server.xml中的Catalina。Engine需要defaultHost屬性來為其定義一個接收所有發往非明確定義虛擬主機的請求的host組件。如前面示例中定義的.Engine容器中可以包含Realm、Host、Listener和Valve子容器。--><!-- 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"/>--><!--一個Realm表示一個安全上下文,它是一個授權訪問某個給定Context的用戶列表和某用戶所允許切換的角色相關定義的列表。因此,Realm就像是一個用戶和組相關的數據庫。定義Realm時惟一必須要提供的屬性是classname,它是Realm的多個不同實現,用于表示此Realm認證的用戶及角色等認證信息的存放位置。JAASRealm:基于Java Authintication and Authorization Service實現用戶認證;JDBCRealm:通過JDBC訪問某關系型數據庫表實現用戶認證;JNDIRealm:基于JNDI使用目錄服務實現認證信息的獲取;MemoryRealm:查找tomcat-user.xml文件實現用戶信息的獲取;UserDatabaseRealm:基于UserDatabase文件(通常是tomcat-user.xml)實現用戶認證,它實現是一個完全可更新和持久有效的MemoryRealm,因此能夠跟標準的MemoryRealm兼容;它通過JNDI實現;--><!--使用LockOutRealmz阻止攻擊者使用密碼暴力攻擊Use the LockOutRealm to prevent attempts to guess user passwordsvia a brute-force attack --><Realm className="org.apache.catalina.realm.LockOutRealm"><!-- This Realm uses the UserDatabase configured in the global JNDIresources under the key "UserDatabase". Any editsthat are performed against this UserDatabase are immediatelyavailable for use by the Realm. --><Realm className="org.apache.catalina.realm.UserDatabaseRealm"resourceName="UserDatabase"/></Realm><!--位于Engine容器中用于接收請求并進行相應處理的主機或虛擬主機1) appBase:此Host的webapps目錄,即存放非歸檔的web應用程序的目錄或歸檔后的WAR文件的目錄路徑;可以使用基于$CATALINA_HOME的相對路徑;2) autoDeploy:在Tomcat處于運行狀態時放置于appBase目錄中的應用程序文件是否自動進行deploy;默認為true;3) unpackWars:在啟用此webapps時是否對WAR格式的歸檔文件先進行展開;默認為true;如果一個主機有兩個或兩個以上的主機名,額外的名稱均可以以別名的形式進行定義,如下:<Host name=”www.ttlsa.com” appBase=”webapps” unpackWARs=”true”><Alias>feiyu.com</Alias></Host>--><Host name="localhost" appBase="webapps"unpackWARs="true" autoDeploy="true"><!-- SingleSignOn valve, share authentication between web applicationsDocumentation at: /docs/config/valve.html --><!--<Valve className="org.apache.catalina.authenticator.SingleSignOn" />--><!--1) docBase:相應的Web應用程序的存放位置;也可以使用相對路徑,起始路徑為此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的 Host中appBase中定義的路徑名有包含關系,比如,如果appBase為deploy,而docBase絕不能為deploy-bbs類的名字;2) path:相對于Web服務器根路徑而言的URI;如果為空“”,則表示為此webapp的根路徑;如果context定義在一個單獨的xml文件中,此屬性不需要定義,有可能是別名;3) reloadable:是否允許重新加載此context相關的Web應用程序的類;默認為false;--><!--Valve類似于過濾器,它可以工作于Engine和Host/Context之間、Host和Context之間以及Context和Web應用程序的某資源之間。一個容器內可以建立多個Valve,而且Valve定義的次序也決定了它們生效的次序。Tomcat中實現了多種不同的Valve:AccessLogValve:訪問日志ValveExtendedAccessValve:擴展功能的訪問日志ValveJDBCAccessLogValve:通過JDBC將訪問日志信息發送到數據庫中;RequestDumperValve:請求轉儲Valve;RemoteAddrValve:基于遠程地址的訪問控制;RemoteHostValve:基于遠程主機名稱的訪問控制;SemaphoreValve:用于控制Tomcat主機上任何容器上的并發訪問數量;JvmRouteBinderValve:在配置多個Tomcat為以Apache通過mod_proxy或mod_jk作為前端的集群架構中,當期望停止某節點時,可以通過此Valve將用記請求定向至備用節點;使用此Valve,必須使JvmRouteSessionIDBinderListener;ReplicationValve:專用于Tomcat集群架構中,可以在某個請求的session信息發生更改時觸發session數據在各節點間進行復制;SingleSignOn:將兩個或多個需要對用戶進行認證webapp在認證用戶時連接在一起,即一次認證即可訪問所有連接在一起的webapp;ClusterSingleSingOn:對SingleSignOn的擴展,專用于Tomcat集群當中,需要結合ClusterSingleSignOnListener進行工作;--><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> 請求過程Connector描述:localhost:8080/web/index.jsp
Tomcat各類Connector對比
Connector的實現模式有三種,分別是BIO、NIO、APR,可以在server.xml中指定。
- BIO:用http://java.io編寫的TCP模塊,阻塞IO
- NIO:用java.nio編寫的TCP模塊,非阻塞IO,(IO多路復用)
- APR:全稱Apache Portable Runtime,使用JNI的方式來進行讀取文件以及進行網絡傳輸
Apache Portable Runtime是一個高度可移植的庫,它是Apache HTTP Server 2.x的核心。 APR具有許多用途,包括訪問高級IO功能(如sendfile,epoll和OpenSSL),操作系統級功能(隨機數生成,系統狀態等)和本地進程處理(共享內存,NT管道和Unix套接字)。
表格中字段含義說明:
- Support Polling:是否支持基于IO多路復用的socket事件輪詢
- Polling Size:輪詢的最大連接數
- Wait for next Request:在等待下一個請求時,處理線程是否釋放,BIO是沒有釋放的,所以在keep-alive=true的情況下處理的并發連接數有限
- Read Request Headers:由于request header數據較少,可以由容器提前解析完畢,不需要阻塞
- Read Request Body:讀取request body的數據是應用業務邏輯的事情,同時Servlet的限制,是需要阻塞讀取的
- Write Response:跟讀取request body的邏輯類似,同樣需要阻塞寫
NIO Connector主要參數
總結
以上是生活随笔為你收集整理的window下tomcat 按天生成日志_Tomcat原理(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的类和实例_Python 面
- 下一篇: python sort 逆序_pytho