阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

实现Nginx通过反代对Java环境和Perl环境的支持(附Tomcat)

105次阅读
没有评论

共计 11607 个字符,预计需要花费 30 分钟才能阅读完成。

环境:
CentOS 6.4 64 位
Nginx-1.3.9
JDK-1.7
tomcat-6.0.10
 
摘要:
Apache 对 Java 的支持很灵活,多为 Apache+Tomcat 和 Apache+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 显示如下图一只猫。说明安装成功!

实现 Nginx 通过反代对 Java 环境和 Perl 环境的支持(附 Tomcat)

推荐阅读

 

Nginx 实现反向代理和负载均衡的配置及优化 http://www.linuxidc.com/Linux/2013-11/92909.htm

 

Nginx 做负载均衡报:nginx: [emerg] could not build the types_hash http://www.linuxidc.com/Linux/2013-10/92063.htm

 

Nginx 负载均衡模块 ngx_http_upstream_module 详述 http://www.linuxidc.com/Linux/2013-10/91907.htm

 

Nginx+Firebug 让浏览器告诉你负载均衡将请求分到了哪台服务器 http://www.linuxidc.com/Linux/2013-10/91824.htm

 

Ubuntu 安装 Nginx php5-fpm MySQL(LNMP 环境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

 

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

二、. 以第一种实现:动态与静态页面分离实现
Tomcat 在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然 Tmcat 的最新版本支持 epoll,但是通过 Nginx 来处理静态页面要比通过 Tomcat 处理在性能方面好很多。所以最好的搭配是静态由 Nginx 处理,动态交给 Tomcat

这里假定 Tomcat 服务器的 IP 地址为 10.150.1.109,同时 tomcat 服务器开放的服务端口为 8080,Nginx 相关配置代码如下:
server {
listen 80;
server_namewww.linuxidc.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.linuxidc.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 指令不使用正则表达式时,没有此限制。

三、以第二种实现:多个 Tomcat,Nginx 做负载均衡实例
这里假定有三台 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.linuxidc.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.linuxidc.net 的虚拟主机; 然后通过 location 指令以正则表达式的方式将指定类型的文件全部交给 Nginx 去处理; 最后将其它所有请求全部交给负载均衡组来处理。
这里还有一点需要注意,如果在 location 指令使用正则表达式后再用 alias 指令,nginx 是不支持的。
#########################################################################################

说明:现在 Perl 的网站市面上已经不算多了,但是 Perl 不只是用于网页, 还有很多程序,Nginx 本身是一个静态的 HTTP 服务器和反向代理服务器,它并不支持动态页面, 不过可以通过 Nginx 的反向代理功能实现。下面要讲述的 Nginx 通过反向代理对 Perl 和 JSP 的支持,反向代理的原理大同小异。
Nginx 的安装路径为 /usr/local/nginx。

Nginx 对 Perl 的支持

一、Perl 的安装
1. 获取 wrapper 程序
网上很多文档、教程给的下载连接都已经失效,这里我上传一份最新的。

下载地址

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是 www.linuxidc.com

具体下载目录在 /2013 年资料 /12 月 / 4 日 / 实现 Nginx 通过反代对 Java 环境和 Perl 环境的支持(附 Tomcat)

下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm

解压出来将其命名为 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 以及将 wrapper 和 socket 绑定,下面通过一个 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

环境:
CentOS 6.4 64 位
Nginx-1.3.9
JDK-1.7
tomcat-6.0.10
 
摘要:
Apache 对 Java 的支持很灵活,多为 Apache+Tomcat 和 Apache+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 显示如下图一只猫。说明安装成功!

实现 Nginx 通过反代对 Java 环境和 Perl 环境的支持(附 Tomcat)

推荐阅读

 

Nginx 实现反向代理和负载均衡的配置及优化 http://www.linuxidc.com/Linux/2013-11/92909.htm

 

Nginx 做负载均衡报:nginx: [emerg] could not build the types_hash http://www.linuxidc.com/Linux/2013-10/92063.htm

 

Nginx 负载均衡模块 ngx_http_upstream_module 详述 http://www.linuxidc.com/Linux/2013-10/91907.htm

 

Nginx+Firebug 让浏览器告诉你负载均衡将请求分到了哪台服务器 http://www.linuxidc.com/Linux/2013-10/91824.htm

 

Ubuntu 安装 Nginx php5-fpm MySQL(LNMP 环境搭建) http://www.linuxidc.com/Linux/2012-10/72458.htm

 

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

二、为 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 配置中,Nginx 与 FastCGI 的通信方式为 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 环境搭建成功:

实现 Nginx 通过反代对 Java 环境和 Perl 环境的支持(附 Tomcat)

问题:
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 实现将不同语言的处理请求直接交给后端的环境服务器。

Tomcat 的详细介绍:请点这里
Tomcat 的下载地址:请点这里

相关阅读:

Linux 下 Apache 与多个 Tomcat 集群负载均衡 http://www.linuxidc.com/Linux/2012-01/51731.htm

Nginx Tomcat 集群负载均衡解决笔记 http://www.linuxidc.com/Linux/2013-07/86827.htm

实例详解 Tomcat 组件安装 +Nginx 反向代理 Tomcat+Apache 使用 mod_jk 和 mod_proxy 反向代理和负载均衡 http://www.linuxidc.com/Linux/2013-06/85290.htm

Apache+Tomcat 环境搭建(JK 部署过程)http://www.linuxidc.com/Linux/2012-11/74474.htm

深入剖析 Tomcat PDF http://www.linuxidc.com/Linux/2013-11/92595.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计11607字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中