Tag Archives: Nginx

Nginx连接JBoss碰到的问题

最近在做Nginx+JBoss的性能测试,目标是通过性能测试的结果与Apache + JBoss进行比较,看看是不是有必要用Nginx替换Apache。目前Nginx+JBoss的方式采用的是pass_proxy的方式。从当前的测试结果来看,性能比Apache+JBoss有不小的提升。今天测试时碰到了一个有趣的问题,在Nginx专家叔度的协助下很快地解决了,也明白Nginx作为Proxy与后端服务交互的原理,是以为记。

今天试图配置JBoss nio(其实就是tomcat6.0中的nio)的模式进行性能测试,修改好Connecter的配置之后发现访问页面非常慢。于是测试通过8080端口直接访问JBoss,发现页面打开很快,因此可以得出问题出在Nginx与Jboss之间。于是找到我厂的Nginx专家帮忙排查,不一会专家就找出了问题的原因,打来电话给我解决。原来在修改Jboss nio配置时默认采用的是HTTP1.1协议,还默认开启了keepalive,而Nginx作为reverse proxy只支持HTTP1.0协议。Nginx在与后端Server交互时,采用HTTP1.0的模式,认为每个连接关闭才算请求完成,而后端server使用了keepalive,所以Nginx一直等到后端的这个keepalive连接关闭才返回给浏览器,所以访问页面非常慢。

问题根源找到了,修改起来就很快了,参照http://tomcat.apache.org/tomcat-6.0-doc/config/http.html文档,将maxKeepAliveRequest=1,关闭keepalive。重启jboss后,问题解决。

一点感想,学习Nginx还是得弄明白其内部处理原理,否则只能悲剧,无奈目前市面上的书多是讲述如何配置,对于这些原理机制所述甚少。

Nginx作为Jboss proxy的配置

最近开始深入了解一下Nginx的使用,因为未来工作中需要用到这个东西。在Mac下直接可以通过Macport进行安装,安装完之后在启动命令在/opt/local/sbin/下,配置文件在/opt/local/etc/nginx/目录下,nginx.conf里面配置的是相对路径,其的root路径是/opt/local。

作为java开发人员,以前熟悉了Apache + mod_jk + Jboss的模式,到了Nginx下自然也希望有类似mod_jk的工具来将请求转发给Jboss. 但是在找叔度要这个模块是,他告诉我可以自己将Nginx作为一个Proxy,以反向代理的方式将请求转给Jboss. 在http://wiki.nginx.org/JavaServers上面有教程,看了一下非常简单。 关键是下面这个配置:

server {
listen              8080;
server_name         10.232.22.174;
location / {
proxy_pass   http://127.0.0.1:8100/;
tcp_nodelay     on;
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;
}
}

server {

listen              8080;

server_name         127.0.0.1;

location / {

proxy_pass   http://127.0.0.1:8080/;

tcp_nodelay     on;

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;

}

}

配置好后以-c filename的方式指定用新的配置文件启动nginx服务器,在启动jboss 就ok了。
这两天看了一些Nginx Wiki的文档,有一些心得。要熟练运用这东西最重要的是熟悉它的配置,以及支持的一些运用模式。这快只能通过看文档,做实验来熟悉。要达到高性能,并做一些调优则需要对于网络,Linux底层有很好的认识。
ps: 今天在配置过程中还发现,如果只是kill 掉 nginx master process,保留 worker process,进程仍然会占用80端口。但是这时候通过 lsof -i:80 查看时会发现没有进程占有80端口。后来twitter上的@chzealot给我解释了一下原因:lsof只能查看fd,端口处于time_wait状态时,fd已经close,但是还需要两个MSL time_wait状态才能消逝。

Ubuntu上安装Nginx

今天在家里的运行Ubuntu 10.04的台式机上装了一下Nginx,没有通过apt-get安装,安装过程中碰到过两个问题,记录一下,以便他人参考。
下载到nginx-0.7.67.tar.gz包后,解压,进入解压后的目录运行./configure,这时会报出一个如下错误:

./configure: error: the HTTP rewrite module requires the PCRE library.

这是因为没有PCRE library的原因所致,通过下面的命令安装相关的lib即可解决。

sudo apt-get install libpcre3 libpcre3-dev

重新./configure,这里可能会出现如下错误:
./configure: error: the HTTP cache module requires md5 functions
from OpenSSL library. You can either disable the module by using
–without-http-cache option, or install the OpenSSL library into the system,
or build the OpenSSL library statically from the source with nginx by using
–with-http_ssl_module –with-openssl=
options.

通过下面的命令安装上OpenSSL解决这个问题:

sudo apt-get install libssl-dev

安装完成之后,再make,sudo make install即可。

在缺少包的时候试图通过aptitude search查找相关的lib,发现这个方法不靠谱。