Nginx使用upstream模块实现tomcat负载均衡

UPSTREAM负载均衡模块

负载均衡模块用于从”upstream”指令定义的后端主机列表中选取一台主机。nginx先使用负载均衡模块找到一台主机,再使用upstream模块实现与这台主机的交互。为了方便介绍负载均衡模块,做到言之有物,以下选取nginx内置的ip hash模块作为实际例子进行分析。

配置

要了解负载均衡模块的开发方法,首先需要了解负载均衡模块的使用方法。因为负载均衡模块与之前书中提到的模块差别比较大,所以我们从配置入手比较容易理解。

在配置文件中,我们如果需要使用ip hash的负载均衡算法。我们需要写一个类似下面的配置:

upstream test {
    ip_hash;
    server 127.0.0.1:8081;
    server127.0.0.1:8082;
 }

从配置我们可以看出负载均衡模块的使用场景:

1. 核心指令”ip_hash”只能在upstream {}中使用。这条指令用于通知nginx使用ip hash负载均衡算法。如果没加这条指令,nginx会使用默认的round robin负载均衡模块。请各位读者对比handler模块的配置,是不是有共同点?

2. upstream {}中的指令可能出现在”server”指令前,可能出现在”server”指令后,也可能出现在两条”server”指令之间。

那么尝试下面这个配置

upstream test {
    server 127.0.0.1:8081 weight=5; 
    ip_hash; 
    server 127.0.0.1:8082 weight=7; 
}

神奇的事情出现了:

nginx: [emerg] invalid parameter "weight=7" in nginx.conf:103
configuration file nginx.conf test failed

可见ip_hash指令的确能影响到配置的解析。

Nginx的upstream支持5种分配方式

其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:

1、轮询

轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。

upstream backend {
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
}

2、weight  

轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。

upstream backend {
server 127.0.0.1:8881 weight=10;
server 127.0.0.1:8882 weight=9;
server 127.0.0.1:8883 weight=8;
}

3、ip_hash  

每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。

upstream backend {
ip_hash;
server 127.0.0.1:8881 weight=10;
server 127.0.0.1:8882 weight=9;
server 127.0.0.1:8883 weight=8;
}

4、fair

fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。

upstream backend {
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
fair;
}

5、url_hash

与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。

upstream backend {
server 127.0.0.1:8881;
server 127.0.0.1:8882;
server 127.0.0.1:8883;
hash_method crc32;
}

其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。

关于,如何在负载均衡中使用upstream请参看这里。

下面是一段配置好的conf代码:

underscores_in_headers on;
upstream tomcat_web{
ip_hash;
server localhost:8081 weight=10;
server localhost:8082 weight=9;
#server localhost:8082 weight=8;
#server localhost:8083 weight=7;
}

#HTTPS
upstream tomcat_webs{
ip_hash;
server localhost:8443 weight=10;
server localhost:8444 weight=9;
}

server {
listen 82;
server_name app.test.com;
index index2.php;
root /www/images;
#location ~ .*\.(php|php5)?$
#{
# #fastcgi_pass unix:/tmp/php-cgi.sock;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# include fastcgi.conf;
#}

#负载均衡器
location /project{
#自定义的头部
proxy_set_header API_KEY_SDL $http_api_key_sdl;
proxy_set_header API_KEY_ADL $http_api_key_adl;

#资源头部信息
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_http_version 1.1;

proxy_pass http://tomcat_web;
}

#location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
#{
# expires 30d;
#}
#location ~ .*\.(js|css)?$
#{
# expires 1h;
#}

access_log /alidata/log/nginx/access/apptest.log;

}

# HTTPS server
server {
listen 9443;
server_name localhost;

ssl on;
ssl_certificate /www/ssl/server.cer;
ssl_certificate_key /www/ssl/test.com.key;

ssl_session_timeout 5m;

ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

location / {
root html;
index index.html index.htm;
}

#负载均衡器
location /project{
#proxy_set_header X-Forwarded-Host $host;
#proxy_set_header X-Forwarded-Server $host;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_http_version 1.1;

#自定义的头部
proxy_set_header API_KEY_SDL $http_api_key_sdl;
proxy_set_header API_KEY_ADL $http_api_key_adl;

#资源头部信息
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;

proxy_pass https://tomcat_webs;
}

access_log /alidata/log/nginx/access/apptests.log;
}

 

Leave a Comment

关于深蓝

仅仅是一个对编程很有爱好的人.
Copyright © 2008-2016 lanxinbase.com Rights Reserved. | 粤ICP备14086738号 |