java web开发总结(三):linux下超越apache + tomcat的 nginx + tomcat负载均衡配置

关于nginx,不了解的请先阅读这里: http://wiki.nginx.org/Main,中文文档: http://wiki.nginx.org/NginxChs
这是最近比较流行的一个轻量级的web server,在我的同机压力测试实验中,响应能力是apache的3倍以上。功能比apache简单,小巧,最大并发连接能到3万。

对于nginx的使用,我也是近期才开始,使用的目的是在不增加硬件的条件下提升服务响应能力,以下配置适用环境:
linux + nginx0.7.64+ tomcat6

nginx同时是一个很强的反向代理server,可以用来跟tomcat做负载均衡集群,而且配置很简单,不过有个需要注意的地方:目前nginx跟后端server使用http1.0协议,不能keepalive,只能每次重新打开连接。需要关闭后端的keepalive,否则会产生大量后端的timewait状态的socket连接。

1 nginx代理tomcat关键配置代码如下:
server {
    listen          80;
    server_name     YOUR_DOMAIN;
    root            /PATH/TO/YOUR/WEB/APPLICATION;
    location / {
      index.jsp;
    }
    location ~ ^/WEB-INF/* {#禁止访问被保护的目录
      deny all;
    }  
    location ~ \.do$ {
      proxy_pass              http://localhost:8080;#转发给tomcat端口,也可以是任何server。
      proxy_set_header        X-Real-IP $remote_addr;#转发客户端真实IP
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        Host $http_host;
    }                                                                                                       
   location ~ \.jsp$ {
      proxy_pass              http://localhost:8080;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        Host $http_host;
    }
    location ~ ^/servlet/* {
      proxy_pass              http://localhost:8080;
      proxy_set_header        X-Real-IP $remote_addr;
      proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header        Host $http_host;
    }
  }


2 nginx负载均衡核心配置代码:
http {
    upstream myproject {
      server 127.0.0.1:8000 weight=3;
      server 127.0.0.1:8001;
      server 127.0.0.1:8002;   
      server 127.0.0.1:8003;
    }
   server {
      listen 80;
      server_name www.domain.com;
      location / {
        proxy_pass http://myproject;#myproject 前面要加http://,否则异常
      }
    }
  }


3 nginx+tomcat负载均衡简单配置:不用修改任何tomcat配置,只要tomcat开启http1.1协议端口(tomcat默认开启)
http {
    upstream myproject {
      server 127.0.0.1:8000 weight=3;
      server 127.0.0.1:8001;
      server 127.0.0.1:8002;   
      server 127.0.0.1:8003;
    }
   server {
      listen 80;
      server_name www.domain.com;
      root /PATH/TO/YOUR/WEB/APPLICATION;
      location / {
        index.jsp;
       }
      location ~ ^/WEB-INF/* {#禁止访问被保护的目录
           deny all;
       } 
     location ~ \.do$ {
        proxy_pass              http://myproject;#转发给tomcat端口,也可以是任何server。
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host $http_host;
      }                                                                                                      
     location ~ \.jsp$ {
        proxy_pass              http://myproject;#myproject可以任意自定义,但是一定要在前面加http://
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host $http_host;
      } 
     location ~ ^/servlets/* {
        proxy_pass              http://myproject;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        Host $http_host;
      }
    }
  }


4 实际环境复杂配置:tomcat动态负载均衡 + 静态文件
worker_processes  8;
  worker_rlimit_nofile 65535;
  events {
      use epoll;#开启epoll模式
      worker_connections  65535;
  }
 http {
      include        mime.types;
      default_type  application/octet-stream;
  
     #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
     #                 '$status $body_bytes_sent "$http_referer" '
     #                 '"$http_user_agent" "$http_x_forwarded_for"';
     #access_log  logs/access.log  main;

     sendfile        on;#linux下强大的静态文件发送功能,一定要开启
     tcp_nopush     on;
     tcp_nodelay on;

     #keepalive_timeout  0;
     keepalive_timeout  5;
     keepalive_requests 10;
     server_names_hash_bucket_size 128; 

     client_header_timeout  10;
     client_body_timeout    10;
     send_timeout           10;

     client_header_buffer_size    1k;
     large_client_header_buffers  4 4k;
     client_max_body_size 8m; 

     gzip on;#开启gzip,节省带宽
     gzip_min_length  1100;
     gzip_buffers     4 8k;
     gzip_types        text/xml; 

     output_buffers   1 32k;
     postpone_output  1460;

     limit_rate_after 3m;#限速模块,前3M下载时不限速
     limit_rate 512k; #限速模块

     upstream  statproxy  {#负载均衡模块,核心配置
        server   127.0.0.1:8080;
        server   127.0.0.1:8180;
    }

    server {#纯静态文件访问
         listen        80;
         server_name  a.udomain.com;
         index index.html index.php;
         root  /PATH/TO/YOUR/WEB/APPLICATIONA;
         #charset koi8-r;
         #access_log  logs/host.access.log  main;
         #error_page  404              /404.html;
         # redirect server error pages to the static page /50x.html
         #
         error_page   500 502 503 504  /50x.html;

         location = /50x.html {
            root   html;
         }

         location ~ ^/server-status/ {#服务器状态监控,可以通过:http://a.udomain.com/server-status/访问,需要在编译安装是添加此模块,默认不带。
             stub_status on;
             access_log off;
         }
     }

     server {#动态负载均衡 + 动态静态分离
         listen        80;
         server_name  b.udomain.com;
         index index.html index.php;
         root  /PATH/TO/YOUR/WEB/APPLICATIONB;
         error_page   500 502 503 504  /50x.html;
         location ~ ^/WEB-INF/* {#禁止访问被保护的目录
             deny all;
         }
         location ~ \.do$ {
             proxy_pass              http://statproxy;#经负载均衡模块转发
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
             }

         location ~ \.jsp$ {
             proxy_pass              http://statproxy;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
         }

         location ~ ^/servlet/* {
             proxy_pass              http://statproxy;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
         } 
     }

     server {#动态无负载均衡+静态访问
        listen        80;
         server_name  c.udomain.com;
         index index.html index.php;
         root  /PATH/TO/YOUR/WEB/APPLICATIONC;
         #charset koi8-r;
         #access_log  logs/host.access.log  main;
         #error_page  404              /404.html;
         # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }

         location ~ ^/WEB-INF/* {#禁止访问被保护的目录
            deny all;
         } 

         location ~ \.jsp$ {
             proxy_pass              http://localhost:8280;#直接转发
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
         }

         location ~ \.do$ {
             proxy_pass              http://localhost:8280;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
         }

         location ~ ^/servlet/* {
             proxy_pass              http://localhost:8280;
             proxy_set_header        X-Real-IP $remote_addr;
             proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header        Host $http_host;
         }
     }
 }


5 tomcat端配置:
默认开启http1.1协议即可。建议使用NIO连接器。关于NIO,可以参考tomcat官方文档: http://tomcat.apache.org/tomcat-6.0-doc/config/http.html

注意问题:
nginx+tomcat下:
request.getRemoteAddr()会取不到正确的ip地址的,但是
proxy_set_header        X-Real-IP $remote_addr;
这个配置把正确的ip地址放在了header里了,可以通过:
String ip = request.getHeader("X-Real-IP");
获取到正确的用户ip地址,当然这样会需要修改程序,的确不是个好的办法,不能适用所有场景。

参考文档:
nginx文档: http://wiki.nginx.org/Main,中文文档: http://wiki.nginx.org/NginxChs
nginx+tomcat配置示例: http://wiki.nginx.org/NginxJavaServers
nginx负载均衡配置示例: http://wiki.nginx.org/NginxLoadBalanceExample
tomcat nio配置参数文档: http://tomcat.apache.org/tomcat-6.0-doc/config/http.html

你可能感兴趣的:(apache,tomcat,Web,linux,nginx)