Nginx高可用、高并发:Linux上Nginx+Keepalived部署
Nginx简单介绍:
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。具体的介绍大家可以参见百度百科
-
Nginx安装
1.1 环境准备
选两台节点部署Nginx,如:192.169.213.128 Nginx1,192.169.213.129 Nginx2,两台节点Nginx的安装完全相同。
创建下载及安装目录,进入创建目录[root@yanhl1 ~]# mkdir -p /usr/local/nginx/src && cd /usr/local/nginx/src
安装c++编译环境,请确保yum服务正常
[root@localhost src]# yum install gcc-c++
下载nginx及相关依赖组件 (请确保wget服务正常 )
[root@localhost src]# wget http://nginx.org/download/nginx-1.10.2.tar.gz [root@localhost src]# wget http://www.openssl.org/source/openssl-fips-2.0.10.tar.gz [root@localhost src]# wget http://zlib.net/zlib-1.2.11.tar.gz [root@localhost src]# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
依赖软件安装:
注:以下命令中,./config or ./configure为执行配置脚本,make 为编译文件,make install为安装文件 &&为串行执行其连接命令。
openssl安装:
[root@localhost src]# tar zxvf openssl-fips-2.0.10.tar.gz [root@localhost src]# cd openssl-fips-2.0.10 [root@localhost openssl-fips-2.0.10]# ./config && make && make install
pcre安装
[root@localhost src]# tar zxvf pcre-8.40.tar.gz [root@localhost src]# cd pcre-8.40 [root@localhost pcre-8.40]# ./configure && make && make install
zlib安装
[root@localhost src]# tar zxvf zlib-1.2.11.tar.gz [root@localhost src]# cd zlib-1.2.11 [root@localhost zlib-1.2.11]# ./configure && make && make install
1.2 Nginx安装(之前选定测试的两台机子上的安装步骤和配置均相同)
指定安装路径:./configure --prefix=path 如果不指定--prefix=path,默认安装路径为usr/local/nginx
[root@localhost src]# tar zxvf nginx-1.10.2.tar.gz [root@localhost src]# cd nginx-1.10.2 [root@localhost nginx-1.10.2]# ./configure --prefix=usr/local/nginx && make && make install
配置nginx系统环境变量,这样执行ngnix脚本命令就不用切到nginx的安装目录下
[root@localhost nginx]# vim /etc/profile
加入安装路径到系统环境中
export NGINX_HOME=/opt/software/nginx export PATH=$PATH:$NGINX_HOME/sbin
使系统环境变量生效
[root@localhost nginx]# source /etc/profile
启动nginx并查看是否启动成功,查询到nginx进程即为启动成功
[root@localhost nginx]# nginx [root@localhost nginx]# ps aux | grep nginx | grep -v grep
浏览器访问服务器ip.,出现以下内容即为安装成功
nginx命令: nginx -s reload|reopen|stop|quit #重新加载配置|重启|停止|退出 nginx nginx -t #测试配置是否有语法错误 nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives] -?,-h : 打开帮助信息 -v : 显示版本信息并退出 -V : 显示版本和配置选项信息,然后退出 -t : 检测配置文件是否有语法错误,然后退出 -q : 在检测配置文件期间屏蔽非错误信息 -s signal : 给一个 nginx 主进程发送信号:stop(停止), quit(退出), reopen(重启), reload(重新 加载配置文件) -p prefix : 设置前缀路径(默认是:/usr/local/Cellar/nginx/1.2.6/) -c filename : 设置配置文件(默认是:/usr/local/etc/nginx/nginx.conf) -g directives : 设置配置文件外的全局指令
1.3 Nginx负载均衡配置及启动
修改nginx配置文件
events { use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大 提高nginx的性能 worker_connections 1024; #单个后台worker process进程的最大并发链接数 } #HTTP服务器 http { #设定mime类型,类型由mime.type文件定义 include mime.types; default_type application/octet-stream; #设定日志格式 access_log /var/log/nginx/access.log; #设定负载均衡的服务器列表 upstream load_balance_server { #weigth参数表示权值,权值越高被分配到的几率越大 server 192.168.213.128:8080 weight=5; server 192.168.213.129:8080 weight=5; } server { #侦听80端口 listen 80; #定义使用www.xx.com访问,须将www.helloworld.com加到/etc/hosts中 #server_name www.helloworld.com; root /opt/software/apache-tomcat-8.5.35/webapps; #对所有请求进行负载均衡请求 location / { index index.html index.htm; #定义首页索引文件的名称 proxy_pass http://load_balance_server ;#请求转向load_balance_server 定义的服务器列表 #以下是一些反向代理的配置(可选择性配置) #proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $remote_addr; proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时) proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时) proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时) proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置 proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2) proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 } } }
重启nginx
nginx -s reopen
1.4 nginx负载均衡测试
安装Tomcat 进行负载均衡验证测试(两台机子上的tomca安装要完全相同)#下载、解压(保证已安装JDK,我的tomcat安装目录:/opt/software/apache-tomcat-8.5.35/) wget https://www-us.apache.org/dist/tomcat/tomcat-8/v8.5.35/bin/apache-tomcat-8.5.35.tar.gz tar -xzvf apache-tomcat-8.5.35.tar.gz
进入解压目录下的webapp/examples目录下,编辑index.html(另一台机子同样根据本机ip修改)
[root@localhost bin]# vim apache-tomcat-8.5.35/webapps/examples/index.html
安装好tomcat,进入tomcat安装目录的bin目录启动tomcat,保证tomat服务启动成功[root@localhost bin]# sh startup.sh
进入页面验证nginx负载均衡功能:
快速刷新页面,页面的ip会交替变化,说明nginx将请求发送到了不同的服务器上的tomcat上,实现了服务的负载均衡。
-
Keepalived安装
关于Keepalived的介绍及nginx与其组成高可用结构的原理可以看网友的这篇博客,感谢这位大佬,博客里说的很清楚
https://www.cnblogs.com/kevingrace/p/6138185.html下面我们继续Keepalived的安装。
我们选择192.169.213.128作为Keepalived的MASTER,192.169.213.129为BACKUP2.1 环境准备
安装依赖包、下载Keepalived
#之前如果安装过某些依赖包,可以再安装一次,防止安装Keepalived出错 [root@localhost src]# cd /usr/local/nginx/src [root@localhost src]# yum install -y libnl* [root@localhost src]# yum install -y libnfnetlink-devel zlib zlib-devel gcc gcc-c++ openssl openssl-devel openssh [root@localhost src]# wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
2.2 安装Keepalived
[root@localhost src]# tar xvf keepalived-1.3.5.tar.gz [root@localhost src]# cd keepalived-1.3.5 [root@localhost keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived [root@localhost keepalived-1.3.5]# make [root@localhost keepalived-1.3.5]# make install
2.3 配置、启动Keepalived
安装完成后,一般会将Keepalived注册为系统服务,设置为开机启动,防止服务挂掉。进入安装目录的etc目录下,将keepalived相应的配置文件拷贝到系统相应的目录当中。keepalived启动时会从/etc/keepalived目录下查找keepalived.conf配置文件,如果没有找到则使用默认的配置。/etc/keepalived目录安装时默认是没有创建的,需要手动创建。
[root@localhost keepalived]# mkdir -p /etc/keepalived [root@localhost keepalived]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ # init.d/keepalived这个文件在解压包的目录下 [root@localhost keepalived]# cp /usr/local/nginx/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/init.d/keepalived [root@localhost keepalived]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived
增加nginx状态检测脚本:
[root@localhost ~]# cd /usr/local/keepalived/ [root@localhost keepalived]# touch check_nginx.sh [root@localhost keepalived]# chmod 755 check_nginx.sh [root@localhost keepalived]# vim check_nginx.sh
#!/bin/bash COUNT=$(ps -C nginx --no-header |wc -l) echo $COUNT #判断Nginx 是否都挂掉了 if [ $COUNT -eq 0 ] then #nginx安装地址,如果挂掉了,就启动nginx(nginx命令的地址要写对) /usr/local/nginx/sbin/nginx echo "重启nginx" #等5秒钟后,再次查看是否 启动成功 sleep 5 #如果nginx没有启动起来,就直接干掉keepalived COUNT=$(ps -C nginx --no-header |wc -l) if [ $COUNT -eq 0 ] then echo "干掉keepalived" #如果killall命令不能使用,就需要安装psmisc工具了 #yum install -y psmisc killall keepalived fi fi
编辑配置文件:
[root@localhost ~]# vim /etc/keepalived/keepalived.conf
192.169.213.128 主节点:
```` #配置文件 ! Configuration File for keepalived global_defs { #唯一标识,一般为用户名 router_id username1 } #监控服务.NGINX mysql等 vrrp_script chk_nginx { script "/usr/local/keepalived/check_nginx.sh" #每2s检查一次 interval 2 #每次检查-20 weight -20 } vrrp_instance VI_1 { ##主从设置 MASTER/BACKUP state MASTER #网卡名称 interface eth0 #同一个集群下这个 router_id是一样的 virtual_router_id 51 #本机的ip,需要修改 mcast_src_ip 192.168.213.129 #优先级,从节点 配置,需要小于主节点 priority 100 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 advert_int 1 #认证的密码 authentication { auth_type PASS #设定授权密码,密码相同的为一个集群 auth_pass 1111 } #触发的脚本 track_script { chk_nginx #检测脚本,上面配置的 } #虚拟ip地址(同一个集群中的虚拟ip必须得相同,可配置多个) virtual_ipaddress { 192.168.213.135 192.168.213.136 } }
192.169.213.129 从节点:
#配置文件 ! Configuration File for keepalived global_defs { #唯一标识,一般为用户名 router_id username2 } #监控服务.NGINX mysql等 vrrp_script chk_nginx { script "/usr/local/keepalived/check_nginx.sh" #每2s检查一次 interval 2 #每次检查-20 weight -20 } vrrp_instance VI_1 { ##主从设置 MASTER/BACKUP state BACKUP #网卡名称 interface eth0 #同一个集群下这个 router_id是一样的 virtual_router_id 51 #本机的ip,需要修改 mcast_src_ip 192.168.213.129 #优先级,从节点 配置,需要小于主节点 priority 80 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 advert_int 1 #认证的密码 authentication { auth_type PASS #设定授权密码,密码相同的为一个集群 auth_pass 1111 } #触发的脚本 track_script { chk_nginx #检测脚本,上面配置的 } #虚拟ip地址 virtual_ipaddress { 192.168.213.135 192.168.213.136 } }
设置keepalived服务开机启动:
[root@localhost ~]# chmod 755 /etc/init.d/keepalived #权限 [root@localhost ~]# chkconfig keepalived on #开机启动 [root@localhost ~]# chkconfig --add keepalived #加为系统服务 [root@localhost ~]# service keepalived start #启动服务 [root@localhost ~]# service keepalived status #查看服务状态
查看启动情况:
想要停止服务,执行:
[root@localhost ~]# service keepalived stop #查看服务状态
查看keepalived 虚拟出来的ip
[root@localhost keepalived]# ip a
通过虚拟ip访问nginx,依然可以实现nginx的请求转发
如果一台机子上的nginx挂了而且无法启动成功,检测脚本会停止这台机子上的keepalived服务,虚拟ip就会切到集群的另一台机子上,使用服务正常的这台机子上的keepalived和nginx,实现nginx高可用。2.4 测试Nginx高可用
先是两台都开启keepalived,然后通过虚拟ip(192.168.213.135)访问, 再关掉第一台的keepalived
service keepalived stop
再通过虚拟ip(192.168.213.135)访问,如果一切正常,依然可以访问到tomcat的测试页面。
启动失败问题:
执行 journalctl -xe 查看失败信息,也可查看/var/log/messages文件查看相关信息1.无法写入pid
vim /lib/systemd/system/keepalived.service
/usr/local/program/keepalived/var/run/keepalived.pid不存在,写入失败,修改为默认路径:PIDFile=/var/run/keepalived.pid systemctl daemon-reload #重新载入 systemd,扫描新的或有变动的单元
2.(VI_1): ip address associated with VRID 25 not present in MASTER advert : 192.168.213.136
配置文件中的evirtual_router_id 设置问题。同个集群中的virtual_router_id 必须相同 ,默认为51,不同集群的中的virtual_router_id必须不同。