JSP應(yīng)用服務(wù)器搭建實施文檔(Nginx+Tomcat)
原創(chuàng)
【51CTO獨家特稿】本文節(jié)選自某電子商務(wù)網(wǎng)站JSP應(yīng)用服務(wù)器的環(huán)境搭建實施文檔,文中的IP和域名進行了修改。JSP應(yīng)用服務(wù)器由Nginx+Tomcat整合而成,而新的Tomcat 7.0相對于以前的版本來說,它的新特征如下:
◆使用隨機數(shù)防止跨站腳本攻擊;
◆改變了安全認證中的jessionid的機制,防止Session攻擊;
◆可進行內(nèi)存泄露的偵測和防范;
◆在war文件外使用別名去存儲靜態(tài)內(nèi)容;
◆支持Servlet 3.0、JSP 2.2和JSP-EL 2.2;
◆更容易將Tomcat內(nèi)嵌到應(yīng)用中去,比如JBoss;
◆異步日志。
其中第三點是我最為關(guān)注的,在以前的版本中Tomcat均存在著內(nèi)存泄露的情況,我希望能在新版本中有所改善。
Nginx與Tomcat整合的好處如下所示:
◆靜態(tài)分離,加快用戶訪問網(wǎng)站的速度。
◆整個負載均衡層和Web層的工作流程為LVS/DR+Keeaplived→Nginx反向代理(動靜分離)→Tomcat集群,可以保證整個網(wǎng)站不會因為某一臺LVS或Nginx+tomcat機器掛掉而影響網(wǎng)站的運營。
◆Nginx穩(wěn)定,宕機的可能性微乎其乎。
下面是項目實施的具體步驟——
由于服務(wù)器均采用的是最小化安裝,所以先安裝一些基礎(chǔ)的編譯庫,命令如下:
yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel
(1)首先分別在xxx.xxx.xxx.146和xxx.xxx.xxx.147上安裝Nginx 0.8.56和Tomcat 7.0,然后整合它們。
在安裝Tomcat 7.0之前,必須先安裝JDK,其下載地址為
https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter
由于我的服務(wù)器都是CentOS x86_64,所以選擇了jdk-6u18-linux-x64.bin軟件包,記得還是要將其放在/usr/local/src目錄下,方便以后的工作規(guī)劃。
下載完成后,修改jdk-6u18-linux-x64.bin為可執(zhí)行,并運行它:
cd /usr/local/src chmod +x jdk-6u18-linux-x64.bin ./jdk-6u18-linux-x64 mv jdk1.6.0_18 /usr/local/jdk
接著配置系統(tǒng)的Java運行環(huán)境,我是通過修改/etc/profile文件來實現(xiàn),修改內(nèi)容如下所示:
JAVA_HOME="/usr/local/jdk" CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib" PATH=".:$PATH:$JAVA_HOME/bin" CATALINA_HOME="/usr/local/tomcat" export JAVA_HOME CATALINA_HOME
保存退出后,執(zhí)行以下命令讓環(huán)境立即生效:
source /etc/profile
然后下載并安裝apache-tomat7.0.12,如下所示。
cd /usr/local/src/ wget http://mirror.bjtu.edu.cn/apache/tomcat/tomcat-7/v7.0.12/bin/apache-tomcat-7.0.12.tar.gz tar zxvf apache-tomcat-7.0.12.tar.gz mv apache-tomcat-7.0.12 /usr/local/tomcat/ cp –rf /usr/local/tomcat/webapps /data/htdocs/www vim /usr/local/tomcat/conf/server.xml
修改tomcat的根路徑位置,我的網(wǎng)站地址為/data/htdocs/www/shop,這個虛擬主機需要在/usr/local/tomcat/conf/server.xml里指定,改動后的內(nèi)容如下所示:
<Host name="www.scjtxx.cn" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="/data/htdocs/www/shop/" />
如果我們要繼續(xù)增加虛擬主機,按照如上格式繼續(xù)添加內(nèi)容即可,Host name后面接虛擬主機名稱,docBase后面接虛擬主機對應(yīng)的路徑位置。
安裝完成后,啟動tomcat,默認即監(jiān)聽了8080端口,啟動命令如下:
/usr/local/tomcat/bin/startup.sh
成功運行后,用lsof-i:80來進行驗證,如下所示:
lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 23731 root 40u IPv6 3347645 TCP *:webcache (LISTEN)
最后安裝pcre8.1.0及Nginx0.8.56,整合Nginx0.8.56與Tomcat7.0.12, Nginx0.8.56的安裝過程可參考前面的內(nèi)容,為了節(jié)約篇幅就不再詳細說明了。靜態(tài)HTML頁面、圖片、CSS等由Nginx來處理,jsp、do內(nèi)容由后端的Tomcat處理,nginx.conf配置文件的內(nèi)容如下所示(這里為了調(diào)試方便,我們首先將域名www.scjtxx.cn指向了xxx.xxx.xxx.146,另一臺Web配置跟xxx.xxx.xxx.146一樣的,我這里以xxx.xxx.xxx.146舉例說明,等此架構(gòu)中的Web環(huán)境均順利后,再將域名www.scjtxx.cn指向我們的VIP地址):
user www www; worker_processes 8; error_log /usr/local/webserver/nginx/logs/nginx_error.log crit; pid /usr/local/webserver/nginx/nginx.pid; #Specifies the value for maximum file descriptors that can be opened by this process. worker_rlimit_nofile 65535; #工作模式及連接數(shù)上限 events { use epoll; worker_connections 65535; } #設(shè)定http服務(wù)器,利用它的反向代理功能提供負載均衡支持 http { #設(shè)定mime類型 include mime.types; default_type application/octet-stream; #charset gb2312; #設(shè)定請求緩沖 server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 300m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; server_tokens off; client_body_buffer_size 512k; proxy_connect_timeout 5; proxy_send_timeout 60; proxy_read_timeout 5; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; # fastcgi_connect_timeout 300; # fastcgi_send_timeout 300; # fastcgi_read_timeout 300; # fastcgi_buffer_size 64k; # fastcgi_buffers 4 64k; # fastcgi_busy_buffers_size 128k; # fastcgi_temp_file_write_size 128k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; ###禁止通過ip訪問站點 server{ server_name _; return 404; } server { listen 80; server_name www.scjtxx.cn; index index.html index.htm index.jsp index.do;#設(shè)定訪問的默認首頁地址 root /data/htdocs/www/shop;#設(shè)定網(wǎng)站的資源存放路徑 #limit_conn crawler 20; if (-d $request_filename) { rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; } #所有jsp的頁面均交由tomcat處理 location ~ \.(jsp|jspx|do)?$ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8080;#轉(zhuǎn)向tomcat處理 } location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ #設(shè)定訪問靜態(tài)文件直接讀取不經(jīng)過tomcat { expires 30d; } location ~ .*\.(js|css)?$ { expires 1h; } #定義訪問日志的寫入格式 log_format wwwlog '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log /data/logs/www_nginx.log wwwlog;#設(shè)定訪問日志的存放路徑 } }
配置完成后,我們用如下命令啟動Nginx進程,讓其監(jiān)聽80端口,如下所示:
/usr/local/webserver/nginx/sbin/nginx
然后我們在/data/htdocs/www/shop/下面寫一段Java代碼,驗證以上的配置是否成功,寫完后我們可以用cat 命令來查看/data/htdocs/www/shop/mem.jsp文件,文件內(nèi)容如下所示:
<% Runtime lRuntime = Runtime.getRuntime(); out.println("*** BEGIN MEMORY STATISTICS ***<br/>"); out.println("Free Memory: "+lRuntime.freeMemory()+"<br/>"); out.println("Max Memory: "+lRuntime.maxMemory()+"<br/>"); out.println("Total Memory: "+lRuntime.totalMemory()+"<br/>"); out.println("Available Processors : "+lRuntime.availableProcessors()+"<br/>"); out.println("*** END MEMORY STATISTICS ***"); %>
我們可以輸入http://www.scjtxx.cn/mem.jsp來驗證nginx+tomcat整合成功了。
【編輯推薦】