Nginx+Tomcat 负载均衡集群方案

Nginx+Tomcat 负载均衡集群方案
该方案是我之前做过的一个项目生产应用的,目前运行良好,如何您生产使用,请先做好测试。

转载:http://www.unixhot.com/wiki/doku.php?id=nginx_tomcat

系统架构图
Nginx+Tomcat 负载均衡集群方案_第1张图片

下载软件包

" ][root@Nginx-node1 src]# cd /usr/local/src [root@Nginx-node1 src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.02.tar.gz [root@Nginx-node1 src]# wget http://nginx.org/download/nginx-0.8.34.tar.gz [root@Nginx-node1 src]# wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz [root@Nginx-node1 src]# chmod +x * [root@Nginx-node1 src]# ls -l -rwxr-xr-x 1 root root 241437 10-01 17:25 keepalived-1.1.19.tar.gz -rwxr-xr-x 1 root root 621534 03-04 01:00 nginx-0.8.34.tar.gz -rwxr-xr-x 1 root root 1247730 03-31 16:31 pcre-8.02.tar.gz
1
2
3
4
5
6
7
8
9
" ] [ root @ Nginx - node1 src ] # cd /usr/local/src
[ root @ Nginx - node1 src ] # wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.02.tar.gz
[ root @ Nginx - node1 src ] # wget http://nginx.org/download/nginx-0.8.34.tar.gz
[ root @ Nginx - node1 src ] # wget http://www.keepalived.org/software/keepalived-1.1.19.tar.gz
[ root @ Nginx - node1 src ] # chmod +x *
[ root @ Nginx - node1 src ] # ls -l
- rwxr - xr - x 1 root root    241437 10 - 01 17 : 25 keepalived - 1.1.19.tar.gz
- rwxr - xr - x 1 root root    621534 03 - 04 01 : 00 nginx - 0.8.34.tar.gz
- rwxr - xr - x 1 root root 1247730 03 - 31 16 : 31 pcre - 8.02.tar.gz

安装Nginx
安装Nginx依赖的包

" ][root@Nginx-node1 src]# tar zxvf pcre-8.02.tar.gz [root@Nginx-node1 src]# cd pcre-8.02 [root@Nginx-node1 pcre-8.02]# ./configure [root@Nginx-node1 pcre-8.02]# make && make install
1
2
3
4
" ] [ root @ Nginx - node1 src ] # tar zxvf pcre-8.02.tar.gz
[ root @ Nginx - node1 src ] # cd pcre-8.02
[ root @ Nginx - node1 pcre - 8.02 ] # ./configure
[ root @ Nginx - node1 pcre - 8.02 ] # make && make install

安装Nginx

" ][root@Nginx-node1 pcre-8.02]# cd ../ [root@Nginx-node1 src]# tar zxvf nginx-0.8.34.tar.gz [root@Nginx-node1 src]# cd nginx-0.8.34 [root@Nginx-node1 nginx-0.8.34]# ./configure --prefix=/usr/local/nginx \ > --with-http_stub_status_module \ > --with-http_ssl_module [root@Nginx-node1 nginx-0.8.34]# make && make install [root@Nginx-node1 ~]# vim /usr/local/nginx/conf/nginx.conf
1
2
3
4
5
6
7
8
" ] [ root @ Nginx - node1 pcre - 8.02 ] # cd ../
[ root @ Nginx - node1 src ] # tar zxvf nginx-0.8.34.tar.gz
[ root @ Nginx - node1 src ] # cd nginx-0.8.34
[ root @ Nginx - node1 nginx - 0.8.34 ] # ./configure --prefix=/usr/local/nginx \
& gt ; -- with - http_stub_status _module \
& gt ; -- with - http_ssl _module
[ root @ Nginx - node1 nginx - 0.8.34 ] # make && make install
[ root @ Nginx - node1 ~ ] # vim /usr/local/nginx/conf/nginx.conf

Nginx 配置文件

" ]user website website; worker_processes 4; error_log logs/error.log; pid logs/nginx.pid; worker_rlimit_nofile 65535; events { use epoll; worker_connections 10240; } http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; server_tokens off; upstream web #设置web集群池 { ip_hash; # server 192.168.0.141:8080; server 192.168.0.142:8080; server 192.168.0.143:8080; server 192.168.0.144:8080; server 192.168.0.145:8080; server 192.168.0.146:8080; } upstream wap #设置wap集群池 { ip_hash; server 192.168.0.151:8080; server 192.168.0.152:8080; server 192.168.0.153:8080; server 192.168.0.154:8080; server 192.168.0.155:8080; server 192.168.0.156:8080; } server { listen 80; server_name www.***.com; location / { root html; index index.html index.htm; 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; proxy_pass http://web; #注意设置在这里 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 80; server_name wap.***.com; location / { root html; index index.html index.htm; 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; proxy_pass http://wap; #注意:设置在这里 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
" ] user   website website ;
worker _processes    4 ;
 
error_log   logs / error .log ;
pid         logs / nginx .pid ;
worker_rlimit _nofile 65535 ;
 
events {
     use epoll ;
     worker _connections    10240 ;
}
http {
     include       mime .types ;
     default_type   application / octet - stream ;
     server_names_hash_bucket _size 128 ;
     client_header_buffer _size 32k ;
     large_client_header _buffers 4 32k ;
     client_max_body _size 8m ;
     sendfile on ;
     tcp_nopush     on ;
     keepalive _timeout 60 ;
     tcp_nodelay on ;
 
     gzip on ;
     gzip_min _length    1k ;
     gzip _buffers      4 16k ;
     gzip_http _version 1.0 ;
     gzip_comp _level 2 ;
     gzip_types       text / plain application / x - javascript text / css application / xml ;
     gzip_vary on ;
 
     server_tokens off ;
 
upstream web    #设置web集群池
{
ip_hash ; #
server 192.168.0.141 : 8080 ;
server 192.168.0.142 : 8080 ;
server 192.168.0.143 : 8080 ;
server 192.168.0.144 : 8080 ;
server 192.168.0.145 : 8080 ;
server 192.168.0.146 : 8080 ;
 
}
 
upstream wap    #设置wap集群池
{
ip_hash ;
server 192.168.0.151 : 8080 ;
server 192.168.0.152 : 8080 ;
server 192.168.0.153 : 8080 ;
server 192.168.0.154 : 8080 ;
server 192.168.0.155 : 8080 ;
server 192.168.0.156 : 8080 ;
 
}
 
     server {
         listen        80 ;
         server_name   www . * * * .com ;
 
         location / {
             root   html ;
             index   index .html index .htm ;
     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 ;
     proxy_pass http : / / web ;    #注意设置在这里
         }
 
         error _page    500 502 503 504    / 50x.html ;
         location = / 50x.html {
             root   html ;
         }
 
     }
 
server {
         listen        80 ;
       server_name   wap . * * * .com ;
 
         location / {
             root   html ;
             index   index .html index .htm ;
             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 ;
             proxy_pass http : / / wap ;    #注意:设置在这里
         }
         error _page    500 502 503 504    / 50x.html ;
         location = / 50x.html {
             root   html ;
         }
 
     }
}

Nginx Upstream支持的分配方法
nginx的upstream目前支持5种方式的分配

*1.轮询(默认

  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
*2.weight (带权重的)

  指定轮询权重,weight和访问比率成正比,用于后端服务器性能不均的情况。

  例如:

" ]upstream bakend { server 192.168.0.141 weight=10; server 192.168.0.142 weight=10; }
1
2
3
4
" ] upstream bakend {
server 192.168.0.141 weight = 10 ;
server 192.168.0.142 weight = 10 ;
}

*3.ip_hash

  每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

  例如:

" ]upstream bakend { ip_hash; server 192.168.0.151:80; server 192.168.0.152:80; }
1
2
3
4
5
" ] upstream bakend {
ip_hash ;
server 192.168.0.151 : 80 ;
server 192.168.0.152 : 80 ;
}

*4.fair(第三方)

  按后端服务器的响应时间来分配请求,响应时间短的优先分配。

" ]upstream backend { server server1; server server2; fair; }
1
2
3
4
5
" ] upstream backend {
server server1 ;
server server2 ;
fair ;
}

*5.url_hash(第三方)

  按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

  例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

" ]upstream backend { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
1
2
3
4
5
6
" ] upstream backend {
server squid1 : 3128 ;
server squid2 : 3128 ;
hash $request_uri ;
hash_method crc32 ;
}

  
*设置说明:

  每个设备的状态设置为:

  1.down 表示单前的server暂时不参与负载

  2.weight 默认为1.weight越大,负载的权重就越大。

  3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误

  4.fail_timeout:max_fails次失败后,暂停的时间。

  5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

  nginx支持同时设置多组的负载均衡,用来给不用的server来使用。

  client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug

  client_body_temp_path 设置记录文件的目录 可以设置最多3层目录

  location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡

相关文章:

  1. [转]Nginx Location 指令基础
  2. Nginx 日志配置
  3. Nginx 访问控制
  4. ngx_cache_purge介绍
  5. Linux文件句柄数导致php-cgi假死的解决方案之一
  6. HAProxy 负载均衡
  7. nginx upstream 的几种分配方式
  8. nginx构建高性能web站点

你可能感兴趣的:(Nginx+Tomcat 负载均衡集群方案)