首页 技术 正文
技术 2022年11月18日
0 收藏 429 点赞 4,922 浏览 13493 个字

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

      具体的含义:

centos7 搭建keepalived+Nginx+tomcat

[root@nginx nginx-1.9.0]make && make install

上传脚本Nginx到/etc/init.d 并赋予只读权限,将Nginx服务添加到启动项并给予开机自动启动,启动Nginx服务

Nginx

 #! /bin/bash
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: -
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
#
# processname: nginx
# config: /etc/nginx/nginx.conf
# pidfile: /var/run/nginx/nginx.pid # Source function library.
. /etc/rc.d/init.d/functions # Source networking configuration.
. /etc/sysconfig/network # Check that networking is up.
[ "$NETWORKING" = "no" ] && exit nginx="/usr/sbin/nginx"
prog=$(basename $nginx) NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/nginx.lock start() {
[ -x $nginx ] || exit
[ -f $NGINX_CONF_FILE ] || exit
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq ] && touch $lockfile
return $retval
} stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq ] && rm -f $lockfile
return $retval
} restart() {
configtest || return $?
stop
sleep
start
} reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
} force_reload() {
restart
} configtest() {
$nginx -t -c $NGINX_CONF_FILE
} rh_status() {
status $prog
} rh_status_q() {
rh_status >/dev/null >&
} case "$1" in
start)
rh_status_q && exit
$
;;
stop)
rh_status_q || exit
$
;;
restart|configtest)
$
;;
reload)
rh_status_q || exit
$
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit
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

centos7 搭建keepalived+Nginx+tomcat

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 - --export CATALINA_HOM=/usr/local/tomcat/apache-tomcat-9.0.
export CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.
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

  1. 在 </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

centos7 搭建keepalived+Nginx+tomcat

进入

[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

centos7 搭建keepalived+Nginx+tomcat

简化启动服务

cd /etc/init.d/

vim tomcat

# idea - tomcat config start - --  #!/bin/bash
# description: Tomcat Start Stop Restart
# processname: tomcat
# chkconfig:
JAVA_HOME=/usr/java/jdk1..0_11/
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0. case $ 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 #chmod tomcat
#chkconfig --add tomcat
#chkconfig --level tomcat on
#chkconfig --list tomcat # idea - tomcat config end - --

[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

centos7 搭建keepalived+Nginx+tomcat

在server配置的上面新增upstream 配置,后面的“server_tomcat”相当于该配置别名,供后面的“proxy_pass”配置使用。

upstream 里面配置的就是2个tomcat的访问地址,IP:端口号,不用写http:// 。

proxy_pass 转发定位到upstream 里面配置的多台服务器proxy_pass 配置的http:// 必须要写。(不是https)

修改完成后,重新加载nginx服务的配置

nginx -s reload

centos7 搭建keepalived+Nginx+tomcat

centos7 搭建keepalived+Nginx+tomcat

看到这,肯定会有人有疑问,如果有一台服务器突然挂掉了怎么办?别急,这种情况nginx已经给我们处理了,当有台服务器挂掉了,nginx默认不会访问挂掉的服务,继续访问其他正在运行的服务,提供了很好的容错机制。

能不能让两台服务器访问的概率不一样了?能,nginx给我们提供了 weight这个属性,可以给各个服务器分配权重,配置如下:

centos7 搭建keepalived+Nginx+tomcat

weight 默认为1.weight越大,负载的权重就越大。

通过上面的配置,刷新页面,会发现访问tomcat1的概率明显比访问tomcat2的概率大。

PS:upstream目前支持5种方式的分配

1、轮询(默认)
  每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2、weight
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
    例如:
  

  1.  upstream bakend {
  2.    server 192.168.0.14 weight=10;
  3.    server 192.168.0.15 weight=10;
  4.  }

3、ip_hash
     每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
  例如:

  1.  upstream bakend {
  2.    ip_hash;
  3.    server 192.168.0.14:88;
  4.    server 192.168.0.15:80;
  5.  }

4、fair(第三方)
  按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  1.  upstream backend {
  2.    server server1;
  3.    server server2;
  4.    fair;
  5.  }

5、url_hash(第三方)
  按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
  例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

  1.  upstream backend {
  2.    server squid1:3128;
  3.    server squid2:3128;
  4.    hash $request_uri;
  5.    hash_method crc32;
  6.  }
  7.    tips:
  8.    upstream bakend{#定义负载均衡设备的Ip及设备状态
  9.    ip_hash;
  10.    server 127.0.0.1:9090 down;
  11.    server 127.0.0.1:8080 weight=2;
  12.    server 127.0.0.1:6060;
  13.    server 127.0.0.1:7070 backup;
  14.  }

在需要使用负载均衡的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.comfeinik2@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 {    #这里配置vrrp_script的名称        chk_nginx    }#虚拟ip配置,可配置多个    virtual_ipaddress {        192.168.10.200    }}

BACKUP

! Configuration File for keepalived#全局配置global_defs {   #keepalived切换的时候,发消息到指定的email,可配置多个email   notification_email {     feinik1@foxmail.comfeinik2@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 {    #这里配置vrrp_script的名称        chk_nginx    }#虚拟ip配置,可配置多个    virtual_ipaddress {        192.168.10.200    }}

我的实验配置

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)

centos7 搭建keepalived+Nginx+tomcat

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

测试

centos7 搭建keepalived+Nginx+tomcat

centos7 搭建keepalived+Nginx+tomcat

    

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,103
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,579
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,427
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,199
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,834
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,917