首页 > 代码库 > Nginx+tomcat配置负载均衡

Nginx+tomcat配置负载均衡

window下对Nginx+tomcat负载均衡做了配置尝试,将全部请求转发到tomcat,并未做静态,动态分开,图片防盗链等配置。

 

 

Nginx 介绍


     Nginx (发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。  其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页伺服器中表现较好.

 

 

 

Window xp环境:Nginx+Tomcat6

1、下载地址

       http://nginx.org/en/download.html,这里我们推荐下载稳定版(stable versions),本文采用nginx-1.0.4。


2、目录结构


      Nginx-

               |_  conf   配置目录

               |_  contrib

               |_  docs 文档目录

               |_  logs  日志目录

               |_  temp 临时文件目录

               |_  html 静态页面目录

               |_  nginx.exe 主程序


      window下安装Nginx极其简单,解压缩到一个无空格的英文目录即可,双击nginx启动,这里我安装到:D:\software\nginx-1.0.4目录,下面涉及到的tomcat也安装在此目录。

 

      在DOS命令下即可启动Nginx:d:  --->  cd d:\software\nginx-1.0.4 ---> start nginx

          如果要对启动的Nginx进程进行控制,也可以使用DOS命令:

          nginx -s [stop | quit | reopen | reload]

 

3、nginx.conf配置


   Nginx配置文件默认在conf目录,主要配置文件为nginx.conf。下面是nginx作为前端反向代理服务器的配置。

 

 

 

Java代码  收藏代码
  1. <span>#使用的用户和组,window下不指定  
  2. #user  www www;  
  3. #指定工作衍生进程数(一般等于CPU总和数或总和数的两倍,例如两个四核CPU,则总和数为8)  
  4. worker_processes  1;  
  5. #指定错误日志文件存放路径,错误日志级别可选项为【debug|info|notice|warn|error|crit】  
  6. #error_log  logs/error.log;  
  7. #error_log  logs/error.log  notice;  
  8. error_log  logs/error.log  info;  
  9. #指定pid存放路径  
  10. pid        logs/nginx.pid;  
  11.   
  12. #工作模式及连接数上限   
  13. events {  
  14.     #使用网络I/O模型,Linux系统推荐使用epoll模型,FreeBSD系统推荐使用kqueue;window下不指定  
  15.     #use epoll;  
  16.     #允许的连接数  
  17.     worker_connections  1024;  
  18. }  
  19.   
  20. #设定http服务器,利用他的反向代理功能提供负载均衡支持   
  21. http {  
  22.     #设定mime类型   
  23.     include       mime.types;  
  24.     default_type  application/octet-stream;  
  25.   
  26.     #设定日志格式   
  27.     #log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘  
  28.     #                  ‘$status $body_bytes_sent "$http_referer" ‘  
  29.     #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;  
  30.   
  31.     log_format main ‘$remote_addr - $remote_user [$time_local]‘     
  32.                                         ‘"$request" $status $bytes_sent‘     
  33.                                         ‘"$http_referer" "$http_user_agent" "$http_x_forwarded_for"‘     
  34.                                         ‘"$gzip_ratio"‘;     
  35.         log_format download ‘$remote_addr - $remote_user [$time_local]‘     
  36.                                         ‘"$request" $status $bytes_sent‘     
  37.                                         ‘"$http_referer" "$http_user_agent"‘     
  38.                                         ‘"$http_range" "$sent_http_content_range"‘;  
  39.       
  40.     #设定请求缓冲     
  41.     client_header_buffer_size 1k;     
  42.     large_client_header_buffers 4 4k;  
  43.       
  44.     #设定access log    
  45.     access_log  logs/access.log  main;  
  46.     client_header_timeout 3m;     
  47.         client_body_timeout 3m;     
  48.         send_timeout 3m;   
  49.   
  50.     sendfile        on;  
  51.     tcp_nopush     on;  
  52.     tcp_nodelay on;    
  53.     #keepalive_timeout  0;  
  54.     keepalive_timeout  65;  
  55.   
  56.     #开启gzip模块   
  57.     gzip  on;  
  58.     gzip_min_length 1100;     
  59.         gzip_buffers 4 8k;     
  60.         gzip_types text/plain application/x-javascript text/css application/xml;    
  61.            
  62.         output_buffers 1 32k;     
  63.         postpone_output 1460;  
  64.       
  65.     server_names_hash_bucket_size 128;    
  66.     client_max_body_size 8m;    
  67.       
  68.     fastcgi_connect_timeout 300;    
  69.     fastcgi_send_timeout 300;    
  70.     fastcgi_read_timeout 300;    
  71.     fastcgi_buffer_size 64k;    
  72.     fastcgi_buffers 4 64k;    
  73.     fastcgi_busy_buffers_size 128k;    
  74.     fastcgi_temp_file_write_size 128k;    
  75.     gzip_http_version 1.1;    
  76.     gzip_comp_level 2;    
  77.     gzip_vary on;   
  78.   
  79.     #设定负载均衡的服务器列表     
  80.         upstream localhost {   
  81.             #根据ip计算将请求分配各那个后端tomcat,许多人误认为可以解决session问题,其实并不能。    
  82.         #同一机器在多网情况下,路由切换,ip可能不同      
  83.             #weigth参数表示权值,权值越高被分配到的几率越大     
  84.             server localhost:8080 weight=1;     
  85.             server localhost:9080 weight=1;     
  86.         }   
  87.   
  88.     #设定虚拟主机  
  89.     server {  
  90.         listen       80;  
  91.         server_name  localhost;  
  92.   
  93.         #koi8-r  
  94.         charset UTF-8;  
  95.   
  96.         #设定本虚拟主机的访问日志  
  97.         access_log  logs/host.access.log  main;  
  98.           
  99.         #假如访问 /img/*, /js/*, /css/* 资源,则直接取本地文档,不通过squid     
  100.         #假如这些文档较多,不推荐这种方式,因为通过squid的缓存效果更好    
  101.         location ~ ^/(img|js|css)/ {     
  102.                     root /data3/Html;     
  103.                     expires 24h;     
  104.                 }   
  105.                   
  106.                 #对 "/" 启用负载均衡  
  107.         location / {  
  108.             root   html;  
  109.             index  index.html index.htm index.jsp;  
  110.               
  111.                         proxy_redirect off;   
  112.                         #保留用户真实信息    
  113.                         proxy_set_header Host $host;     
  114.                         proxy_set_header X-Real-IP $remote_addr;     
  115.                         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;   
  116.                         #允许客户端请求的最大单个文件字节数    
  117.                         client_max_body_size 10m;     
  118.                         #缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户  
  119.                         client_body_buffer_size 128k;     
  120.                         #跟后端服务器连接超时时间 发起握手等候响应超时时间  
  121.                         proxy_connect_timeout 90;  
  122.                         #连接成功后 等待后端服务器响应时间 其实已进入后端的排队之中等候处理   
  123.                         proxy_read_timeout 90;     
  124.                       #后端服务器数据回传时间 就是在规定时间内后端服务器必须传完所有数据     
  125.                         proxy_send_timeout 90;  
  126.                         #代理请求缓存区 这个缓存区间会保存用户的头信息一共Nginx进行规则处理 一般只要能保存下头信息即可  
  127.                         proxy_buffer_size 4k;     
  128.                         #同上 告诉Nginx保存单个用的几个Buffer最大用多大空间  
  129.                         proxy_buffers 4 32k;     
  130.                         #如果系统很忙的时候可以申请国内各大的proxy_buffers 官方推荐 *2  
  131.                         proxy_busy_buffers_size 64k;    
  132.                         #proxy 缓存临时文件的大小   
  133.                         proxy_temp_file_write_size 64k;   
  134.                         proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;  
  135.                         proxy_max_temp_file_size 128m;   
  136.                           
  137.                         proxy_pass http://localhost;  
  138.     
  139.         }  
  140.   
  141.         #设定查看Nginx状态的地址     
  142.                 #location /NginxStatus {     
  143.                 #       stub_status on;     
  144.                 #       access_log on;     
  145.                 #       auth_basic "NginxStatus";     
  146.                 #       auth_basic_user_file conf/htpasswd;     
  147.                 #}     
  148.   
  149.         #error_page  404              /404.html;  
  150.   
  151.         # redirect server error pages to the static page /50x.html  
  152.         #  
  153.           
  154.         error_page   500 502 503 504  /50x.html;  
  155.         location = /50x.html {  
  156.             root   html;  
  157.         }  
  158.   
  159.         # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
  160.         #  
  161.         #location ~ \.php$ {  
  162.         #    proxy_pass   http://127.0.0.1;  
  163.         #}  
  164.   
  165.         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
  166.         #  
  167.         #location ~ \.php$ {  
  168.         #    root           html;  
  169.         #    fastcgi_pass   127.0.0.1:9000;  
  170.         #    fastcgi_index  index.php;  
  171.         #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
  172.         #    include        fastcgi_params;  
  173.         #}  
  174.   
  175.         # deny access to .htaccess files, if Apache‘s document root  
  176.         # concurs with nginx‘s one  
  177.         #  
  178.         #location ~ /\.ht {  
  179.         #    deny  all;  
  180.         #}  
  181.     }  
  182.   
  183.   
  184.     # another virtual host using mix of IP-, name-, and port-based configuration  
  185.     #  
  186.     #server {  
  187.     #    listen       8000;  
  188.     #    listen       somename:8080;  
  189.     #    server_name  somename  alias  another.alias;  
  190.   
  191.     #    location / {  
  192.     #        root   html;  
  193.     #        index  index.html index.htm;  
  194.     #    }  
  195.     #}  
  196.   
  197.   
  198.     # HTTPS server  
  199.     #  
  200.     #server {  
  201.     #    listen       443;  
  202.     #    server_name  localhost;  
  203.   
  204.     #    ssl                  on;  
  205.     #    ssl_certificate      cert.pem;  
  206.     #    ssl_certificate_key  cert.key;  
  207.   
  208.     #    ssl_session_timeout  5m;  
  209.   
  210.     #    ssl_protocols  SSLv2 SSLv3 TLSv1;  
  211.     #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;  
  212.     #    ssl_prefer_server_ciphers   on;  
  213.   
  214.     #    location / {  
  215.     #        root   html;  
  216.     #        index  index.html index.htm;  
  217.     #    }  
  218.     #}  
  219.   
  220. }  
  221. </span>  

 

 

 

  4、Tomcat配置

 

      tomcat的配置依然使用 Apache+tomcat集群配置的中配置。

 

 

5、验证配置与测试负载均衡


    首先测试nginx配置是否正确,测试命令:nginx -t  (默认验证:conf\nginx.conf),也可以指定配置文件路径。

 

    最后验证配置负载均衡设置,http://localhost/或http://localhost/index.jsp。

 

    测试负载均衡 参考 Apache + Tomcat集群配置详解(2)

 

 

至此window下nginx+tomcat负载均衡配置结束,关于tomcat Session的问题通常是采用memcached,或者采用nginx_upstream_jvm_route ,他是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。如果tomcat过多不建议session同步,server间相互同步session很耗资源,高并发环境容易引起Session风暴。请根据自己应用情况合理采纳session解决方案。

 

 

下面几篇不错的文章:

     http://czllfy.iteye.com/blog/510295

     http://www.blogjava.net/Alpha/archive/2011/06/21/352745.html

     http://www.jtben.com/document/4440

     http://tmsoft.lsxy.com/index.php?load=read&id=938

 

张宴的Blog:http://blog.s135.com/nginx_cache/

Nginx+tomcat配置负载均衡