nginx+tomcat 配置了动静分离,为什么我在tomcat中配置的Filter还是能否拦截到静态文件访问?

山哥 发布于 2011/08/08 11:20
阅读 8K+
收藏 4

上周,成功配置了nginx+tomcat,根据红薯大哥提供的 oschina nginx 的配置,配置了动静分离,所有 htm,html, png,jpg,gif等静态文件全部由 nginx负载处理,今天我为了测试静态文件是否真的由nginx 处理,而不转发到tomcat处理,我在 tomcat 的web.xml中配置了一个拦截器 Filter,然后在拦截器中 打印 requestURI,结果发现,页面上请求的js,css,图片等静态文件还是被拦截到了。 

按照nginx的动静分离,理论上js,css,图片等静态文件不应该会被tomcat的Filter拦截到的,请教大家是什么原因? 下面是我的nginx配置:

nginx 1.0.5(windows版) + tomcat 6.0.32

#user  nobody;
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    #use epoll;
    worker_connections  1024;
}


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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    include gzip.conf;
		
    upstream oa_servers{
	#ip_hash
	server 10.0.24.58:8080;
	#server 10.0.24.58:9091	
    }
		
    server {
        listen       8082;
        server_name  localhost;

        location / {
          #rewrite (.*) http://www.oschina.net$1 permanent; 
	  deny all;
        }

        location ~ ^/NginxStatus {
            stub_status on;
            access_log off;
            allow   127.0.0.1;
            deny    all;
        }

    }

    server {
	listen 8082;
	server_name 10.0.24.58;

        log_format  oa_log
        '$remote_addr - $remote_user [$time_local] $request '
        '"$status" $body_bytes_sent "$http_referer" '
        '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  logs/oa.log;

	location ~ ^/NginxStatus {
            stub_status on;
            access_log off;
            auth_basic           "nginxstatus";
            auth_basic_user_file  htpasswd;
        }
        
	location ~ ^/(WEB-INF)/ {
            deny all;
        }

        location ~ \.(htm|html|gif|jpg|jpeg|png|ico|rar|css|js|zip|txt|flv|swf|doc|ppt|xls|pdf)$ {
            root G:/projects/oa/resources;
	    access_log off;
            expires 24h;
        }

	location / {
	    proxy_pass http://oa_servers;
	    include proxy.conf;
	}

        #error_page 502 503 /502.html;
        #error_page 404 /404.html;
	#error_page 403 /403.html;
    }
}
proxy.conf 和oschina一样:

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   300;
proxy_send_timeout      300;
proxy_read_timeout      300;
proxy_buffer_size       4k;
proxy_buffers           4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
gzip.conf 和 oschina 一样:

gzip  			on;
gzip_min_length  	1000;
gzip_types 		text/plain text/css application/x-javascript; 

加载中
0
红薯
红薯
配置没问题哦
山哥
山哥
是啊,红薯大哥,很是奇怪,使用firebug看请求的HTTP,发现 server:nginx 都是 nginx,包括.jsp等动态URL。 里面上静待文件的server因该是nginx, jsp等动态URL应该是tomcat的。
0
山哥
山哥

由于,我的这个项目中所有的url引入前面都加了 <%=request.getContextPath() %>,比如:

<img src="<%=request.getContextPath() %>/images/icon/add.gif"/>

<srcipt src="<%=request.getContextPath() %>/js/jquery.js"></script>

但是nginx.conf中 

location ~ \.(htm|html|gif|jpg|jpeg|png|ico|rar|css|js|zip|txt|flv|swf|doc|ppt|xls|pdf)$ {
      root G:/projects/oa/resources;

 }
不适合过滤 <%=request.getContextPath() %> 开头的静态文件?

如果我想配置一个 location 表示所有以 <%=request.getContextPath() %> 开头下面的静态文件,这个 location 正则该如何写?

0
红薯
红薯
location 配置的是指以指定扩展名结束的请求,是没错的
0
山哥
山哥

是的,红薯大哥; 但是location 能否配置过滤某个目录下的静态文件,比如:

location ~* /oa/...\.(jpg|png|....)$ {

}

0
ryanzl
ryanzl
 root G:/projects/oa/resources;   你的这里应该是用单引号括起来吧
0
胡晋
胡晋

引用来自“JSON”的答案

由于,我的这个项目中所有的url引入前面都加了 <%=request.getContextPath() %>,比如:

<img src="<%=request.getContextPath() %>/images/icon/add.gif"/>

<srcipt src="<%=request.getContextPath() %>/js/jquery.js"></script>

但是nginx.conf中 

location ~ \.(htm|html|gif|jpg|jpeg|png|ico|rar|css|js|zip|txt|flv|swf|doc|ppt|xls|pdf)$ {
      root G:/projects/oa/resources;

 }
不适合过滤 <%=request.getContextPath() %> 开头的静态文件?

如果我想配置一个 location 表示所有以 <%=request.getContextPath() %> 开头下面的静态文件,这个 location 正则该如何写?

深夜发现个问题..你nginx的监听端口是8082....而你用 <%=request.getContextPath() %>是80端口...你tomcat监听的是80端口...当然...不行了!
返回顶部
顶部