设为首页 收藏本站
查看: 878|回复: 0

[经验分享] 实现Nginx通过反代对Java环境和Perl环境的支持(附Tomcat)

[复制链接]

尚未签到

发表于 2018-8-31 06:16:39 | 显示全部楼层 |阅读模式
环境:
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>  保存退出
  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显示如下图一只猫。说明安装成功!
DSC0000.jpg

  二、.以第一种实现:动态与静态页面分离实现
  Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tmcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。所以最好的搭配是静态由Nginx处理,动态交给Tomcat
  这里假定Tomcat服务器的IP地址为10.150.1.109,同时tomcat服务器开放的服务端口为8080,Nginx相关配置代码如下:
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指令不使用正则表达式时,没有此限制。
  三、以第二种实现:多个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.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通过反向代理对Perl和JSP的支持,反向代理的原理大同小异。
  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以及将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
  二、为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;"
  
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环境搭建成功:
DSC0001.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实现将不同语言的处理请求直接交给后端的环境服务器。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-559011-1-1.html 上篇帖子: Perl专题之函数(三)函数原型 下篇帖子: perl first day-geek
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表