nginx集群配置方式(Nginx+Keepalived+Tomcat集群配置)

Tomcat作为比较流行的web中间件,使用的人很多,本文的主要目的是描述下在正式环境中如何去使用,构建一个高性能的集群,如有不对的地方,大家一起探讨下。

nginx作为反向代理,keepalived用来管理虚拟IP,一般nginx部署两个节点,一主一备,默认情况vip在主节点绑定,当主节点机器异常,nginx异常或者keepalived服务异常,VIP会漂移到从节点,nginx代理后端多个tomcat应用节点。

架构图如下:

nginx+tomcat集群

1.Nginx安装

nginx有多个分支,我这里选用的是淘宝的tengine,因为我的业务系统里面有配置健康检查,这里为了使用健康检查插件,tengine集成了很多第三方的插件,不需要单独下载。

./configure --prefix=/data/nginx --with-http_stub_status_module --with-http_ssl_module --with-stream --add-module=./modules/ngx_http_upstream_check_module --add-module=./modules/ngx_http_upstream_session_sticky_module

make && make install

注:需要安全pcre-devel和openssl-devel

2.配置

user nobody;

worker_processes 4;

 

events {

worker_connections 1024;

}

http {

include mime.types;

default_type application/octet-stream;

types_hash_max_size 2048;

server_names_hash_bucket_size 128;

client_header_buffer_size 16k;

large_client_header_buffers 4 64k;

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 60;

check_shm_size 40m;

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.1;

gzip_comp_level 2;

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

gzip_vary on;

client_max_body_size 16m;

client_body_buffer_size 16m;

proxy_connect_timeout 90;

proxy_send_timeout 90;

proxy_read_timeout 90;

proxy_buffer_size 16k;

proxy_buffers 4 64k;

proxy_busy_buffers_size 128k;

proxy_temp_file_write_size 128k;

proxy_temp_path proxy_temp_dir;

proxy_cache_path proxy_cache_dir levels=1:2 keys_zone=cache_one:256m inactive=2d max_size=1g;

 

upstream test {

#ip_hash;

session_sticky;

server 10.21.233.57:8080;

server 10.21.233.58:8080;

check interval=3000 rise=2 fall=5 timeout=1000 type=http;

#check_http_send "HEAD /test HTTP/1.0 ";

#check_http_expect_alive http_2xx http_3xx;

}

server {

listen 80;

server_name localhost;

location / {

root html;

index index.html index.htm;

}

location /test {

root html;

proxy_pass http://test/test;

proxy_set_header Host $host:$server_port;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 100m;

index index.html index.htm;

}

}

location /status {

check_status;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

}

配置说明:upstream就是多个服务组,后端跟的多个tomcat的服务,也可以是其他的http服务,一组服务里面发布的多个应用必须要保持一致。每个服务启一个location,proxy_pass http://test/test,中间是upstream的名字,最后是工程名,大部分情况下,可以直接复用配置,如果有上传文件这样的,可以修改上传文件大小限制。

负载均衡的分发方式,简单说明下,在项目中用的比较多的是ip_hash和轮询,我这里选用的是第三方的插件session_sticky,ip_hash不用考虑session复制,只要源IP在一个段,默认都会分发在一个节点,但是会造成后端节点服务不均匀,轮询要处理session,后端应用节点要做session复制,如果是纯接口类的推荐轮询,我们项目使用比较多是ip_hash,轮询+会话保持,还有session_sticky这个插件,具体的搭建选用哪种,大家可以在项目中测试。

健康检查:nginx自带的健康检查,只能检查端口,如果应用假死,请求还是会正常分发,所以健康检查还是很有必要的,可以定义http页面,但是只支持http的健康检查。

3.keepalived安装

./configure --prefix=/data/keepalived

make

make install

mkdir /etc/keepalived

cp /data/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

复制 keepalived 服务脚本到默认的地址

cp /data/soft/keepalived-2.2.2/keepalived/etc/init.d/keepalived /etc/init.d/

cp /data/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

chkconfig keepalived on

service keepalived start

4.keepalived配置

vi etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

notification_email {

root@localhost

}

notification_email_from root@189.cn

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id LVS_DEVEL

}

vrrp_script Monitor_Nginx {

script "/data/nginx/scripts/nginx_pid.sh"

interval 2

weight 2

}

 

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 180

advert_int 1

authentication {

auth_type PASS

auth_pass 1234

}

track_script {

Monitor_Nginx

}

virtual_ipaddress {

192.168.5.200/24 dev eth0

}

}

两个节点都要安装,配置大部分一致,区别是state,主节点是MASTER,从节点是backup,两个角色主要靠priority 后面的数值区分,谁高谁是master,优先抢占vip,需要注意网卡编号。

5.nginx检测脚本

vi /data/nginx/scripts/nginx_pid.sh

#!/bin/bash

#

A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ];then

service keepalived stop

fi

检测脚本很简单,就是去判断nginx是否存活,如果进程挂掉,停keepalived服务,让从节点接管vip。

6.配置防火墙

firewall-cmd --permanent --add-port=80/tcp --permanent

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface em1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT

firewall-cmd --reload

keepalived主从之间是靠发广播监测节点状态,所以启动防火墙的情况下,vrrp广播必须打开。

7.启动nginx和keepalived

/data/nginx/sbin/nginx

service keepalived start

8.tomcat的安装部署

安装jdk,配置环境变量,解压tomcat,发布服务,这块儿的内容比较简单,不做特殊说明。

这样我们就搭建了一套软件负载均衡,需要注意几点:

1.如果你是高并发场景,需要优化几点,nginx的worker进程数,操作系统打开文件数,操作系统内核参数,这些配置网上都有。

2.后端是不是有多个工程,如果是多个,没域名的情况下,要靠location来区分了,同一个server下的location不能一样;如果是多个工程没有工程名的情况,基本上要靠启多个server来实现,也可以自定义location名称,但是这时候要注意程序里面的路径不能写死,要不然好多静态文件无法加载。如果有域名,可以启二级域名来解决。

3.nginx分发策略的选择,核心的应该是用户量,如果用户很少,那就ip_hash,如果用户量大,用轮询+会话保持时间,如果应用里面配置了会话保持,那就比较灵活了,各种策略都可以试。

4.并发能力,我们测试过,单测nginx可以支持2万的并发,没有加超时时间,如果是高并发场景,负载均衡考虑优化内核参数,后端应用要改造了,把热数据放到redis里面。

第一次发稿,写的比较粗糙,有些东西可能也没表达清楚,大家可以一起交流。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 lqy2005888@qq.com 举报,一经查实,本站将立刻删除。