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 举报,一经查实,本站将立刻删除。