實戰Nginx與Perl、Java的安裝與配置

經過前面的介紹,能夠對Nginx有了一個比較全面的認識:Nginx自己是一個靜態的HTTP服務器和反向代理服務器,它不支持動態頁面,所謂的Nginx對動態程序的支持都是經過反向代理功能實現的。下面要講述的Nginx對Perl和JSP的支持,就是經過Nginx的反向代理功能完成的。Nginx對Perl和JSP的支持在實現細節上可能有必定差異,可是實現原理是徹底同樣的。
Nginx的安裝這裏再也不講述,這假定Nginx的安裝路徑爲/usr/local/nginx。
 
1、Perl(FastCGI)的安裝
 
1.獲取wrapper程序
讀者能夠從http://www.nginx.eu/nginx-fcgi/ 上下載nginx-fcgi.txt文件,而後將其命名爲nginx-fcgi.pl並放到/usr/local/nginx目錄下。nginx-fcgi.pl是一個用Perl腳本寫的wrapper實例,因此,操做系統必需要安裝Perl程序以及相關模塊。 
 
2.安裝相關的系統支持模塊
能夠從http://search.cpan.org下載所需的相應模塊,而後進行安裝。
(1)安裝FCGI模塊
 
  
  
           
  
  
  1. [root@localhost opt]# tar zxvf FCGI-0.71.tar.gz  
  2. [root@localhost opt]# cd FCGI-0.71 
  3. [root@localhost FCGI-0.71]# perl Makefile.PL 
  4. [root@localhost FCGI-0.71]# make 
  5. [root@localhost FCGI-0.71]# make install 
(2)安裝IO模塊
 
  
  
           
  
  
  1. [root@localhost opt]# tar -xvzf IO-1.25.tar.gz 
  2. [root@localhost opt]# cd IO-1.25 
  3. [root@localhost IO-1.25]# perl Makefile.PL 
  4. [root@localhost IO-1.25]# make  
  5. [root@localhost IO-1.25]# make install 
(3)安裝IO::ALL模塊
 
  
  
           
  
  
  1. [root@localhost opt]# tar -xvzf IO-All-0.39.tar.gz 
  2. [root@localhost opt]# cd IO-ALL-0.39 
  3. [root@localhost IO-ALL-0.39]# perl Makefile.PL 
  4. [root@localhost IO-ALL-0.39]#make  
  5. [root@localhost IO-ALL-0.39]#make install 
 
3.編寫nginx-fcgi啓動腳本
僅僅有wrapper文件是不夠的,還須要一個腳原本建立socket、啓動wrapper以及將wrapper和socket綁定,下面經過一個shell腳原本完成這一系列工做。
 
  
  
           
  
  
  1. [root@localhost root]# more nginx-fcgi  
  2.     #!/bin/bash 
  3.     nginxroot=/usr/local/nginx 
  4.  
  5.     start () 
  6.     { 
  7.     chown nobody.root $nginxroot/logs 
  8.     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 
  9.     chown nobody.nobody $nginxroot/nginx_fcgi.sh 
  10.     chmod 755 $nginxroot/nginx_fcgi.sh 
  11.     sudo -u nobody $nginxroot/nginx_fcgi.sh 
  12.     echo "start nginx-fcgi done" 
  13.     } 
  14.  
  15.     stop () 
  16.     { 
  17.     kill $(cat $nginxroot/logs/nginx-fcgi.pid) 
  18.     rm $nginxroot/logs/nginx-fcgi.pid 2>/dev/null 
  19.     rm $nginxroot/logs/nginx-fcgi.sock 2>/dev/null 
  20.     rm $nginxroot/nginx_fcgi.sh 2>/dev/null 
  21.     echo "stop nginx-fcgi done" 
  22.     } 
  23.  
  24.     case $1 in 
  25.     stop) 
  26.     stop 
  27.     ;; 
  28.  
  29.     start) 
  30.     start 
  31.     ;; 
  32.  
  33.     restart) 
  34.     stop 
  35.     start 
  36.     ;; 
  37.  
  38.     *) 
  39.     echo $"Usage: perl-cgi {start|stop|restart}" 
  40.         exit 1 
  41.     esac 
 
在nginx-fcgi中,變量nginxroot指定Nginx的安裝目錄,nginx-fcgi.sock是生成的文件sock, nobody爲運行nginx_fcgi進程的用戶,這個用戶要和運行Nginx的用戶一致。
配置完腳本後,將此文件放到/usr/local/nginx目錄下,接着經過以下方式管理nginx-fcgi進程。
 
  
  
           
  
  
  1. [root@localhost root]#chmod 755 /usr/local/nginx/nginx-fcgi.pl 
  2. [root@localhost root]#chmod 755 /usr/local/nginx/nginx-fcgi 
  3. [root@localhost root]#/usr/local/nginx/nginx-fcgi start|stop|restart 
 
2、爲Nginx添加FCGI支持
修改Nginx配置文件,在server虛擬主機中添加以下配置:
 
  
  
           
  
  
  1.  location ~ \.cgi$ {   
  2.     root        html;   
  3.     fastcgi_pass    unix:/usr/local/nginx/logs/nginx-fcgi.sock;   
  4.     fastcgi_index   index.cgi;   
  5.     fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;   
  6.     include         fastcgi_params;   
  7. }  
在這個location配置中,Nginx與FastCGI的通訊方式爲Unix Socket。根據經驗,IP Socket在高併發訪問下比Unix Socket穩定,但Unix Socket速度要比IP Socket快。 「$document_root」是虛擬主機的根目錄,在這裏是/usr/local/nginx/html目錄。

3、測試Nginx +Perl(FastCGI)
全部配置工做完成後,便可啓動服務了。首選啓動nginx-fcgi進程,操做以下:
/usr/local/nginx/nginx-fcgi start
而後啓動nginx服務。
/usr/local/nginx/sbin/nginx
下面在/usr/local/nginx/html目錄下建立一個test.cgi的文件。
 
  
  
           
  
  
  1. # disable filename globbing 
  2. set -f 
  3. echo "Content-type: text/plain; charset=iso-8859-1" 
  4. echo 
  5.  
  6. echo CGI/1.0 test script report: 
  7. echo 
  8.  
  9. echo argc is $#. argv is "$*". 
  10. echo 
  11.  
  12. echo SERVER_SOFTWARE = $SERVER_SOFTWARE 
  13. echo SERVER_NAME = $SERVER_NAME 
  14. echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE 
  15. echo SERVER_PROTOCOL = $SERVER_PROTOCOL 
  16. echo SERVER_PORT = $SERVER_PORT 
  17. echo REQUEST_METHOD = $REQUEST_METHOD 
  18. echo REMOTE_ADDR = $REMOTE_ADDR 
接着經過瀏覽器訪問test.cgi文件,若是顯示與下面相似的信息,代表Nginx+Perl環境搭建成功。:
 
  
  
           
  
  
  1. CGI/1.0 test script report: 
  2. argc is 1. argv is . 
  3. SERVER_SOFTWARE = nginx/0.7.65 
  4. SERVER_NAME = localhost 
  5. GATEWAY_INTERFACE = CGI/1.1 
  6. SERVER_PROTOCOL = HTTP/1.1 
  7. SERVER_PORT = 8000 
  8. REQUEST_METHOD = GET 
  9. REMOTE_ADDR = 125.76.159.197 
 
4、搭建Nginx+Java環境
Apache對Java的支持很靈活,他們的結合度也很高,例如Apache+Tomcat和Apache+resin等均可以實現對Java應用的支持。Apache通常採用一個內置模塊來和Java應用服務器打交道。與Apache相比,Nginx在配合Java應用服務器方面,耦合度很低,它只能經過自身的反向代理功能來實現與Java應用服務器的支持,這偏偏是Nginx的一個優勢,耦合度的下降,可使Nginx與Java服務器的相互影響降到最低。
接下來經過Nginx+Tomcat的實例來說解Nginx對Java的支持。Tomcat在高併發環境下處理動態請求時性能很低,而在處理靜態頁面更加脆弱。雖然Tmcat的最新版本支持epoll,可是經過Nginx來處理靜態頁面要比經過Tomcat處理在性能方面好不少。
Nginx能夠經過兩種方式來實現與Tomcat的耦合。
將靜態頁面請求交給Nginx,動態請求交給後端Tomcat處理。
將全部請求都交給後端的Tomcat服務器處理,同時利用Nginx自身的負載均衡功能,進行多臺Tomcat服務器的負載均衡。
下面經過兩個配置實例分別講述這兩種實現Nginx與Tomcat耦合的方式。
1.動態頁面與靜態頁面分離實例
這裏假定Tomcat服務器的IP地址爲192.168.12.130,同時tomcat服務器開放的服務端口爲8080,Nginx相關配置代碼以下:
 
  
  
           
  
  
  1. server {  
  2.     listen 80;  
  3.     server_name www.ixdba.net;  
  4.     root /web/www/html; 
  5.  
  6. location /img/ {  
  7.     alias /web/www/html/img/;  
  8.  
  9. location ~ (\.jsp)|(\.do)$ {  
  10.         proxy_pass http://192.168.12.130:8080;  
  11.         proxy_redirect off; 
  12.         proxy_set_header Host $host; 
  13.         proxy_set_header X-Real-IP $remote_addr; 
  14.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  15.         client_max_body_size 10m; 
  16.         client_body_buffer_size 128k; 
  17.         proxy_connect_timeout 90; 
  18.         proxy_send_timeout 90; 
  19.         proxy_read_timeout 90; 
  20.         proxy_buffer_size 4k; 
  21.         proxy_buffers 4 32k; 
  22.         proxy_busy_buffers_size 64k; 
  23.         proxy_temp_file_write_size 64k; 
  24. }  
  25.  
  26. }  
在這個實例中,首先定義了一個虛擬主機www.ixdba.net,而後經過location指令將/web/www/html/img/目錄下的靜態文件交給Nginx來完成,最後一個location指令將全部以.jsp、.do結尾的文件都交給Tomcat服務器的8080端口來處理,即http://192.168.12.130:8080。
須要特別注意的是,在location指令中使用正則表達式後,proxy_pass後面的代理路徑不能含有地址連接,也就是不能寫成http://192.168.12.130:8080/,或者相似http://192.168.12.130:8080/jsp的形式。在location指令不使用正則表達式時,沒有此限制。
2.多個Tomcat負載均衡實例
這裏假定有三臺Tomcat服務器,分別開放不一樣的端口,地址分別是:
 
  
  
           
  
  
  1. 192.168.12.131:8000 
  2. 192.168.12.132:8080 
  3. 192.168.12.133:8090 
 
Nginx的相關配置代碼以下:
 
  
  
           
  
  
  1. upstream mytomcats {  
  2.     server 192.168.12.131:8000;  
  3.     server 192.168.12.132:8080; 
  4.     server 192.168.12.133:8090; 
  5. }  
  6.  
  7. server {  
  8.     listen 80;  
  9.     server_name www.ixdba.net;  
  10.  
  11. location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {  
  12.     root /web/www/html/;  
  13.  
  14. location / { 
  15.         proxy_pass http://mytomcats;  
  16.         proxy_redirect off; 
  17.         proxy_set_header Host $host; 
  18.         proxy_set_header X-Real-IP $remote_addr; 
  19.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  20.         client_max_body_size 10m; 
  21.         client_body_buffer_size 128k; 
  22.         proxy_connect_timeout 90; 
  23.         proxy_send_timeout 90; 
  24.         proxy_read_timeout 90; 
  25.         proxy_buffer_size 4k; 
  26.         proxy_buffers 4 32k; 
  27.         proxy_busy_buffers_size 64k; 
  28.         proxy_temp_file_write_size 64k; 
  29. }  
  30.  
  31. }  
在這個實例中,首先經過upstream定義一個負載均衡組,組名爲mytomcats,組的成員就是上面指定的三臺Tomcat服務器;接着經過server指令定義一個www.ixdba.net的虛擬主機;而後經過location指令以正則表達式的方式將指定類型的文件所有交給Nginx去處理;最後將其它全部請求所有交給負載均衡組來處理。
這裏還有一點須要注意,若是在location指令使用正則表達式後再用alias指令,nginx是不支持的。
相關文章
相關標籤/搜索