首页 > 系统相关 >Nginx11月自学

Nginx11月自学

时间:2022-11-20 22:13:52浏览次数:81  
标签:tomcat nginx 30 Nginx11 集群 服务器 自学 root

有一个php服务在80端口 想同时支持两种协议 ,可以开一个443 ssl反代到80。

代理是为了将更多的服务整合到一起呀,解决了端口号的占用问题。

负载均衡upstream中的server可以是域名

Nginx在线配置生成工具 (nginxedit.cn)

\w默认没有长度限制,abcdefg这样的都可以匹配。他第一个就匹配了就不会去找第二个。

Nginx没有内置echo这个指令。

centos7:ctrl+alt+T   打开终端
ip addr    #查看地址
netstat -lntp  #查看监听端口
netstat -s  #查看网络统计信息
route -n   #查看路由表

虚拟机查看IP

如何查看虚拟机CentOS7 的 IP 地址-百度经验 (baidu.com)

在虚拟机中安装完CentOS7后输入ifconfig查看不到ip地址而且显示没有此命令。

一、在CentOS7中我们不能输入ifconfig命令查看,而是要输入ip addr命令查看。

此命令会出现3个条目,centos的ip地址是ens33条目中的inet值,发现 ens33 没有 inet 这个属性,那么就没法通过IP地址连接虚拟机

![image-20221120170359580](F:\Data warehouse\picture\image-20221120170359580.png)

二、接下来我们查看ens33网卡的配置:

1.命令为: vi /etc/sysconfig/network-scripts/ifcfg-ens33

注意vi后面加空格。

2.从配置清单中可以发现 CentOS 7 默认是不启动网卡的(ONBOOT=no)。

把这一项改为YES(ONBOOT=yes)

修改方法:按i键进行输入修改,然后按 Esc 退出 再出入命令 :wq 再按Enter即可

![image-20221120170614587](F:\Data warehouse\picture\image-20221120170614587.png)

三、现在重启网络服务: sudo service network restart

并查询ip地址

![image-20221120171058769](F:\Data warehouse\picture\image-20221120171058769.png)

安装命令

yum -y install wget
yum -y install steup
yum -y install perl

nginx反向代理与负载均衡教程

正向代理代替了客户端(代理浏览器访问),反向代理代替了服务端(代理浏览器响应)。

1.OpenResty

OpenResty® - 中文官方站

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty® 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty® 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

1.1安装

CentOS

你可以在你的 CentOS 系统中添加 openresty 仓库,这样就可以便于未来安装或更新我们的软件包(通过 yum check-update 命令)。 运行下面的命令就可以添加我们的仓库(对于 CentOS 8 或以上版本,应将下面的 yum 都替换成 dnf):

# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/

# update the yum index:
sudo yum check-update

然后就可以像下面这样安装软件包,比如 openresty

sudo yum install -y openresty

如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:

sudo yum install -y openresty-resty

命令行工具 opmopenresty-opm 包里,而 restydoc 工具在 openresty-doc 包里头。

列出所有 openresty 仓库里头的软件包:

sudo yum --disablerepo="*" --enablerepo="openresty" list available

参考 OpenResty RPM 包页面获取这些包更多的细节。

对于 CentOS 8 及更新版本,我们只需要将上面的 yum 命令都替换成 dnf 即可。

1.2启动

查找文件路径

(24条消息) Linux下查找文件(find、grep命令)_GG_Bond19的博客-CSDN博客

find / -name "*openresty*"

 cd /usr/local/openresty

安装后先启动Nginx服务。默认80端口。

cd /usr/local/openresty/nginx/sbin
./nginx

![image-20221120173616814](F:\Data warehouse\picture\image-20221120173616814.png)

1.3检查防火墙80端口

开放80端口firewall-cmd --zone=public --add-port=80/tcp --permanent
停止防火墙:systemctl stop firewalld.service  
启动防火墙:systemctl start firewalld.service

后面的是找资料过程仅供参考

1.ping IP
2.telnet IP 端口
如果不通
vi /etc/sysconfig/iptables
打开端口
service iptables restart   --使设置生效

3.service iptables stop  --关闭防火墙

4.curl IP  --访问网页内容。

VMware虚拟机上配置nginx后,本机无法访问问题

https://blog.51cto.com/u_15064630/4528800

把nginx装在CentOS上,用本机访问虚拟机的时候却出现了不能访问的问题,查了资料以后,原来是防火墙的问题。

具体情况如下:

防火墙可以ping通虚拟机,虚拟机也可以ping通防火墙。

接着检查了服务器端的80端口是否可以访问的到:telnet 192.168.207.136 80, 结果访问不到,原来果真防火墙的问题。

做如下处理:

[root@localhost html]# /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT  
[root@localhost html]# /etc/init.d/iptables save  
[root@localhost html]# /etc/init.d/iptables restart

 

至此,OK了,主机已可访问虚拟机的nginx服务。

或者直接编辑防火墙配置文件

vim /etc/sysconfig/iptables

没有防火墙文件

https://blog.csdn.net/qq_28710983/article/details/79264789

1、 原因一般是没有配置过防火墙,在安装CentOS系统时也已经禁掉了防火墙。
这样会导致使用 service iptables start 语句启动防火墙无效果

2、随便写一条iptables命令配置个防火墙规则:(随便位置打这个命令)

iptables -P OUTPUT ACCEPT

3、保存iptables修改

service iptables save
如果不行,到/sbin目录下执行脚本
./iptables-save 


4、这时就可以看到/etc/sysconfig/iptables文件了


5、vim /etc/sysconfig/iptables打开文件,并在里面加入ssh的22端口并保存

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT


6、启动防火墙

service iptables start

注意事项:

如果使用SSH连上去修改这个配置的,先要加上22端口再起动防火墙,不然可能会导致ssh无法连接的悲剧

随便写一条iptables命令配置个防火墙规则:

iptables -P OUTPUT ACCEPT

1.4访问IP

Ctrl+F5强制刷新网页,避免缓存问题。也可能是Fn+F5

![image-20221120183736161](F:\Data warehouse\picture\image-20221120183736161.png)

1.5反向代理

修改后记得重启。

systemctl restart nginx

nginx -t
测试 nginx 配置是否有误

nginx -s reload
重载 nginx 配置

nginx -t && nginx -s reload
当 nginx 测试无误后重载 nginx 配置

nginx -T
测试并输出全部 nginx 配置

![image-20221120190527595](F:\Data warehouse\picture\image-20221120190527595.png)

cd /usr/local/openresty/nginx/conf
vim nginx.conf

nginx -s reload

有很多是注释,可以删掉,最后留下这些。html下是网页界面。

http:
    提供与 http 服务相关的一些配置参数。例如:是否使用 keepalive,是否使用 gzip 进行压缩等。
server:
  http 服务上支持若干虚拟主机。每个虚拟主机一个对应的 server 配置项,配置项里面包含该虚拟主机相关的配置。
location:
    http 服务中,某些特定的 URL 对应的一系列配置项。
upstream:
    实现反向代理的功能,将真正的请求转发到后端服务器上,并从后端服务器上读取响应,发回客户端。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;      #监听端口
        server_name  localhost;  #域名
        location / {
            root   html;
            index  index.html index.htm;
        }


        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

location /    --默认匹配所有/开头的请求
location =  路径  --等级最高,完全匹配
location ^~ 路径   --以路径开头的,次最优先
location ~ /\w 路径 --- \w正则匹配数字,字母,下划线,第三优先级

![image-20221120193040408](F:\Data warehouse\picture\image-20221120193040408.png)

请求转移。
proxy_pass  IP:端口;

例子:url后面加上/,这样如果/a没匹配到会自动匹配/的代理路径。
		location /a{
            proxy_pass  192.168.207.136:80/;
        }

        location /b/ {
            proxy_pass  192.168.207.136:81/;  --81是tomcat的界面
        }

![image-20221120193101552](F:\Data warehouse\picture\image-20221120193101552.png)

1.6负载均衡

events {
    ...
}
stream {
     # 引入 /etc/nginx/conf.d 目录下所有以 .tcp 结尾的文件
    include /etc/nginx/conf.d/*.tcp;

}
http {
      upstream egova {
          server 127.0.0.1:8080 weight=1;           --weight表示权重,默认为1
          server 127.0.0.1:8081 weight=6;
      }
      server {
		location /{
            proxy_pass  http://egova;    --- http:// 后面的要与upstream内容一样
     }
}

2.Nginx部署三台Tomcat集群

(25条消息) Nginx部署三台Tomcat集群详细操作步骤_这里是杨杨吖的博客-CSDN博客

每台服务器部署一个Tomcat

(25条消息) Tomcat集群搭建超详细_枫哥和java的博客-CSDN博客_tomcat 集群

一台服务器部署多个Tomcat:

(25条消息) Tomcat--集群配置_吴声子夜歌的博客-CSDN博客

(25条消息) 4台服务器集群搭建_两台服务器上搭建tomcat集群,实现session共享_weixin_39878745的博客-CSDN博客

Tomcat启动需要jdk.8080端口。

nginx只需在一台服务器上安装。

![在这里插入图片描述](F:\Data warehouse\picture\5bbd23d903fd4f419948a3ad34a7172c.png)

一、安装JDK

1、oracle官网下载JDK for linux版本,这里我使用的版本是

jdk-8u161-linux-x64.tar.gz

2、解压

 tar -xvf jdk-8u161-linux-x64.tar.gz

 mv jdk1.8.0_161/ jdk1.8

3、加入到环境变量

#打开profile

vim /etc/profile

#文件末尾加上如下两行

export JAVA_HOME=/root/jdk1.8

export PATH=$PATH:$JAVA_HOME/bin

#生效

source /etc/profile

4、验证

#输入java -version

[root@10-9-58-15 bin]# vim /etc/profile

[root@10-9-58-15 bin]# source /etc/profile

[root@10-9-58-15 bin]# java -version

java version "1.8.0_161"

Java(TM) SE Runtime Environment (build 1.8.0_161-b12)

Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

二、安装Tomcat

登陆 tomcat官网 https://tomcat.apache.org/

按照下图所示点击进行下载。注意:一定要下载8.5.51版本,因为对于tomcat8,小于此版本的存在AJP漏洞。

![f424ea0ebf68fe4bd5bcbfbb528ec6b5.png](F:\Data warehouse\picture\f424ea0ebf68fe4bd5bcbfbb528ec6b5.jpeg)

三、上传解压

Xftp上传后,进行解压操作

#解压

[root@10-9-58-15 ~]# unzip apache-tomcat-8.5.51.zip

#重命名目录

root@10-9-58-15 ~]# mv apache-tomcat-8.5.51 tomcat

四、为bin下脚本赋予权限

cd /root/tomcat/bin

chmod u+x *.sh

五、配置CATALINA_HOME、CATALINA_HOME目录

#编辑catalina.sh

vim catalina.sh

#使用vim 打开后,将如下参数写入

CATALINA_HOME=/root/tomcat

CATALINA_BASE=/root/tomcat

![5210983c26e6423457faf078df05c874.png](F:\Data warehouse\picture\5210983c26e6423457faf078df05c874.jpeg)

三、集群配置

![3e57e203aaa0621c9afcf278814eb204.png](F:\Data warehouse\picture\3e57e203aaa0621c9afcf278814eb204.jpeg)

![ceb2a8bf9edd19f9e93e34ccb33d42b5.png](F:\Data warehouse\picture\ceb2a8bf9edd19f9e93e34ccb33d42b5.jpeg)

![e8322e00a7f9bf4785cf2a7349533dae.png](F:\Data warehouse\picture\e8322e00a7f9bf4785cf2a7349533dae.jpeg)

关键部分来了,需要将如下地址进行修改

![2ed640b7ed1dad1cc42e3dc3ee375025.png](F:\Data warehouse\picture\2ed640b7ed1dad1cc42e3dc3ee375025.jpeg)

channelSendOptions="8">

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"/>

address="228.0.0.4"

port="45564"

frequency="500"

dropTime="3000"/>

address="auto"

port="4000"

autoBind="100"

selectorTimeout="5000"

maxThreads="6"/>

filter=""/>

tempDir="/tmp/war-temp/"

deployDir="/tmp/war-deploy/"

watchDir="/tmp/war-listen/"

watchEnabled="false"/>

四、实现seesion复制

在应用程序的web.xml配置文件,需要有这个标签

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

version="3.0"

metadata-complete="true">

五、检查防火墙

#查看现在的防火墙状态

iptables -vnL

#可适当使用如下指令,开放端口访问

iptables -I INPUT -p tcp --dport 8080 -j ACCEPT

iptables -I INPUT -p udp --dport 45564 -j ACCEPT

iptables -I INPUT -p tcp --dport 4000 -j ACCEPT

六、启动你的程序吧

修改8080页面的标题。

![image-20221120205402492](F:\Data warehouse\picture\image-20221120205402492.png)

![image-20221120205447741](F:\Data warehouse\picture\image-20221120205447741.png)

PS:在测试Nginx轮询效果时候,如果点击浏览器刷新按钮刷新页面没有反应时候,可以按住ctrl然后点刷新按钮强制刷新试试。因为有缓存会出现这问题。

3、一台服务器部署多个Tomcat

(25条消息) Tomcat集群部署流程流程_kerry_x的博客-CSDN博客

由于单台Tomcat的承载能力是有限的,当我们的业务系统用户量比较大,请求压力比较大时,单台Tomcat是扛不住的,这个时候,就需要搭建Tomcat集群,而目前比较流行的做法就是通过nginx来实现Tomcat集群的负载均衡。

在服务器上,安装两台tomcat,然后分别修改tomcat服务器的端口号:

			第一台      第二台
8005 -----> 8015 ----> 8025 (SHUTDOWN端口)
8080 -----> 8888 ----> 9999 (HTTP端口)
8009 -----> 8019 ----> 8029 (AJP端口)

修改tomcat欢迎页面:

![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbGRfX19wbGF5,size_16,color_FFFFFF,t_70-166895028558158.png)

![在这里插入图片描述](F:\Data warehouse\picture\20200328174753419.png)

Nginx配置

	upstream cluster{
		server 127.0.0.1:8888;
		server 127.0.0.1:9999;
	}

	server {
        listen       99;
        server_name  127.0.0.1;

		location / {
			proxy_pass http://cluster/;
		}
	}

测试:启动nginx和两个tomcat,访问localhost:99

负载均衡策略

  1. 轮询:最基本的配置方法,它是upstream模块默认的负载均衡均衡策略。每个请求会按事件顺序逐一分配到不同的后端服务器
	upstream cluster{
		ip_hash;
		server 127.0.0.1:8888 weight=3;
		server 127.0.0.1:9999 weiht=1;
	}
参数 说明
fail_timeout 于max_fails结合使用
max_fails 设置在fail_timeout参数设置的时间内最大失败次数,如果这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器停机了
fail_time 服务器会被认为停机的时间长度,默认为10s
backup 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里
down 标记服务器停机了

weight参数用于指定参与轮询的几率,weight的默认值为1;weight于访问几率成正比,次策略比较适合服务器的硬件配置差别比较大的情况。

ip_hash:指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session回话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

Session共享方案

在Tomca集群中,如果应用需要用户进行登录,那么这个时候,由于tomcat做了负载均衡,则用户登录并访问应用系统时,就会出现问题。
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbGRfX19wbGF5,size_16,color_FFFFFF,t_70.png)

解决上述问题,有以下几种方案:

一. ip_hash策略

一个用户发起的请求,只会请求到同一个tomcat上。那么这个时候就不存在session共享问题了。

二. Session复制

在server.xml中的<Engine>标签中添加如下配置(每个tomcat节点都需要):

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
1

在web应用的web.xml配置中添加如下配置(部署的每个web应用都需要):

<distributable/>
1

注意:该方案只适用于小型项目,大型集群项目并不使用,因为session的复制需要时间和资源耗费。

三. SSO-单点登录

单点登录(Single Sign On),简称SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有互相信任的应用系统,也是用来解决集群环境Session共享的方案之一。

![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NvbGRfX19wbGF5,size_16,color_FFFFFF,t_70-166894935450945.png)

单点登录(SSO)看这一篇就够了-阿里云开发者社区 (aliyun.com)

单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。

![image](F:\Data warehouse\picture\721f02ebe06639e6232b59535d6423db75086693.png)

如图所示,图中有4个系统,分别是Application1、Application2、Application3、和SSO。Application1、Application2、Application3没有登录模块,而SSO只有登录模块,没有其他的业务模块,当Application1、Application2、Application3需要登录时,将跳到SSO系统,SSO系统完成登录,其他的应用系统也就随之登录了。这完全符合我们对单点登录(SSO)的定义。

技术实现

在说单点登录(SSO)的技术实现之前,我们先说一说普通的登录认证机制。
![image](F:\Data warehouse\picture\555f1a6856468578020ea0486f563b3633813050.png)

如上图所示,我们在浏览器(Browser)中访问一个应用,这个应用需要登录,我们填写完用户名和密码后,完成登录认证。这时,我们在这个用户的session中标记登录状态为yes(已登录),同时在浏览器(Browser)中写入Cookie,这个Cookie是这个用户的唯一标识。下次我们再访问这个应用的时候,请求中会带上这个Cookie,服务端会根据这个Cookie找到对应的session,通过session来判断这个用户是否登录。如果不做特殊配置,这个Cookie的名字叫做jsessionid,值在服务端(server)是唯一的。

同域下的单点登录

一个企业一般情况下只有一个域名,通过二级域名区分不同的系统。比如我们有个域名叫做:a.com,同时有两个业务系统分别为:app1.a.com和app2.a.com。我们要做单点登录(SSO),需要一个登录系统,叫做:sso.a.com。

我们只要在sso.a.com登录,app1.a.com和app2.a.com就也登录了。通过上面的登陆认证机制,我们可以知道,在sso.a.com中登录了,其实是在sso.a.com的服务端的session中记录了登录状态,同时在浏览器端(Browser)的sso.a.com下写入了Cookie。那么我们怎么才能让app1.a.com和app2.a.com登录呢?这里有两个问题:

  • Cookie是不能跨域的,我们Cookie的domain属性是sso.a.com,在给app1.a.com和app2.a.com发送请求是带不上的。
  • sso、app1和app2是不同的应用,它们的session存在自己的应用内,是不共享的。

![image](F:\Data warehouse\picture\4e31c204eea22ee07154df928a5ff5350da03d7a.png)

那么我们如何解决这两个问题呢?针对第一个问题,sso登录以后,可以将Cookie的域设置为顶域,即.a.com,这样所有子域的系统都可以访问到顶域的Cookie。我们在设置Cookie时,只能设置顶域和自己的域,不能设置其他的域。比如:我们不能在自己的系统中给baidu.com的域设置Cookie。

Cookie的问题解决了,我们再来看看session的问题。我们在sso系统登录了,这时再访问app1,Cookie也带到了app1的服务端(Server),app1的服务端怎么找到这个Cookie对应的Session呢?这里就要把3个系统的Session共享,如图所示。共享Session的解决方案有很多,例如:Spring-Session。这样第2个问题也解决了。

同域下的单点登录就实现了,但这还不是真正的单点登录。

不同域下的单点登录

同域下的单点登录是巧用了Cookie顶域的特性。如果是不同域呢?不同域之间Cookie是不共享的,怎么办?

这里我们就要说一说CAS流程了,这个流程是单点登录的标准流程。
![cas_flow_diagram](F:\Data warehouse\picture\dcb743204f8a201be53df5338fc34affe5fa1059.png)

上图是CAS官网上的标准流程,具体流程如下:

  1. 用户访问app系统,app系统是需要登录的,但用户现在没有登录。
  2. 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。
  3. 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
  4. SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
  5. app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
  6. 验证通过后,app系统将登录状态写入session并设置app域下的Cookie。

至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问app2系统时的流程。

  1. 用户访问app2系统,app2系统没有登录,跳转到SSO。
  2. 由于SSO已经登录了,不需要重新登录认证。
  3. SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
  4. app2拿到ST,后台访问SSO,验证ST是否有效。
  5. 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。

这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。

总结

单点登录(SSO)的所有流程都介绍完了,原理大家都清楚了。总结一下单点登录要做的事情:

  • 单点登录(SSO系统)是保障各业务系统的用户资源的安全 。
  • 各个业务系统获得的信息是,这个用户能不能访问我的资源。
  • 单点登录,资源都在各个业务系统这边,不在SSO那一方。 用户在给SSO服务器提供了用户名密码后,作为业务系统并不知道这件事。 SSO随便给业务系统一个ST,那么业务系统是不能确定这个ST是用户伪造的,还是真的有效,所以要拿着这个ST去SSO服务器再问一下,这个用户给我的ST是否有效,是有效的我才能让这个用户访问。

4.Apache+Tomcat 集群

(25条消息) Tomcat集群搭建超详细_枫哥和java的博客-CSDN博客_tomcat 集群

1.1集群的分类
集群主要分成三大类:高可用集群(High Availability Cluster/HA), 负载均衡集群(Load Balance Cluster),高性能计算集群(High Performance Computing Cluster/HPC)
(1) 高可用集群(High Availability Cluster/HA):一般是指当集群中有某个节点失效的情况下,其上的任务会自动转移到其他正常的节点上。还指可以将集群中的某节点进行离线维护再上线,该过程并不影响整个集群的运行。常见的就是2个节点做 成的HA集群,有很多通俗的不科学的名称,比如"双机热备", "双机互备", "双机",高可用集群解决的是保障用户的应用程序持续对外提供服 务的能力。
(2) 负载均衡集群(Load Balance Cluster):负载均衡集群运行时一般通过一个或者多个前端负载均衡器将工作负载分发到后端的一组服务器上,从而达到将工作负载分发。这样的计算机集群有时也被称为服务器群(Server Farm)。一般web服务器集群、数据库集群 和应用服务器集群都属于这种类型。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器 上。从检查其他服务器状态这一点上 看,负载均衡和容错集群很接近,不同之处是数量上更多。
(3) 高性能计算集群(High Performance Computing Cluster/HPC):高性能计算集群采用将计算任务分配到集群的不同计算节点而提高计算能力,因而主要应用在科学计算领域。这类集群致力于提供单个计算机所不能提供的强大的计算能力

1.2 Tomcat集群配置的优缺点
通常配置tomcat集群有三种方式:使用DNS轮询,使用apache r-proxy代理方式,使用apache mod_jk方式。
(1)DNS轮询的缺点:当集群中某台服务器停止之后,用户由于dns缓存的缘故,便无法访问服务,必 须等到dns解析更新,或者这台服务器重新启动。还有就是必须把集群中的所有服务端口暴露给外界,没有用apache做前置代理的方式安全,并 且占用大量公网IP地址,而且tomcat还要负责处理静态网页资源,影响效率。优点是集群配置最简单,dns设置也非常简单。
(2)R- proxy的缺点:当其中一台tomcat停止运行的时候,apache仍然会转发请求过去,导致502网关错误。但是只要服务器再启动就不存 在这个问题。
(3)mod_jk方式的优点是,Apache 会自动检测到停止掉的tomcat,然后不再发请求过去。缺点就是,当停 止掉的tomcat服务器再次启动的时候,Apache检测不到,仍然不会转发请求过去。
R-proxy和mod_jk的共同优点是.可 以只将Apache置于公网,节省公网IP地址资源。可以通过设置来实现Apache专门负责处理静态网页,让Tomcat专门负责处理jsp和 servlet等动态请求。共同缺点是:如果前置Apache代理服务器停止运行,所有集群服务将无法对外提供。R-proxy和 mod_jk对静态页面请求的处理,都可以通设置来选取一个尽可能优化的效果。这三种方式对实现最佳负载均衡都有一定不足,mod_jk相对好些,可以通过设置lbfactor参数来分配请求任务。

1.3 Apache+Tomcat
Apache+ Tomcat整合的目标:
(1) 可以提高整体web服务器性能,将动态页面交给tomcat处理,将静态文件交给apache处理,可以大大提高服务器的静态文件处理性能。
(2) 可以实现web服务器的负载均衡,服务器可采用集群的方式来响应客户端请求。Apache的作用是做代理,将请求分发给各个tomcat处理,tomcat作为集群服务器处理请求。这样可以提高整体web服务器性能和访问量。
(3) 可以实现无缝升级应用程序和容错处理,在tomcat集群中如果有一个tomcat挂掉了,用户还可以通过其他tomcat来进行访问,同时如果我们想升级应用程序,我们可以通过升级每个tomcat的应用程序来实现升级,在升级的过程中不会影响web服务器的访问。

下面就是以1个apache+2个tomcat通过mod_jk配置集群。

1.4环境说明
所需软件包:
JDK:jdk-6u7-linux-i586.bin
Apache:httpd-2.2.19.tar.gz
Tomcat:apache-tomcat-7.0.16.tar.gz
Mod_jk:mod_jk-1.2.31-httpd-2.2.x.so

将下载好的软件保存到服务器上:目录为/usr/tomcattest,也可以建立其他文件夹保存。

4.1JDK安装

1)  拷贝软件包  
[root@172-30-4-6 ~]# mkdir /usr/java     #创建jdk安装目录  
[root@172-30-4-6 ~]# cd /usr/tomcattest   #进入jdk软件包目录  
[root@172-30-4-6 tomcattest]# cp jdk-6u7-linux-i586.bin /usr/java  #将jdk安装文件拷贝到安装目录  
  
2)  安装JDK  
[root@172-30-4-6 tomcattest]# cd /usr/java  #进入jdk安装目录  
[root@172-30-4-6 java]# ./ jdk-6u7-linux-i586.bin   #执行安装jdk文件  
  
3)  配置环境变量  
 [root@172-30-4-6 java] vim /etc/profile   #修改系统环境变量文件  
#添加内容如下:  
export JAVA_HOME=/usr/java/jdk1.6.0_02  
         export JAVA_BIN=/usr/java/jdk1.6.0_02/bin  
        export PATH=$PATH:$JAVA_HOME/bin  
        export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
            export JAVA_HOME JAVA_BIN PATH CLASSPATH  
[root@172-30-4-6 profile]# cd /usr/bin     
    [root@172-30-4-6 profile]# ln -s -f /usr/java/jdk1.6.0_02/jre/bin/java   
     [root@172-30-4-6 profile]# ln -s -f /usr/java/jdk1.6.0_02/bin/javac    
  
4)  测试  
[root@172-30-4-6 profile]# java -version         #查看java安装版本  
显示结果:java version "jdk1.6.0_02"  

4.2 Apache安装

1)  解压  
[root@172-30-4-6 ~]# cd /usr/tomcattest   #进入apache软件包目录  
[root@172-30-4-6 tomcattest]# tar -zxvf httpd-2.2.19.tar.gz  #解压apache安装文件  
  
2)  安装  
[root@172-30-4-6 tomcattest]# cd httpd-2.2.19      #进入apache安装目录  
[root@172-30-4-6 httpd-2.2.19]# ./configure --prefix=/usr/apache   # configure参数可以自己根据需要修改,可以使用—help获得相关命令参数信息。  
[root@172-30-4-6 httpd-2.2.19]# make    #编译  
[root@172-30-4-6 httpd-2.2.19]# make install   #安装  
  
3)  启动  
[root@172-30-4-6 httpd-2.2.19]# cd /usr/apache/  #进入apache安装目录  
[root@172-30-4-6 apache]# ./bin/apachectl start   #启动apache服务器  
      
4)  测试  
访问apache服务器:http://172.30.4.6  
响应结果:It works!  #apache服务器安装成功  

4.3Tomcat安装

1.  解压  
[root@172-30-4-6 ~]# cd /usr/tomcattest   #进入tomcat软件包目录  
[root@172-30-4-6 tomcattest]# tar –zxvf apache-tomcat-7.0.16.tar.gz  #解压tomcat安装包  
  
2.  安装  
[root@172-30-4-6 tomcattest]# cp -P apache-tomcat-7.0.16 /usr/tomcat1  #拷贝tomcat1  
[root@172-30-4-6 tomcattest]# cp -P apache-tomcat-7.0.16 /usr/tomcat2  #拷贝tomcat2  
      
3.  配置  
因为该例子是在同一台服务器上安装两个tomcat服务器,避免服务器端口使用冲突,tomcat1端口采用默认配置,tomcat2端口需要重新配置。  
[root@172-30-4-6 tomcattest]# cd /usr/tomcat2/conf   #进入tomcat2配置目录,可修改server.xml配置文件  
[root@172-30-4-6 tomcattest]# cd /usr/tomcat1/conf   #进入tomcat1配置目录,可修改server.xml配置文件  
[root@172-30-4-6 conf]# vim server.xml        #修改tomcat2配置文件  
(1) 修改server端口号  
#tomcat1 默认配置  
<Server port="8005" shutdown="SHUTDOWN">  
#tomcat2 修改端口号为9005  
<Server port="9005" shutdown="SHUTDOWN">  
  
(2) 修改HTTP connector端口号  
#tomcat1默认配置  
<Connector port="8080" protocol="HTTP/1.1"   
               connectionTimeout="20000"   
               redirectPort="8443" />  
    #tomcat2 修改端口号为9080  
    <Connector port="9080" protocol="HTTP/1.1"   
               connectionTimeout="20000"   
               redirectPort="8443" />  
  
(3) 修改 AJP connector 端口号  
#tomcat1 默认配置  
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />  
#tomcat2 修改端口号9009  
<Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />  
  
(4) 修改 engine 名称  
#tocmat1 修改jvmRoute=”tomcat1”  
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">  
#tocmat2 修改jvmRoute=”tomcat2”  
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">  
  
4.  启动  
[root@172-30-4-6 tomcattest]# /usr/tomcat1/bin/startup.sh    #启动tomcat1  
[root@172-30-4-6 tomcattest]# /usr/tomcat1/bin/startup.sh    #启动tomcat2  
  
5.  测试  
#tomcat1测试  
http://172.30.4.6:8080  
#tomcat2 测试  
http://172.30.4.6:9080  
  
结果:显示tomcat首页

4.4集群配置

4.4.1 apache+mod_jk+tomcat配置

1,  httpd.conf的配置   
[root@172-30-4-6 ~]# cd /usr/apache/conf         #进入apache配置目录  
[root@172-30-4-6 conf]# vim httpd.conf         #修改httpd.conf配置文件  
        Include conf/mod_jk.conf            #增加include配置  
  
2,  mod_jk.conf的配置  
[root@172-30-4-6 conf]# touch mod_jk.conf      #创建mod_jk.conf文件  
[root@172-30-4-6 conf]# vim mod_jk.conf       #修改mod_jk配置  
#mod_jk 配置mod_jk包  
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.x.so  
#workers 配置工作负责文件  
JkWorkersFile conf/workers.properties  
#jk log 配置jk日志文件  
JkLogFile logs/mod_jk.log  
#jk log leve 配置日志级别  
JkLogLevel info  
# 配置jk日志内存共享  
JkShmFile logs/mod_jk.shm  
#balancer 配置负载均衡模式  
JkMount /*.jsp balancer  
  
[root@172-30-4-6 conf]# cp /usr/tomcattest/mod_jk-1.2.31-httpd-2.2.x.so /usr/apache/modules    #将mod_jkb包拷贝到apache的modules目录下  
  
3,  workers.properties的配置  
[root@172-30-4-6 conf]# touch workers.properties      #创建worker.properties文件  
[root@172-30-4-6 conf]# vim workers.properties  
#tomcat1的配置  
worker.tomcat1.port=8009  
worker.tomcat1.host=172.30.4.6  
worker.tomcat1.reference=worker.template  
worker.tomcat1.activation=A  
#worker.tomcat1.lbfactor=1  
#tomcat2 的配置  
worker.tomcat2.port=9009  
worker.tomcat2.host=172.30.4.6  
worker.tomcat2.reference=worker.template  
worker.tomcat2.activation=A  
#worker.tomcat2.lbfactor=1  
worker.list=balancer  
#balancer 负载配置  
worker.balancer.type=lb  
worker.balancer.balance_workers=tomcat1,tomcat2  
worker.balancer.sticky_session=1  
#tempalte 负载模板配置  
worker.template.type=ajp13  

4.4.2 测试

1) 创建测试项目

新建一个项目:项目名称都为TestTomcat
新建一个jsp页面:名称为testjsp.jsp

<%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>欢迎访问</title>  
</head>  
<body>  
<%  
System.out.println(new Date()+"=============tomcat1=================");  
%>  
tomcat1=======<%=new Date()%>  
</body>  
</html>  

2)发布项目

(1)将测试项目打包,包名为TestTomcat.war,将测试项目发布到tomcat1服务器上 。
(2)修改项目testjsp.jsp文件

<%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>欢迎访问</title>  
</head>  
<body>  
<%  
System.out.println(new Date()+"=============tomcat2=================");  
%>  
tomcat2=======<%=new Date()%>  
</body>  
</html>  

(3)将修改后的项目TestTomcat.war发布到tomcat2服务器上

3)测试集群

分别在不同的客户端上访问apache代理服务器。
http://172.30.4.6/TestTomcat/testjsp.jsp

访问结果:
tomcat2=Wed Jun 29 13:25:03 CST 2011
或者
tomcat1
Wed Jun 29 13:26:03 CST 2011

4.5 Session复制

在Tomcat集群中实现session同步,可以通过session共享和复制来实现,下面以session复制来实现session同步。

4.5.1 Session复制配置

1, Tomcat中server.xml的配置
[root@172-30-4-6 ~]# cd /usr/tomcat1/conf #进入tomcat配置目录
[root@172-30-4-6 conf]# vim server.xml #修改server.xml配置
# 在后面加上以下配置:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"    
                 channelSendOptions="8">    
          
          <Manager className="org.apache.catalina.ha.session.DeltaManager"    
                   expireSessionsOnShutdown="false"    
                   notifyListenersOnReplication="true"/>    
    
          <Channel className="org.apache.catalina.tribes.group.GroupChannel">    
            <Membership className="org.apache.catalina.tribes.membership.McastService"    
                        address="228.0.0.4"    
                        port="45564"    
                        frequency="500"    
                        dropTime="3000"/>    
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"    
                      address="auto"   #默认为auto,改为自己的IP  
                      port="4000"    #同一台服务器上的tomcat必须修改为不同的端口,tomcat1修改为4001,tomcat2修改为4002。  
                      autoBind="100"    
                      selectorTimeout="5000"    
                      maxThreads="6"/>    
    
            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">    
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>    
            </Sender>    
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>    
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>    
          </Channel>    
    
          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"    
                 filter=""/>    
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>    
    
          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"    
                    tempDir="/tmp/war-temp/"    
                    deployDir="/tmp/war-deploy/"    
                    watchDir="/tmp/war-listen/"    
                    watchEnabled="false"/>    
    
          <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>    
          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>    
        </Cluster>  

#分别给集群中每个tomcat在Engine后添加cluster配置,需要修改红色部分的配置:
address=”172.30.4.6” #本机IP地址
port=”4001” #同一机器需要修改端口号,tomcat1为4001,tomcat2为4002

2, Tomcat应用项目中web.xml的配置
[root@172-30-4-6 ~]# cd /usr/tomcat1/webapps #进入到web应用项目中
[root@172-30-4-6 webapps]# vim /TestTomcat/WEB-INF/web.xml #修改web.xml
#在web.xml文件中加入

<!--此应用将与群集服务器复制Session-->  
<distributable/>  

4.5.2 测试

1, 修改项目文件
[root@172-30-4-6 ~]# cd /usr/tomcat1/webapps #进入到web应用项目中
[root@172-30-4-6 webapps]# vim /TestTomcat/ testjsp.jsp #修改testjsp.jsp

<%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>欢迎访问</title>  
</head>  
<body>  
<%  
System.out.println(new Date()+"=============tomcat1=================");  
session.setAttribute("name", "tomcat1");  
%>  
tomcat1=======<%=new Date()%>===<%=session.getId() %>===<%=session.getAttribute("name") %>  
</body>  
</html>  

[root@172-30-4-6 ~]# cd /usr/tomcat2/webapps #进入到web应用项目中
[root@172-30-4-6 webapps]# vim /TestTomcat/ testjsp.jsp #修改testjsp.jsp

<%@ page language="java" import="java.util.Date"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>  
  
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>欢迎访问</title>  
</head>  
<body>  
<%  
System.out.println(new Date()+"=============tomcat2=================");  
%>  
tomcat2=======<%=new Date()%>===<%=session.getId() %>===<%=session.getAttribute("name") %>  
</body>  
</html>  

2, 测试
(1) 访问http://172.30.4.6/TestTomcat/testjsp.jsp
页面显示结果为:
tomcat1=Thu Jun 30 11:24:10 CST 201127E35C1389F5595A17F8B5FD00561EDA.tomcat1===tomcat1
(2) 关闭tomcat1
[root@172-30-4-6 ~]# /usr/tomcat1/bin/shutdown.sh

(3) 访问http://172.30.4.6/TestTomcat/testjsp.jsp
页面显示结果为:
tomcat2Thu Jun 30 11:37:42 CST 2011=605087B0015E978752640DB389B874A2.tomcat2===tomcat1
#证明session复制成功

5.搭建Keepalived+Nginx高可用负载均衡服务器

(24条消息) 搭建Keepalived+Nginx高可用负载均衡服务器_小白*进阶ing的博客-CSDN博客

一、服务器搭建策略

单机模式: 只有一台应用服务器,组成一个单机模式
优点:简单方便(搭建、运营、维护)
缺点:不能出故障(停电、断网、系统崩溃、硬件老化、性能瓶颈)
应用场景:小型项目(几十个人)
集群(cluster)模式:
有一个应用服务器集群(cluster),由很多应用服务器组成一个集群

二、服务器三高

高可用: 服务器能否能24*365不间断提供服务,服务器容灾性高
高并发: 同一时间上,服务器能够同时容纳的用户连接数
高性能: 服务器处理用户请求的速度,服务器的计算能力

三、服务器升级

纵向升级(对单台服务器做配置提升):
eg:换更强的cpu,加大内存和磁盘,加大网络带宽……
横向升级(堆服务器的数量):
节约成本,很廉价的机器都可以推入到集群(更受欢迎)

四、如何解决负载均衡高可用问题?

做备份
当主负载均衡服务器没有问题时,处于备用;当其出现问题时,备用服务器能够第一时间内顶替主负载均衡服务器的位置
难点:备份很容易,但是ip地址如何快速切换?

五、Keepalived实现备用机无缝顶替主机的原理:

多台nginx-----keepalived集群
keepalived集群中至少有两台机器
两台:一主一从
三台:一主二从…以此类推
为keepalived集群设置一个唯一的虚拟IP,虚拟IP默认会与master机器绑定在一起
即master机器将会有两个ip地址,一个是自己的源ip,一个是keepalived给的虚拟IP地址
非抢占模式下:
当master机器出现故障时,keepalived第一时间收回虚拟IP地址并分配给slave机器,此时相当于slave机器升级为master机器,此时用户只需要记住keepalived的虚拟IP地址即可
若master机器恢复正常,则不会被分配虚拟IP地址,直到slave机器出现故障后,master才会被分配虚拟IP地址

六、搭建Keepalived+Nginx高可用负载均衡服务器

1、设置keepalived负载均衡服务器
准备2台Nginx (一主一从),分别安装keepalived

yum -y install keepalived

查看网卡名字
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw==,size_20,color_FFFFFF,t_70,g_se,x_16.png)
打开配置文件

vim etc/keepalived/keepalived.conf

找到第19行
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692441.png)
设置一主一从,设置对应优先级(主>备),设置虚拟IP
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw
,size_10,color_FFFFFF,t_70,g_se,x_16.png)
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw==,size_9,color_FFFFFF,t_70,g_se,x_16.png)
删除这两行, 否则虚拟IP会绑定失败

 13 vrrp_skip_check_adv_addr
 14 vrrp_strict

启动keepalived, 得到虚拟IP地址

 systemctl start keepalived

![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692452.png)
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw
,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692453.png)
重启

 systemctl restart keepalived
1

停止, 则会收回虚拟IP地址

 systemctl stop keepalived
1

![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692454.png)
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw
,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692455.png)
2、让keepalived监视nginx运行状态
在/etc/keepalived目录中编写一个可执行的脚本check_nginx.sh让keepalived监视nginx运行状态

#!/bin/bash
	A=`ps -C nginx --no-header |wc -l`        
	if [ $A -eq 0 ];then                            
	    /usr/local/nginx/sbin/nginx                
	    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
	        exit 1
	    else
	        exit 0
	    fi
	else
	    exit 0
	fi
123456789101112

检查nginx是否已经启动(ps任务管理器中是否有nginx进程)
IF nginx已经启动,keepalived认为当前机器没有问题,exit 0
IF nginx未启动,keepalived尝试去启动nginx
IF 能够启动成功nginx,keepalived认为当前机器没有问题,exit 0
IF 不能启动成功nginx,keepalived认为当前机器有问题,exit 1

此时nginx不需要我们自己启动,交给keepalived帮助我们去启动它
直接执行脚本显示权限不够
![在这里插入图片描述](F:\Data warehouse\picture\87c33ec4da224cd2baa88be469f7bbc5.png)
需要授予权限,绿色代表有执行权限
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw==,size_18,color_FFFFFF,t_70,g_se,x_16.png)
在执行执行check_nginx.sh脚本之前,nginx未启动
![在这里插入图片描述](F:\Data warehouse\picture\8b5c5ddee4574a8298ba3b8234fea3ec.png)
在执行check_nginx.sh脚本之后,则nginx已经被启动了
![在这里插入图片描述](F:\Data warehouse\picture\dcbcc38829d14204b6c748d05a054260.png)
打开keepalived.conf

 16 vrrp_script check_nginx {   #定义一个策略,策略名为"check_nginx"
 17    script "/etc/keepalived/check_nginx.sh" #执行一次/etc/keepalived/check_nginx.sh脚本文件
 18    interval 1  #每隔1秒钟
 19    weight -20  #如果发现nginx启动失败了,将当前的机器的priority-20
 20 }
 21 vrrp_instance VI_1 {
 22     state MASTER
 23     interface ens33
 24     virtual_router_id 51
 25     priority 100
 26     advert_int 1
 27     authentication {
 28         auth_type PASS
 29         auth_pass 1111
 30     }
 31     track_script {   #指定keepalived跟踪策略为 "check_nginx"
 32         check_nginx
 33     }
 34     virtual_ipaddress {
 35         192.168.20.100
 36     }
 37 }
12345678910111213141516171819202122

先同时启动nginx

check_nginx.sh
1

再同时启动keepalived 虚拟IP默认在MASTER机器

systemctl stop keepalived
systemctl start keepalived
12

![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692466.png)
![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw
,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692467.png)

七、设置nginx和tomcat开机自动启动

nginx启动命令

/usr/local/nginx/sbin/nginx
./nginx                       # ./代表从当前目录找nginx
12

nginx停止命令

/usr/local/nginx/sbin/nginx -s quit
./nginx -s quit
12

tomcat启动命令

/usr/local/tomcat/bin/startup.sh
./startup.sh
12

tomcat停止命令

/usr/local/tomcat/bin/shutdown.sh
./shutdown.sh
12

设置nginx和tomcat开机自动启动要告诉操作系统nginx启动命令在哪,tomcat启动命令在哪
1、设置可以在任何目录中使用 systemctl [操作] nginx 来操作 nginx 程序
创建nginx.service服务文件/lib/systemd/system/nginx.service

cd /lib/systemd/system   //存放由操作系统管理的启动程序
vim nginx.service     //创建一个nginx服务文件
12

写入以下内容

[Unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
12345678910111213

创建好这个服务文件后,启动nginx就可以在任何目录中使用
systemctl [操作] nginx.service/nginx

systemctl stop nginx        #停止
systemctl restart nginx    #重启
systemctl status nginx     #状态
systemctl enable nginx     #允许开机自动启动
systemctl disable nginx    #禁止开机自动启动(默认)
12345

![在这里插入图片描述](F:\Data warehouse\picture\watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5bCP55m9Kui_m-mYtmluZw==,size_20,color_FFFFFF,t_70,g_se,x_16-16689339692468.png)
2、设置可以在任何目录中使用 systemctl [操作] tomcat 来操作 tomcat 程序
创建tomcat.service服务文件/lib/systemd/system/tomcat.service

cd /lib/systemd/system   //存放由操作系统管理的启动程序
vim tomcat.service     //创建一个tomcat服务文件
12

写入以下内容

[Unit]
Description=Apache Tomcat 8
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target
12345678910111213

创建好这个服务文件后,启动tomcat就可以在任何目录中使用
systemctl [操作] tomcat.service/tomcat

systemctl stop tomcat       #停止
systemctl restart tomcat    #重启
systemctl status tomcat     #状态
systemctl enable tomcat     #允许开机自动启动
systemctl disable tomcat    #禁止开机自动启动(默认)
12345

八、yum是什么?

全称 Yellow dog Updater,Modified 是一个RedHat和Fedora在Centos系统中创建的软件安装包管理器
在 /etc/yum.repos.d 这个目录中有yum源文件
eg: Centos-Base.repo 文件中有很多mirror地址,即yum的远程仓库地址

yum search 搜索软件安装包名
yum -y install 安装软件安装包名
12

注:使用yum指令需要联网

九、为什么keepalived (双机热备服务)可以直接使用systemctl 操作 keepalived?

因为 keepalived 是使用yum -y install keepalived进行安装的程序,使用yum安装程序,会自动帮你安装好程序和写程序的服务文件/lib/systemd/system/keepalived.service,而nginx、tomcat是我们自己手动下载安装包进行安装的程序
![在这里插入图片描述](F:\Data warehouse\picture\56387d8b2e9e4b848a9cf083a4f0d330.png)
![在这里插入图片描述](F:\Data warehouse\picture\cf028b1a0d624bc493b90843da7afe9e.png)
为什么network (网卡服务)可以直接使用systemctl 操作 network?
为什么firewalld (防火墙服务)可以直接使用systemctl 操作 firewalld?
systemctl stop firewalld 关闭防火墙 = 开放了所有的端口 ≠ 外界可以从任意端口进入系统(还要看是否有服务程序正在监听该端口)
防火墙这种服务的关闭并不是永久关闭,开机后会自动启动(默认)

标签:tomcat,nginx,30,Nginx11,集群,服务器,自学,root
From: https://www.cnblogs.com/asoul/p/16909750.html

相关文章

  • 自学 TypeScript 第三天 使用webpack打包 TS 代码
    前言:大家好啊,昨天介绍了TS编译器的配置,但在我们实际开发当中直接使用TS编译器去编译代码的情况会有,但没有很多,因为我们在开发大型项目的时候,一般我们都会用到打包工具......
  • [转载]理工科硕士自学ICEM网格划分的思考和感悟
    一、写在前面燃煤电厂选择性催化还原(SCR)装置是电厂污染物控制装置中重要的组成部分。对于SCR喷氨格栅(AIG)安装位置的选择和导流板的优化设计,一直以来都是热工类专业中“......
  • 自学Java注意,注意细节快速掌握
    自学Java必须注意的问题    第一,刚开始学Java编程的时候,确实挺嘈人的,一个非常小的问题,可能就是一个字母拼错了,你就是找不出问题在哪里,这是每个初学者都会面临的问......
  • 自学 TypeScript 第二天 编译选项
    前言:昨天我们学习了TS的数据类型,不知道大家回去以后练习没练习,如果你练习了一定会发现一个问题,我们的TS好像和JS不太一样JS写完之后直接就可以放到页面上,就可以用......
  • Java自学,要有技巧的学
    学习Java是有一定技巧和方法的,钻牛角尖的去学习它,只能让你感觉到费神费力,最终陷入到无穷无尽的细枝末节之中。然后渐渐的消磨掉你的耐心,直到你放弃。  学习的过程都是......
  • 来自学长的字符串2
    我们抬头仰望同一片星空,在万家灯火熄灭的时候……本来打算先改考试题在再finish,结果鹤了一下午+半个晚上也没鹤对,鹤的T2还被卡了却依然不知道为什么那个贪心是假的……......
  • 来自学长的字符串
    FedyathePotterStrikesBack一上午过去了……关于当前时刻的所有子串,它的前缀提前算出来的答案可以直接加,所以只考虑在原有的答案上修改最后一个i添加的贡献,发现他是......
  • 零基础自学javase黑马课程第一天----算术运算符
    零基础自学javase黑马课程第一天----算术运算符✨欢迎关注......
  • 零基础自学javase黑马课程第二天
    零基础自学javase黑马课程第二天✨欢迎关注......
  • 使用一条for语句求若干个整数的平均值--C++自学
    #include<iostream>#include<stdlib.h>usingnamespacestd;intmain(){intx,count=0,sum=0;cout<<"输入若干整数:"<<endl;cin>>x;for(;x!=......