winserver2003下,同一配置,nginx1.3.5代理两个tomcat6.失败,什么原因?

zmingchun 发布于 2012/08/29 07:39
阅读 973
收藏 1
   环境描述:windows server2003操作系统,JSP环境,IIS已经改了监听端口,两个tomcat分别监听8080和8081端口,分别挂了两个网站,每个网站匹配一个域名。
   配置描述:nginx1.3.5解压在D盘根目录,tomcat6.0(绿色版)一个在D盘根目录,另外一个在E盘根目录,网站在相应的tomcat的webapps下。
   问题描述:一开始使用apache代理两个tomcat,可以通过域名正常访问两个对应的网站,后来apache一直抛以下错误:
[Tue Aug 14 10:42:51 2012] [warn] Server ran out of threads to serve requests. Consider raising the ThreadsPerChild setting
[Tue Aug 14 10:43:45 2012] [warn] (OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.
[Tue Aug 14 10:43:59 2012] [warn] (OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.
[Tue Aug 14 10:43:59 2012] [warn] (OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.
[Tue Aug 14 10:44:00 2012] [warn] (OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.
[Tue Aug 14 10:44:02 2012] [warn] (OS 64)指定的网络名不再可用。  : winnt_accept: Asynchronous AcceptEx failed.
[Wed Aug 15 07:33:56 2012] [notice] Child 2088: Waiting 270 more seconds for 4 worker threads to finish.
[Wed Aug 15 07:34:53 2012] [notice] Child 2088: Waiting 240 more seconds for 4 worker threads to finish.

因水平不够折腾了好几天未果。解决问题过程中,发现了nginx,惊闻它的各种强大,遂转向nginx。
    用 nginx1.3.5代理两个tomcat6.0(分别挂了一个网站,一个网站对应一个域名),一开始配置可以正常代理,没有作session同步。某一天操作系统更新重启后,代理失效——通过域名访问长期没反应(也不报错),改为直接访问tomcat却很顺畅。检查发现nginx启动了三个进程,监听80端口(没有其他进程占用80端口),nginx日志没有报错信息,正常启动—— 为啥nginx突然不能用了呢? 
   以下为nginx的配置:
worker_processes  2;

error_log  logs/error.log crit;

worker_rlimit_nofile 65535;

events {
    worker_connections  65535;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #access_log  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
	tcp_nodelay on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

	server_names_hash_bucket_size 128;
	client_header_buffer_size 32k;
	large_client_header_buffers 4 32k;
	client_max_body_size 300m;
	client_body_buffer_size 512k;
	

	# 代理的相关参数设置
	 proxy_connect_timeout 5;
	 proxy_read_timeout 60;
	 proxy_send_timeout 5;
	 proxy_buffer_size 16k;
	 proxy_buffers 4 64k;
	 proxy_busy_buffers_size 128k;
	 proxy_temp_file_write_size 128k;
	 
	 # 启用gzip压缩
	 gzip on;
	 gzip_min_length 1k;
	 gzip_buffers 4 16k;
	 gzip_http_version 1.1;
	 gzip_comp_level 2;
	 gzip_types text/plain application/x-javascript text/css application/xml;
	 gzip_vary on;

	 # 配置需要代理的tomcat
	upstream tomcat_fortest1 {
		server 127.0.0.1:8081;
	 }

	upstream tomcat_fortest2 {
		server 127.0.0.1:8080;
	 }
	 
    # 配置虚拟主机: www.fortest1.cn
	server {
		 listen 80;
		 server_name www.fortest1.cn;
		 index index.html index.htm index.jsp index.do default.jsp default.do login.jsp;
		 root D:/tomcat6/webapps/ROOT;

		if (-d $request_filename){
			rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
		 }

		# 动态页面,交给tomcat处理
		location ~ \.(jsp|jspx|do|action|servlet)?$ {
			 proxy_set_header Host $host;
			 proxy_set_header X-Forwarded-For $remote_addr;
			 proxy_pass http://tomcat_fortest1;
		 }

		# 用户浏览器端的缓存设置
		location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
			expires 10d;
		 }

		location ~ .*\.(js|css)?$ {
			expires 1h;
		 }

		access_log off;
	 }

	#虚拟主机:www.fortest2.cn
	server {
		 listen 80;
		 server_name www.fortest2.cn;
		 index index.html index.htm index.jsp index.do default.jsp default.do login.jsp;
		 root F:/tomcat6/webapps/ROOT;

		if (-d $request_filename){
			rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
		}

		location ~ \.(jsp|jspx|do|action|servlet)?$ {
			 proxy_redirect off;
			 proxy_set_header Host $host;
			 proxy_set_header X-Forwarded-For $remote_addr;
			 proxy_pass http://tomcat_fortest2;
		}

		location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
			expires 10d;
		}

		location ~ .*\.(js|css)?$ {
			expires 1h;
		}

		access_log off;
	 }

}


加载中
0
红薯
红薯

这个故障现象描述能否再详细点,现在只说了不能访问,没有具体的现象

可从下面几个点着手:

1. nginx 上放置静态文件,直接访问此静态文件检查 nginx 本身有无问题
2. 既然 tomcat 已无问题,如果上一步也没问题,那问题就处在proxy的配置上
3. 你说的通过域名访问是怎么回事?直接 IP 访问呢?

0
zmingchun
zmingchun

引用来自“红薯”的答案

这个故障现象描述能否再详细点,现在只说了不能访问,没有具体的现象

可从下面几个点着手:

1. nginx 上放置静态文件,直接访问此静态文件检查 nginx 本身有无问题
2. 既然 tomcat 已无问题,如果上一步也没问题,那问题就处在proxy的配置上
3. 你说的通过域名访问是怎么回事?直接 IP 访问呢?

嗯,刚在补充描述,原文已经贴出配置。

1.nginx本身是没问题的,配置代理后,一开始是正常代理的,后来系统更新重启后,直接访问域名是没有反应的。

2.通过域名访问,是这种方式:www.fortest1.cn访问。

0
红薯
红薯
另外你描述的 “Nginx突然不能用了”,你的意思是,nginx 一开始是好的,然后访问了一阵子就不能用了吗?
zmingchun
zmingchun
嗯,一开始是可以正常使用的
0
红薯
红薯
另外从这个配置上你并没有将 http://www.fortest1.cn/ 这样的请求 proxy 到 tomcat 上,只是将 *.jsp/*.do/*.jspx 等请求 proxy 到 tomcat
zmingchun
zmingchun
或者说,我应该怎么调整现在的配置,才能将http://www.fortest1.cn这样的请求proxy给tomcat呢?
zmingchun
zmingchun
server部分不是已经将域名proxy到tomcat去了嘛?我也许理解错了,能详细说明下嘛?
0
红薯
红薯

你参考下 oschina 的配置:http://www.oschina.net/code/snippet_12_175

首先是静态文件不走 proxy,除此之外所有请求都 proxy 给 tomcat

zmingchun
zmingchun
@红薯 (⊙o⊙),别见怪哈,我是一知半解,就怕还有其他不同的地方,谢谢您了,我参照下您的配置再改下
红薯
红薯
回复 @zmingchun : 好吧,如果较真的话,那算是吧
zmingchun
zmingchun
@红薯 但windows下是没有epoll这些功能的呀
红薯
红薯
回复 @zmingchun : nginx 在不同环境下配置是一致的
zmingchun
zmingchun
好的,我去研究下。对了,您这个是什么环境下的?linux?
0
笨蛋EGG
笨蛋EGG
Windows下还是iis比较给力···
0
bingl
bingl

楼主,似乎你nginx 可以不用这样配置,多余了很多。

zmingchun
zmingchun
多余了很多?怎么说?
返回顶部
顶部