實現Nginx通過反代對Java環境和Perl環境的支持(附Tomcat)

環境:

CentOS 6.4 64位

Nginx-1.3.9

JDK-1.7

tomcat-6.0.10

 

摘要:

ApacheJava的支持很靈活,多爲Apache+TomcatApache+resin等都實現。Apache採用內置模塊來支持Java應用服務器。而Nginx在支持Java應用服務器方面是通過自身的反向代理功能來實現的,反向代理是Nginx的一個優點,將請求代理給java服務器,減少兩者相互影響度,對此也是仁者見仁智者見智

搭建Nginx+Java環境:

在《高性能Linux服務器構建實戰》書中介紹兩種實現方式,這裏以實例。更詳細的介紹一下:

第一種:將靜態頁面請求交給Nginx,動態請求交給後端Tomcat處理。

第二種:將所有請求都交給後端的Tomcat服務器處理,同時利用Nginx自身的負載均衡功能,進行多臺Tomcat服務器的負載均衡。

 

一、首先詳細Tomcat的安裝步驟:


1下載jdk,本例使用jdk-7u5-linux-i586.rpm

2個可以使用的安裝包

jdk-7u5-linux-i586.tar.gz

jdk-7u5-linux-i586.rpm

下載頁面:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

 

2查看並修改使jdk-7u5-linux-i586.rpm具有執行權限(我用root安裝,默認有執行權限)

chmod+x jdk-7u5-linux-i586.rpm


3卸載舊的版本

1)、若之前沒有裝過,卸載系統自帶的jdk版本:

查看自帶的jdk

#rpm-qa|grep gcj

看到如下信息:

libgcj-4.1.2-44.el5

java-1.4.2-gcj-compat-1.4.2.0-40jpp.115

使用rpm -e --nodeps 命令刪除上面查找的內容:

#rpm -e–nodeps java-1.4.2-gcj-compat-1.4.2.0-40jpp.115

 

2)、若之前自己裝過,卸載rpm安裝的jdk版本

查看安裝的jdk

#rpm-qa|grep jdk

看到如下信息:

jdk-1.6.0_22-fcs

卸載:

#rpm -e--nodeps jdk-1.6.0_22-fcs


4、安裝jdk (根據提示一步步安裝)

#rpm -ivh jdk-7u5-linux-i586.rpm

Preparing... ###########################################[100%]

1:jdk ########################################### [100%]

Unpacking JAR files...

rt.jar...

jsse.jar...

charsets.jar...

tools.jar...

localedata.jar...

plugin.jar...

javaws.jar...

deploy.jar..

 

也有可能出現下面情況

Unpacking JAR files...

rt.jar...

Error: Could not open input file:/usr/java/jre1.7.0_10/lib/rt.pack

jsse.jar...

Error: Could not open input file:/usr/java/jre1.7.0_10/lib/jsse.pack

charsets.jar...

Error: Could not open input file:/usr/java/jre1.7.0_10/lib/charsets.pack

localedata.jar...

Error: Could not open input file:/usr/java/jre1.7.0_10/lib/ext/localedata.pack

 

這個不用管它,是因爲你的rpm包裏把這些文件直接裝進JAR包裏了,Unpacking 的時候找不到,不影響的。


5、增加JAVA_HOME環境變量

vi /etc/profile

在最後面增加:

#set java environment
exportJAVA_HOME=/usr/java/jdk1.7.0_05
exportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
exportPATH=$PATH:$JAVA_HOME/bin
exportJAVA_HOME CLASSPATH PATH

保存退出

 

6、安裝Tomcat

下載apache-tomcat-6.0.10.tar.gz

tar -zxvf apache-tomcat-6.0.10.tar.gz

cp -R apache-tomcat-6.0.10 /usr/local/tomcat/ #拷貝apache-tomcat-6.0.10/usr/local/下並重命名爲tomcat

4) /usr/local/tomcat/bin/startup.sh #啓動tomcat

顯示

Using CATALINA_BASE: /usr/local/tomcat

Using

CATALINA_HOME: /usr/local/tomcat

Using

CATALINA_TEMDIR: /usr/local/tomcat/temp

Using

JAVA_HOME: /usr/java/jdk1.6.0_01

 

7、測試

訪問http://10.150.1.109:8080顯示如下圖一隻貓。說明安裝成功!

101947294.jpg

 

二、.以第一種實現:動態與靜態頁面分離實現

Tomcat在高併發環境下處理動態請求時性能很低,而在處理靜態頁面更加脆弱。雖然Tmcat的最新版本支持epoll,但是通過Nginx來處理靜態頁面要比通過Tomcat處理在性能方面好很多。所以最好的搭配是靜態由Nginx處理,動態交給Tomcat


這裏假定Tomcat服務器的IP地址爲10.150.1.109,同時tomcat服務器開放的服務端口爲8080Nginx相關配置代碼如下:

server {
listen 80;
server_namewww.abc.net;
root/web/www/html;
location /img/{
alias/web/www/html/img/;
}
location ~ (\.jsp)|(\.do)$ {
proxy_passhttp://10.150.1.109:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}

在這個實例中,首先定義了一個虛擬主機www.abc.net,然後通過location指令將/web/www/html/img/目錄下的靜態文件交給Nginx來完成,最後一個location指令將所有以.jsp.do結尾的文件都交給Tomcat服務器的8080端口來處理,即http:// 10.150.1.109:8080


需要特別注意的是,在location指令中使用正則表達式後,proxy_pass後面的代理路徑不能含有地址鏈接,也就是不能寫成http:// 10.150.1.109:8080/,或者類似http:// 10.150.1.109:8080/jsp的形式。在location指令不使用正則表達式時,沒有此限制。


 

三、以第二種實現:多個TomcatNginx做負載均衡實例

這裏假定有三臺Tomcat服務器,分別開放不同的端口,地址分別是:

10.150.1.109:8000 

10.150.1.110:8080 

10.150.1.112:8090 


Nginx的相關配置代碼如下:

upstream mytomcats {
server 10.150.1.109:8000;
server 10.150.1.110:8080;
server 10.150.1.112:8090;
}
server {
listen 80;
server_namewww.abc.net;
location ~*\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root/web/www/html/;
}
location / {
proxy_passhttp://mytomcats;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}


在這個實例中,首先通過upstream定義一個負載均衡組,組名爲mytomcats,組的成員就是上面指定的三臺Tomcat服務器;接着通過server指令定義一個www.abc.net的虛擬主機;然後通過location指令以正則表達式的方式將指定類型的文件全部交給Nginx去處理;最後將其它所有請求全部交給負載均衡組來處理。

這裏還有一點需要注意,如果在location指令使用正則表達式後再用alias指令,nginx是不支持的。

#########################################################################################

說明:現在Perl的網站市面上已經不算多了,但是Perl不只是用於網頁,還有很多程序,Nginx本身是一個靜態的HTTP服務器和反向代理服務器,它並不支持動態頁面,不過可以通過Nginx的反向代理功能實現。下面要講述的Nginx通過反向代理對PerlJSP的支持,反向代理的原理大同小異。

Nginx的安裝路徑爲/usr/local/nginx

Nginx對Perl的支持

一、Perl的安裝

1.獲取wrapper程序

網上很多文檔、教程給的下載連接都已經失效,這裏我上傳一份最新的,也可留郵箱。“下載地址:http://down.51cto.com/data/1026473”,解壓出來將其命名爲nginx-fcgi.pl並放到/usr/local/nginx目錄下。nginx-fcgi.pl是一個用Perl腳本寫的wrapper實例,所以,操作系統必須要安裝Perl程序以及相關模塊。


2.安裝相關的系統支持模塊

(1)安裝FCGI模塊

獲取地址:http://search.cpan.org/CPAN/authors/id/F/FL/FLORA/FCGI-0.74.tar.gz

# tar zxvf FCGI-0.74.tar.gz
# cd FCGI-0.74
# perl Makefile.PL
# make
# make install

 

(2)安裝IO模塊

獲取地址:http://search.cpan.org/CPAN/authors/id/G/GB/GBARR/IO-1.25.tar.gz

# tar -xvzf IO-1.25.tar.gz
# cd IO-1.25
# perl Makefile.PL
# make
# make install

(3)安裝IO::ALL模塊

獲取地址:http://www.cpan.org/authors/id/I/IN/INGY/IO-All-0.50.tar.gz

# tar -xvzf IO-All-0.50.tar.gz
# cd IO-All-0.50
# perl Makefile.PL
#make
#make install

 

3.編寫nginx-fcgi啓動腳本

僅有wrapper文件是不夠的,還需要一個腳本來創建socket、啓動wrapper以及將wrappersocket綁定,下面通過一個shell腳本來完成這一系列工作。

#!/bin/bash
nginxroot=/usr/local/nginx
start ()
{
chownnobody.root $nginxroot/logs
echo"$nginxroot/nginx-fcgi.pl -l $nginxroot/logs/nginx-fcgi.log -pid$nginxroot/logs/nginx-fcgi.pid -S $nginxroot/logs/nginx-fcgi.sock">>$nginxroot/nginx_fcgi.sh
chownnobody.nobody$nginxroot/nginx_fcgi.sh
chmod755$nginxroot/nginx_fcgi.sh
sudo-u nobody$nginxroot/nginx_fcgi.sh
echo"start nginx-fcgi done"
}
stop ()
{
kill$(cat$nginxroot/logs/nginx-fcgi.pid)
rm$nginxroot/logs/nginx-fcgi.pid 2>/dev/null
rm$nginxroot/logs/nginx-fcgi.sock 2>/dev/null
rm$nginxroot/nginx_fcgi.sh 2>/dev/null
echo"stopnginx-fcgi done"
}
case$1 in
stop)
stop
;;
start)
start
;;
restart)
stop
start
;;
*)
echo$"Usage: perl-cgi {start|stop|restart}"
exit1
esac


nginx-fcgi中,變量nginxroot指定Nginx的安裝目錄,nginx-fcgi.sock是生成的文件sock nobody爲運行nginx_fcgi進程的用戶,這個用戶要和運行Nginx的用戶一致。

配置完腳本後,將此文件放到/usr/local/nginx目錄下,接着通過如下方式管理nginx-fcgi進程。

#chmod 755 /usr/local/nginx/nginx-fcgi.pl
#chmod 755 /usr/local/nginx/nginx-fcgi
#/usr/local/nginx/nginx-fcgi start|stop|restart

  

二、爲Nginx添加FCGI支持

  修改Nginx配置文件,在server虛擬主機中添加如下配置:

location ~ \.cgi${
root html;
fastcgi_pass unix:/usr/local/nginx/logs/nginx-fcgi.sock;
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

 

在這個location配置中,NginxFastCGI的通信方式爲Unix Socket。根據經驗,IP Socket在高併發訪問下比Unix Socket穩定,但Unix Socket速度要比IP Socket快。 “$document_root”是虛擬主機的根目錄,在這裏是/usr/local/nginx/html目錄。

  

三、測試Nginx +Perl(FastCGI) 


以上配置工作完成後,即可啓動服務了。首選啓動nginx-fcgi進程:

/usr/local/nginx/nginx-fcgistart

 

再啓動nginx

/usr/local/nginx/sbin/nginx


/usr/local/nginx/html目錄下創建一個123.cgi的文件。

# disable filename globbing
set-f
echo"Content-type: text/plain;charset=iso-8859-1"
echo
echoCGI/1.0 testscript report:
echo
echoargc is $#. argv is "$*".
echo
echoSERVER_SOFTWARE = $SERVER_SOFTWARE
echoSERVER_NAME = $SERVER_NAME
echoGATEWAY_INTERFACE = $GATEWAY_INTERFACE
echoSERVER_PROTOCOL = $SERVER_PROTOCOL
echoSERVER_PORT = $SERVER_PORT
echoREQUEST_METHOD = $REQUEST_METHOD
echoREMOTE_ADDR = $REMOTE_ADDR

 

接着通過瀏覽器訪問“http://10.150.1.111/123.cgi”,如果顯示與下面類似的信息,表明Nginx+Perl環境搭建成功:

102236766.jpg

問題:

1、編譯FCGI的時候報錯.

Can't locateExtUtils/MakeMaker.pm in @INC 

……
BEGIN failed--compilation aborted at Makefile.PL line 3. 

解決辦法:

yum install perl-ExtUtils-CBuilderperl-ExtUtils-MakeMaker

 

2、編譯IO-All的時候報錯:

make: Warning: File`Makefile.PL' has modification time 3.9e+06 s in the future

安裝IO-All的時候make報以上錯,說明是系統時間的問題,

解決辦法:/usr/sbin/ntpdatentp.api.bz

 

3、啓動nginx-fcgi的時候報PID文件問題

ERROR PID file /usr/local/nginx/logs/nginx-fcgi.pid already exists

是權限不夠

解決辦法:chown nobody.root /usr/local/nginx –R

 

總結:各個語言各有利弊,也都有所需要的市場,現實環境會有更多的支持擴展和變換性,上面是輕量級的一個架構,還可以利用Nginx做負載,然後做單獨的Java和Perl環境服務器,利用Nginx實現將不同語言的處理請求直接交給後端的環境服務器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章