1. 程式人生 > >記一次伺服器Tomcat優化經歷

記一次伺服器Tomcat優化經歷

公司需要一臺測試伺服器來做測試用,所以花了點時間把服務全部部署好,在部署好war包之後,發現Tomcat訪問超級慢。

1、進入Tomcat的bin目錄下,執行

./catalina.sh run命令,在前臺列印執行資訊,首先看其有沒有報錯。好,沒有報錯,進行下一步。

1)修改你的jdk目錄下/jre/lib/security目錄下的java.security這個檔案,將securerandom.source=file:/dev/random改成securerandom.source=file:/dev/./urandom,這是Java官方給的解決方案,修改隨機數。

2)修改Tomcat目錄下conf目錄下server.xml檔案配置:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="40000"
redirectPort="8443" URIEncoding="UTF-8" 
acceptCount="4000" maxThreads="5000"
compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
disableUploadTimeout="true" debug="0"
maxHttpHeaderSize="8192" useBodyEncodingForURI="true" minProcessors="100" maxProcessors="5000"
minSpareThreads="1000" maxSpareThreads="4000" enableLookups="false"/>

2、top檢視執行緒,看看java有沒有特別高的佔用,有的話,用jstack pid追蹤檢視是哪的語句造成的。

3、設定JVM執行大小,及配置優化引數,在Tomcat目錄bin目錄下vim catalina.sh

在# OS specific support.  $var _must_ be set to either true or false.這一行下加入:

export JAVA_OPTS="-server -Xms1400M -Xmx6144M -Xss1024k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=14 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

4、nginx+Tomcat做動靜分離設定,加快網頁載入速度,我的nginx配置如下:

負載均衡配置:

upstream gw {
server localhost:8080;
}

在http模組里加入:

proxy_cache_key '$host:$server_port$request_uri';
proxy_temp_file_write_size 64k;
proxy_temp_path /dev/shm/cache/proxy_temp_path;
proxy_cache_path /dev/shm/cache/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;

server配置:

server {
listen 80;
server_name localhost 192.168.1.111:8080;
access_log /data/wwwlogs/access_nginx.log combined;
location ~ ^/crossdomain.xml {
root /usr/local/crossdomain;
}
location ~ .*\.(js|css|ico|png|jpg|eot|svg|ttf|woff) {
proxy_cache cache_one;
proxy_cache_valid 200 304 302 5d;
proxy_cache_valid any 5d;
proxy_cache_key '$host:$server_port$request_uri';
add_header X-Cache '$upstream_cache_status from $host';
root /usr/local/tomcat/gw/webapps/gw/WEB-INF ;
expires 10d;
}
location ~ .*$ {
#index index;
proxy_pass http://gw;
}
}

5、配置Tomcat+mysql連線池,在http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html這個網址裡可以看到示例。

在conf目錄下編輯context.xml檔案,註釋:<WatchedResource>WEB-INF/web.xml</WatchedResource>預設。

新增:

<Resource name="jdbc/zhi"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="1000"
minIdle="10"
maxWait="20000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="使用者密碼"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://你所要連線資料庫的地址"/>

在WEB-INF目錄下編輯web.xml檔案,在<web-app>中加入:

<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/zhi</res-ref-name>        #名字要對應
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

注意要將資料驅動包放在Tomcat的lib目錄下,否則會提示找不到資料驅動。

連線池配置完成。

6、首先./shutdown.sh,然後執行./catalina.sh run命令,同時在網頁開啟你要開啟的網頁,檢視輸出,可以看到網頁呼叫資料庫等資訊,計算下連線資料庫所需時間,看是否要優化資料庫。