Tomcat內存優化主要是對啓動參數的優化,能夠在Tomcat的啓動腳本catalina.sh中設置JAVA_OPTS參數。javascript
-server 啓用jdk 的 server 版; -Xms java虛擬機初始化時的最小內存; -Xmx java虛擬機可以使用的最大內存;
配置完成後重啓Tomcat,經過如下命令查看配置是否生效。css
1.首先查看Tomcat進程號html
ps -ef|grep java;進程號22222前端
2.經過進程號查看配置是否生效java
sudo jmap -heap 22222nginx
Tomcat的主要配置文件,該配置中包含不少元素service、host、connector等。web
<Server> <Listener /> <GlobaNamingResources> </GlobaNamingResources <Service> <Connector /> <Engine> <Logger /> <Realm /> <host> <Logger /> <Context /> </host> </Engine> </Service> </Server>
maxThreads 客戶請求最大線程數,默認200shell
minSpareThreads Tomcat初始化時建立的 socket 線程數apache
maxSpareThreads Tomcat鏈接器的最大空閒 socket 線程數瀏覽器
minProcessors:最小空閒鏈接線程數,用於提升系統處理性能,默認值爲 10
maxProcessors:最大鏈接線程數,即:併發處理的最大請求數,默認值爲 75
acceptCount:容許的最大鏈接數,應大於等於 maxProcessors ,默認值爲 100
enableLookups:是否反查域名,取值爲: true 或 false 。爲了提升處理能力,應設置爲 false
redirectPort 在須要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 端口
acceptAccount 監聽端口隊列最大數,滿了以後客戶請求會被拒絕(不能小於maxSpareThreads )
connectionTimeout:網絡鏈接超時,單位:毫秒。設置爲 0 表示永不超時,這樣設置有隱患的。一般可設置爲30000 毫秒。
URIEncoding URL統一編碼
其中和最大鏈接數相關的參數爲maxProcessors 和 acceptCount 。若是要加大併發鏈接數,應同時加大這兩個參數。
<Connector port="9027" protocol="HTTP/1.1" maxHttpHeaderSize="8192" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" disableUploadTimeout="true"/>
maxThreads 和acceptCount生效狀況
maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值爲200
acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值爲100
狀況1:接受一個請求,此時tomcat起動的線程數沒有到達maxThreads,tomcat會起動一個線程來處理此請求。
狀況2:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,tomcat會把此請求放入等待隊列,等待空閒線程。
狀況3:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,等待隊列中的請求個數也達到了acceptCount,此時tomcat會直接拒絕這次請求,返回connection refused
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="1000"/>
強烈建議不要使用 Tomcat 的虛擬主機,推薦每一個站點使用一個實例。即,能夠啓動多個 Tomcat,而不是啓動一個 Tomcat 裏面包含多個虛擬主機。由於 Tomcat是多線程,共享內存,任何一個虛擬主機中的應用崩潰,都會影響到全部應用程序。雖然採用多實例的方式會產生過多的開銷,但至少保障了應用程序的隔離和安全。
tomcat做爲一個應用服務器,也是支持 gzip 壓縮功能的。咱們能夠在 server.xml 配置文件中的 Connector 節點中配置以下參數,來實現對指定資源類型進行壓縮。
compression="on" # 打開壓縮功能 compressionMinSize="50" # 啓用壓縮的輸出內容大小,默認爲2KB noCompressionUserAgents="gozilla, traviata" # 對於如下的瀏覽器,不啓用壓縮 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" # 哪些資源類型須要壓縮
Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程 HTML、CSS、Javascript和Text,它能夠節省40% 左右的流量。更爲重要的是,它能夠對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。可是, 壓縮會增長 Tomcat 的負擔,所以最好採用Nginx + Tomcat 或者 Apache + Tomcat 方式,將壓縮的任務交由 Nginx/Apache 去作。
Tomcat是根據瀏覽器請求頭中的accept-encoding來判斷瀏覽器是否支持 壓縮功能,若是這個值包含有gzip,就代表瀏覽器支持gzip壓縮內容的瀏覽
AJP是爲 Tomcat 與 HTTP 服務器之間通訊而定製的協議,能提供較高的通訊速度和效率。若是tomcat前端放的是apache的時候,會使用到AJP這個鏈接器。因爲咱們公司前端是由nginx作的反向代理,所以不使用此鏈接器,所以須要註銷掉該鏈接器。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
server.xml中定義了能夠直接關閉 Tomcat 實例的管理端口。咱們經過 telnet 鏈接上該端口以後,輸入 SHUTDOWN (此爲默認關閉指令)便可關閉 Tomcat 實例(注意,此時雖然實例關閉了,可是進程仍是存在的)。因爲默認關閉 Tomcat 的端口和指令都很簡單。默認端口爲8005,指令爲SHUTDOWN 。所以咱們須要將關閉指令修改複雜一點。
固然,在新版的 Tomcat 中該端口僅監聽在127.0.0.1上,所以你們也沒必要擔憂。除非黑客登錄到tomcat本機去執行關閉操做。
<Server port="8005" shutdow n="9SDKJ29jksjf23sjf0LSDF92JKS9DKkjsd">
通常公司的 Tomcat 都是放在內網的,所以咱們針對 Tomcat 服務的監聽地址都是內網地址。
<Connector port="8080" address="172.16.100.1" />
默認 Tomcat 是開啓了對war包的熱部署的。爲了防止被植入木馬等惡意程序,所以咱們要關閉自動部署。
<Host name="localhost" appBase="" unpackWARs="false" autoDeploy="false">
1.配置Tomcat運行內存;2.利用緩存和壓縮《利用nginx加速web訪問》;3.採用集羣《利用nginx+tomcat+memcached組建web服務器負載均衡》4.Tomcat的參數優化;5.改用APR庫
tomcat默認採用的BIO模型,在幾百併發下性能會有很嚴重的降低。tomcat自帶還有NIO的模型,另外也能夠調用APR的庫來實現操做系統級別控制。
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
修改成
<Connector port="80" protocol="org.apache.coyote.http11.Http11NioProtocol " connectionTimeout="20000" redirectPort="8443" />
NIO模型是內置的,調用很方便,只須要將上面配置文件中protocol修改爲org.apache.coyote.http11.Http11NioProtocol,重啓便可生效。上面配置我已經改過了,默認的是HTTP/1.1。
APR則須要安裝第三方庫,在高併發下會讓性能有明顯提高。
Tomcat的四種基於HTTP協議的Connector性能比較
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connector executor="tomcatThreadPool" port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector executor="tomcatThreadPool" port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />
Connector按照順序命名爲 NIO, HTTP, POOL, NIOP
NIO HTTP POOL NIOP
281 | 65 | 208 | 365 |
666 | 66 | 110 | 398 |
692 | 65 | 66 | 263 |
256 | 63 | 94 | 459 |
440 | 67 | 145 | 363 |
服務器上不要安裝JDK,請使用 Server JRE. 服務器上根本不須要編譯器,代碼應該在Release服務器上完成編譯打包工做。
理由:一旦服務器被控制,能夠防止在其服務器上編譯其餘惡意代碼並植入到你的程序中。
1. 禁用Tomcat管理頁面,刪除webapps下面的全部代碼,刪除conf/Catalina/localhost/下的host-manager.xml和manager.xml這兩個文件。
rm -rf /srv/apache-tomcat/webapps/*
2. 註釋或刪除 tomcat-users.xml 全部用戶權限
<?xml version='1.0' encoding='utf-8'?> <tomcat-users> </tomcat-users>
3. 隱藏Tomcat版本信息
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="8192" minSpareThreads="64" maxSpareThreads="128" acceptCount="128" enableLookups="false" server="Neo App Srv 1.0"/>
4. 啓動用戶與端口
建立一個用戶,這個用戶只用於啓動Tomcat
groupadd -g 80 daemon adduser -o --home /daemon --shell /sbin/nologin --uid 80 --gid 80 -c "Web Server" daemon
chown daemon:daemon -R /srv/* su - daemon -c "/srv/apache-tomcat/bin/startup.sh"
應用程序的部署和Tomcat啓動不能使用同一用戶(tomcat被植入web shell程序時,不能建立或編輯應用程序目錄下任何內容)
5. 關閉自動部署
unpackWARs="false" autoDeploy="false";防止被植入木馬等惡意程序
6. JSESSIONID
修改 Cookie 變量 JSESSIONID, 這個cookie 是用於維持Session關係。建議你改成PHPSESSID。
7. 超時自動退出
查看tomcat配置文件server.xml是否有設置connectionTimeout值,設置帳戶自動登出。
session超時失效設置
<session-config> <session-timeout>30</session-timeout> </session-config>
8. 自定義錯誤頁面
<error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.html</location> </error-page>
9. 禁止列目錄(高版本默認已禁止)
編輯tomcat/conf/web.xml配置文件
<init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param>
當WEB目錄中沒有默認首頁如index.html,index.jsp等文件時,不會列出目錄內容,直接訪問http://ip:8800/webadd。
10. 配置httponly
可在conf/context.xml配置文件中配置
<Context useHttpOnly="true"></context>
而且修改tomcat/conf/web.xml配置文件
<session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> </cookie-config> </session-config>
11. 配置cookie加密傳輸
在web.xml中sesion-config節點配置cookie-config中secure屬性,此配置只容許cookie在加密方式下傳輸。只有當使用https協議鏈接時cookie才能夠被頁面訪問.
<session-config> <session-timeout>30</session-timeout> <cookie-config> <http-only>true</http-only> <secure>true</secure> </cookie-config> </session-config>
12. HTTPS加密協議
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" />