/ 中存储网

Nginx和tomcat配置负载均衡过程记录

2014-04-02 15:53:01 来源:itjs.cn
目标:nginx做为静态文件服务器,tomcat做为动态文件服务器;同时nginx做为反向代理,把动态文件请求转发给后台tomcat集群; nginx 与 tomcat 安装不再说明。

1.配置静态文件服务

把web应用的 图片、html、js、css、swf 等静态文件拷贝到nginx的 document root 目录下,在下面的例子中该目录为“/home/opsadmin/html”;

nginx.conf文件配置如下:

=======================================================================

location / {

index  index.html index.htm;

root /home/opsadmin/html;

}

=======================================================================

上面的配置写在 server 环境下,server中的其它内容此处省略。

重启nginx测试配置是否成功。

2.配置静态文件的缓存时间

nginx.conf文件配置如下:

=======================================================================

location ~* .(jpg|gif|png|bmp|swf)$ {

expires  10d;

}

location ~* .(js|css)$ {

expires  1d;

}

=======================================================================

~ 表示使用正则表达式匹配,*表示不区分大小写

3.反向代理配置

=======================================================================

    #允许客户端请求的最大单个文件字节数

    client_max_body_size        10m;

    #缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户

    client_body_buffer_size        128k;

    #跟后端服务器连接的超时时间发起握手等候响应超时时间

    proxy_connect_timeout        90;

    #连接成功后等候后端服务器响应时间其实已经进入后端的排队之中等候处理

    proxy_send_timeout        90;

    #后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有的数据

    proxy_read_timeout        90;

    #代理请求缓存区一这个缓存区间会保存用户的头信息以供Nginx进行规则处理-一般只要能保存下头信息即可

    proxy_buffer_size        4k;

    #同上告诉Nginx保存单个用的几个Buffer最大用多大空间

    proxy_buffers            4 32k;

    #如果系统很忙的时候可以申请更大的proxy buffers官方推荐*2

    proxy_busy_buffers_size        64k;

    #proxy缓存临时文件的大小

    proxy_temp_file_write_size    64k;

    upstream server1 {

        server 192.168.1.105:8080;

    }

    server{

        location  ~ .do$ {

            index index.do;

proxy_pass  http://server1;

        }

    }

=======================================================================

    上面的配置是写在 http 环境。

    注意 upstream 项,nginx可配置多个反向代理,在proxy_pass属性中使用反向代理配置;在上例中  “proxy_pass http://server1” 的server1即为 upstream 配置的server1;

 这里后台tomcat只有一个(192.168.1.105:8080),可以配置多个,反向代理的其它配置这里不再介绍。

4.把动态文件请求转发到tomcat

即上例中的  location ~ .do$ {} 配置;

这里后台tomcat中部署的应用使用了spring开发,请求都是.do结尾;可以根据需要修把上例改成 .action 或 .jsp 等。

完成上述配置后,目标就已经初步完成了,还剩下一些细节调整,由于每个人的程序都不一样,需要根据自己的情况进行调整,下面给出一些常用配置:

1.java程序获取客户端真实IP:

用户的请求数据通过nginx转发后,使用request.getRemoteAddr()只能获取nginx的IP地址,需要在nginx.conf中增加以下配置

========================================================================

proxy_set_header  Host  $host;

proxy_set_header X-Real-IP  $remote_addr;

========================================================================

Host为用户访问的域名,X-Real-IP 为用户的真实IP,上面的配置可以写在 http、server、location 环境中。

然后在java代码中,使用request.getHeader("Host")就可以获取域名,request.getHeader("X-Real-IP")可以获取用户真实IP。

2.jsession后缀处理

当jsp中使用<c:url />标签时,会自动增加;jsession=..的URL后缀,如果不进行处理,linux环境下nginx会把后缀当成文件名的一部分,导致找不要需要的文件(windows下没测试过);

增加配置如下:

========================================================================

rewrite ^(.*);jsessionid=(.*)$  $1   break;

========================================================================

可写在server、location环境下,该配置的作用为删除 ;jsessionid=.. 的URL后缀

3.目录名自动增加 / 与 java代码控制浏览器跳转

有时会有这一种应用场景,用户通过一个url请求一个目录,tomcat会把该目录的welcome-page返回给用户(如:index.jsp),在index.jsp中正好有 response.sendRedirect("test.do") 这种控制浏览器跳转的代码;

此时用户请求目录名时(假设为http://server1/test) 就会请求到 http://server1/test/index.jsp 然后浏览器就会跳转到 http://192.168.1.105:8080/test/test.do。

因为该跳转语句 response.sendRedirect("pc.do") 是由tomcat处理,所以只会返回tomcat中的文件。

一般情况,这样的跳转在项目中要尽量少地出现,对该情况做特殊处理即可,先说目录名自动增加 / :

========================================================================

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

========================================================================

上述配置可写在 server环境 中。

然后再增加配置:

========================================================================

location = /test/ {

proxy_pass  http://server1/test/test.do;

}

========================================================================

当nginx接收到 /test 的请求后,直接转发给目标URL,不再让tomcat控制用户浏览器跳转;

4.gzip压缩

使用gzip对 txt、html、css、js 等文本进行压缩;nignx默认对html格式压缩。

========================================================================

gzip                on;

#    gzip_min_length     1000;

gzip_types          text/plain application/xml text/javascript text/css application/x-javascript application/javascript;

#    gzip_disable        msie6;

gzip_comp_level     5;

========================================================================

需要写在 http 环境下。

这里只说明一下 gzip_types属性,其它的属性不再做过多说明。

对于js文件,应该是 text/javascript 格式,但是本人配置后不起作用。。

使用 Fiddler 分析后,发现js文件还可以是 application/x-javascript 、 application/javascrip ,增加这两项后实现对js文件的压缩传输。