centos7 搭建keepalived+Nginx+tomcat
准备1台 192.168.2.224 安装Nginx,2台安装tomcat 192.168.2.222 192.168.2.223
1、安装Nginx:
上传pcre-8.36.tar.gz、zlib-1.2.8.tar.gz到服务器
下载地址:pcre-8.36.tar.gz https://o3cex9zsl.qnssl.com/libs/nginx/pcre-8.36.tar.gz
zlib-1.2.8.tar.gz https://o3cex9zsl.qnssl.com/libs/nginx/zlib-1.2.8.tar.gz
#######新建nginx用户和nginx组
[root@nginx]# groupadd -r nginx && useradd -r -g nginx -s /bin/false -M nginx
#######yum安装nginx必须的依赖库
[root@nginx]#yum -y install openssl openssl-devel libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed
#######官网下载Nginx1.9.0的tar包,然后解压到服务器上
[root@nginx jason]# wget -c http://nginx.org/download/nginx-1.9.0.tar.gz
[root@nginx jason]# tar -zxf nginx-1.9.0.tar.gz && cd nginx-1.9.0
上传pcre-8.36.tar(支持Nginx的Rewrite功能)、zlib-1.2.8.tar(支持Nginx的Gzip压缩功能)
#######新建Nginx1.9.0安装时所需要的目录
[root@nginx nginx-1.9.0]# cd /var/tmp/ && mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}
[root@nginx tmp]# mkdir -p /var/run/nginx && cd /home/jason/nginx-1.9.0
[root@nginx nginx-1.9.0]#
./configure --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --conf-path=/usr/local/nginx/conf/nginx.conf --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --sbin-path=/usr/sbin/nginx
具体的含义:
[root@nginx nginx-1.9.0]make && make install
上传脚本Nginx到/etc/init.d 并赋予只读权限,将Nginx服务添加到启动项并给予开机自动启动,启动Nginx服务
Nginx
1 #! /bin/bash 2 # 3 # nginx - this script starts and stops the nginx daemon 4 # 5 # chkconfig: - 85 15 6 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ 7 # proxy and IMAP/POP3 proxy server 8 # 9 # processname: nginx 10 # config: /etc/nginx/nginx.conf 11 # pidfile: /var/run/nginx/nginx.pid 12 13 # Source function library. 14 . /etc/rc.d/init.d/functions 15 16 # Source networking configuration. 17 . /etc/sysconfig/network 18 19 # Check that networking is up. 20 [ "$NETWORKING" = "no" ] && exit 0 21 22 nginx="/usr/sbin/nginx" 23 prog=$(basename $nginx) 24 25 NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" 26 27 [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx 28 29 lockfile=/var/lock/nginx.lock 30 31 start() { 32 [ -x $nginx ] || exit 5 33 [ -f $NGINX_CONF_FILE ] || exit 6 34 echo -n $"Starting $prog: " 35 daemon $nginx -c $NGINX_CONF_FILE 36 retval=$? 37 echo 38 [ $retval -eq 0 ] && touch $lockfile 39 return $retval 40 } 41 42 stop() { 43 echo -n $"Stopping $prog: " 44 killproc $prog -QUIT 45 retval=$? 46 echo 47 [ $retval -eq 0 ] && rm -f $lockfile 48 return $retval 49 } 50 51 restart() { 52 configtest || return $? 53 stop 54 sleep 1 55 start 56 } 57 58 reload() { 59 configtest || return $? 60 echo -n $"Reloading $prog: " 61 killproc $nginx -HUP 62 RETVAL=$? 63 echo 64 } 65 66 force_reload() { 67 restart 68 } 69 70 configtest() { 71 $nginx -t -c $NGINX_CONF_FILE 72 } 73 74 rh_status() { 75 status $prog 76 } 77 78 rh_status_q() { 79 rh_status >/dev/null 2>&1 80 } 81 82 case "$1" in 83 start) 84 rh_status_q && exit 0 85 $1 86 ;; 87 stop) 88 rh_status_q || exit 0 89 $1 90 ;; 91 restart|configtest) 92 $1 93 ;; 94 reload) 95 rh_status_q || exit 7 96 $1 97 ;; 98 force-reload) 99 force_reload 100 ;; 101 status) 102 rh_status 103 ;; 104 condrestart|try-restart) 105 rh_status_q || exit 0 106 ;; 107 *) 108 echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" 109 exit 2 110 esac
[root@nginx init.d]chkconfig --add nginx
[root@nginx init.d]chkconfig nginx on
[root@nginx init.d]service nginx start
查看安装的Nginx1.9.0的详细信息
[root@nginx init.d]# nginx -V
nginx version: nginx/1.9.0
built by gcc 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC)
configure arguments: --prefix=/usr/local/nginx --pid-path=/var/run/nginx/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_gzip_static_module --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --conf-path=/usr/local/nginx/conf/nginx.conf --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --sbin-path=/usr/sbin/nginx
2、安装tomcat
查看现有版本、卸载并安装jdk1.8
[root@nginx jason]# java -version
java version "1.7.0_51"
[root@nginx jason]# rpm -qa |grep jdk
[root@nginx jason]# yum remove java-1.7.0-openjdk
[root@nginx jason]# ls
apache-tomcat-9.0.4.tar.gz Desktop Documents Downloads jdk-8u11-linux-x64.rpm Music Pictures Public Templates Videos
[root@nginx jason]# rpm -ivh jdk-8u11-linux-x64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:jdk-2000:1.8.0_11-fcs ################################# [100%]
Unpacking JAR files...
rt.jar...
jsse.jar...
charsets.jar...
tools.jar...
localedata.jar...
jfxrt.jar...
[root@nginx jason]# java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
[root@nginx jason]# cd /usr/local/
[root@nginx local]# mkdir tomcat
[root@nginx local]# ls
bin etc games include lib lib64 libexec sbin share src tomcat
解压apache-tomcat-9.0.4并移动到/usr/local/tomcat/
[root@nginx jason]# mv apache-tomcat-9.0.4 /usr/local/tomcat/
打开文件 /etc 目录下的 profile 文件,将如下代码追加到 profile 文件末尾:
# idea - tomcat9 config start - 2018-7-24export CATALINA_HOM=/usr/local/tomcat/apache-tomcat-9.0.4
export CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.4
export TOMCAT_HOME=/usr/local/tomcat/apache-tomcat-9.0.4
# idea - tomcat9 config end - 2018-7-24
修改 tomcat 的端口号和字符编码
vim /usr/local/tomcat/apache-tomcat-9.0.4/conf/server.xml
找到如下代码:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
将其中的 8080 改成 HTTP 协议的默认端口 80,改后的代码如下:
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
增加 manager-gui 图形化管理界面的访问权限(不需要的话,此步骤可忽略):
[root@nginx tomcat]# cd apache-tomcat-9.0.4/conf/
[root@nginx conf]# ls
catalina.policy catalina.properties context.xml jaspic-providers.xml jaspic-providers.xsd logging.properties server.xml tomcat-users.xml tomcat-users.xsd web.xml
[root@nginx conf]# vim tomcat-users.xml
- 在 </tomcat-users> 标签前加入如下代码:
<role rolename="admin-gui"/><role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat" password="mytomcatadmin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-script,admin-gui"/>
进入
[root@nginx apache-tomcat-9.0.4]# cd webapps/manager/META-INF/
[root@nginx META-INF]# vi context.xml
进入
[root@nginx]#cd /usr/local/tomcat/apache-tomcat-9.0.4/webapps/host-manager/META-INF/
[root@nginx META-INF]# vim context.xml
(或者和上面的一样注释掉)
这里设置的 username 是tomcat;password 都是 mytomcatadmin,角色为 manager-gui;
如果要某网段可以访问tomcat
在tomcat-users.xml里添上几句即可
打开webapps下的host-manager和manager,都有一个共同的文件夹META-INF,里面都有context.xml,这个文件的内容是:
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
</Context>
通过查看官方文档,知道,这段代码的作用是限制来访IP的,127.d+.d+.d+|::1|0:0:0:0:0:0:0:1,是正则表达式,表示IPv4和IPv6的本机环回地址,所以这也解释了,为什么我们本机可以访问管理界面,但是其他机器确403。
找到原因了,那么修改一下这里的正则表达式即可,比如我们只允许内网网段192.168.2访问管理页面,那么改成这样就可以:
<Context antiResourceLocking="false" privileged="true" >
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.2.*" />
</Context>
修改完毕,关闭浏览器,重新打开tomcat,问题解决!
进入到 /usr/local/tomcat/apache-tomcat-9.0.0.M4/bin 目录中:
cd ../bin/
打开 vi catalina.sh 文件:
在 # OS specific support. 上面一行加入如下代码(不能有空格):
JAVA_HOME=/usr/java/jdk1.8.0_11/
JRE_HOME=$JAVA_HOME/jre
查看java_home目录
[root@nginx bin]# rpm -qa|grep jdk
jdk-1.8.0_11-fcs.x86_64
[root@nginx bin]# rpm -ql jdk-1.8.0_11-fcs.x86_64
启动 tomcat 服务:
./startup.sh
打印如下信息则表明启动 Tomcat 服务成功:
[root@nginx bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat/apache-tomcat-9.0.4
Using CATALINA_HOME: /usr/local/tomcat/apache-tomcat-9.0.4
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-9.0.4/temp
Using JRE_HOME: /usr/java/jdk1.8.0_11//jre
Using CLASSPATH: /usr/local/tomcat/apache-tomcat-9.0.4/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-9.0.4/bin/tomcat-juli.jar
Tomcat started.
打开浏览器输入 IP(修改测试页面)
进入
/usr/local/tomcat/apache-tomcat-9.0.4/webapps/ROOT
修改index.jsp
简化启动服务
cd /etc/init.d/
vim tomcat
# idea - tomcat config start - 2018-2-1!/bin/bash
description: Tomcat Start Stop Restart
processname: tomcat
chkconfig: 2345 20 80
JAVA_HOME=/usr/java/jdk1.8.0_11/
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.4case $1 in
start)
sh $CATALINA_HOME/bin/startup.sh
;;
stop)
sh $CATALINA_HOME/bin/shutdown.sh
;;
restart)
sh $CATALINA_HOME/bin/shutdown.sh
sh $CATALINA_HOME/bin/startup.sh
;;
esac
exit 0chmod 755 tomcat
chkconfig --add tomcat
chkconfig --level 2345 tomcat on
chkconfig --list tomcat
idea - tomcat config end - 2018-2-1
[root@nginx conf] chmod +x tomcat
[root@nginx conf]chkconfig --add tomcat
[root@nginx conf]chkconfig tomcat on
启动tomcat
进入/usr/local/tomcat/apache-tomcat-9.0.4/bin
[root@python bin]# ./startup.sh
[root@python bin]# ./shutdown.sh (更改配置文件之后重新加载需要停止tomcat再启用)
开机自动启动
vi /etc/rc.d/rc.local 添加
/usr/local/tomcat/apache-tomcat-9.0.4/bin/startup.sh
linux 系统中的 /etc 目录表示“设备”,意为与硬件设备相关的信息;
/etc/init.d 目录下的文件表示当前设备的初始化配置信息;
命令 chkconfig 表示添加(--add)、删除(--del)、查看(--list)
3、修改Nginx配置文件(192.168.2.224
cd /usr/local/nginx/conf
vim nginx.conf
在server配置的上面新增upstream 配置,后面的“server_tomcat”相当于该配置别名,供后面的“proxy_pass”配置使用。
upstream 里面配置的就是2个tomcat的访问地址,IP:端口号,不用写http:// 。
proxy_pass 转发定位到upstream 里面配置的多台服务器proxy_pass 配置的http:// 必须要写。(不是https)
修改完成后,重新加载nginx服务的配置
nginx -s reload
看到这,肯定会有人有疑问,如果有一台服务器突然挂掉了怎么办?别急,这种情况nginx已经给我们处理了,当有台服务器挂掉了,nginx默认不会访问挂掉的服务,继续访问其他正在运行的服务,提供了很好的容错机制。
能不能让两台服务器访问的概率不一样了?能,nginx给我们提供了 weight这个属性,可以给各个服务器分配权重,配置如下:
weight 默认为1.weight越大,负载的权重就越大。
通过上面的配置,刷新页面,会发现访问tomcat1的概率明显比访问tomcat2的概率大。
PS:upstream目前支持5种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
-
upstream bakend {
-
server 192.168.0.14 weight=10;
-
server 192.168.0.15 weight=10;
-
}
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
例如:
-
upstream bakend {
-
ip_hash;
-
server 192.168.0.14:88;
-
server 192.168.0.15:80;
-
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
-
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;
-
}
-
tips:
-
upstream bakend{#定义负载均衡设备的Ip及设备状态
-
ip_hash;
-
server 127.0.0.1:9090 down;
-
server 127.0.0.1:8080 weight=2;
-
server 127.0.0.1:6060;
-
server 127.0.0.1:7070 backup;
-
}
在需要使用负载均衡的server中增加
proxy_pass http://bakend/;
每个设备的状态设置为:
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进行匹配。可以进行重定向或者进行新的代理 负载均衡
3、安装keepalive
yum install -y keepalived
修改config文件
vim /etc/keepalived\keepalived.conf
keepalived.conf各项的含义
MASTER
! Configuration File for keepalived#全局配置
global_defs {#keepalived切换的时候,发消息到指定的email,可配置多个email
notification_email {feinik1@foxmail.com
feinik2@foxmail.com
}
#通知邮件从哪个地址发出
notification_email_from feinik@foxmail.com#通知邮件的smtp地址
smtp_server smtp.exmail.qq.com#连接smtp服务器的超时时间,单位秒
smtp_connect_timeout 30#Keepalived的机器标识,一个网络内保持唯一
router_id nginx-master}
#执行脚本配置
vrrp_script chk_nginx {#脚本所在路径
script "/home/project/keepalived/check_nginx.sh"#脚本执行间隔时间,秒
interval 2#优先级
weight 2}
#keepalived实例配置
vrrp_instance VI_1 {#指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
state MASTER#实例绑定的网卡
interface ens33#虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
virtual_router_id 51#优先级,数值愈大,优先级越高
priority 100#MASTER与BACKUP之间同步检查的时间间隔,单位为秒
advert_int 1#通信验证
authentication {auth_type PASS auth_pass feinik }
#追踪外围脚本
track_script {chk_nginx</span><span style="color: #008000">#</span><span style="color: #008000">这里配置vrrp_script的名称</span>
}
#虚拟ip配置,可配置多个
virtual_ipaddress {</span>192.168.10.200<span style="color: #000000"> }
}
BACKUP
! Configuration File for keepalived#全局配置
global_defs {#keepalived切换的时候,发消息到指定的email,可配置多个email
notification_email {feinik1@foxmail.com
feinik2@foxmail.com
}
#通知邮件从哪个地址发出
notification_email_from feinik@foxmail.com#通知邮件的smtp地址
smtp_server smtp.exmail.qq.com#连接smtp服务器的超时时间,单位秒
smtp_connect_timeout 30#Keepalived的机器标识,一个网络内保持唯一
router_id nginx-master}
#执行脚本配置
vrrp_script chk_nginx {#脚本所在路径
script "/home/project/keepalived/check_nginx.sh"#脚本执行间隔时间,秒
interval 2#优先级
weight 2}
#keepalived实例配置
vrrp_instance VI_1 {#指定实例的初始状态,MASTER或BACKUP两种状态,并且需要大写
state BACKUP#实例绑定的网卡
interface ens33#虚拟路由标识,是一个数字,整个VRRP内唯一,如果keepalived配置了主备,需要相同
virtual_router_id 51#优先级,数值愈大,优先级越高
priority 99#MASTER与BACKUP之间同步检查的时间间隔,单位为秒
advert_int 1#通信验证
authentication {auth_type PASS auth_pass feinik }
#追踪外围脚本
track_script {chk_nginx</span><span style="color: #008000">#</span><span style="color: #008000">这里配置vrrp_script的名称</span>
}
#虚拟ip配置,可配置多个
virtual_ipaddress {</span>192.168.10.200<span style="color: #000000"> }
}
我的实验配置
master
! Configuration File for keepalivedglobal_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_garp_interval 0
vrrp_gna_interval 0}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 3
weight 2
}
vrrp_instance VI_1 {
state MASTER
interface enp0s17
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PAS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.2.226
}}
backup
! Configuration File for keepalivedglobal_defs {
...
}rrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 3
weight 2
}vrrp_instance VI_1 {
state BACKUP
interface enp0s17
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.2.226
}
}
查看VIP(ip addr)
nginx_check.sh脚本(赋予只读权限 chmod +x nginx_check.sh)
如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalived将虚拟 ip 绑定到 BACKUP 机器上。内容如下:
#!/bin/bash A=`ps -C nginx –no-header |wc -l` if [ $A -eq 0 ];then /home/wangzi/soft/nginx/sbin/nginx sleep 5 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
测试