?荣誉认证:51CTO博客专家博主、TOP红人、明日之星;阿里云开发者社区专家博主、技术博主、星级博主。 ?微信公众号:微笑的段嘉许?本文由微笑的段嘉许原创!?欢迎关注?点赞?收藏⭐留言??51CTO首发时间:?2023年2月24日?✉️坚持和努力一定能换来诗与远方!?作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!⭐本文介绍⭐在之前的文章介绍了 Nginx 一个很重要的功能——代理,包括正向代理和反向代理。这两个代理的核心区别是:正向代理代理的是客户端,而反向代理代理的是服务器。其中我们又重点介绍了反向代理,以及如何通过 Nginx 来实现反向代理。那么了解了Nginx的反向代理之后,我们要通过Nginx的反向代理实现另一个重要功能——负载均衡,然后再此基础上再加一台redis非关系型数据库来保存客户端请求的数据,实现会话保持。不要偷走我小火车哦~ ~ ~
早期的系统架构,基本上都是如下形式的:
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
负载均衡完美的解决了单个服务器硬件性能瓶颈的问题,但是随着而来的如何实现负载均衡呢?客户端怎么知道要将请求发送到那个服务器去处理呢?
负载均衡主要通过专门的硬件设备或者软件算法实现。通过硬件设备实现的负载均衡效果好、效率高、性能稳定,但是成本较高。而通过软件实现的负载均衡主要依赖于均衡算法的选择和程序的健壮性。均衡算法又主要分为两大类:静态负载均衡算法:主要包括轮询算法、基于比率的加权轮询算法或者基于优先级的加权轮询算法。动态负载均衡算法:主要包括基于任务量的最少连接优化算法、基于性能的最快响应优先算法、预测算法及动态性能分配算法等。静态负载均衡算法在一般网络环境下也能表现的比较好,动态负载均衡算法更加适用于复杂的网络环境。普通轮询算法这是Nginx 默认的轮询算法。例子:两台相同的Tomcat服务器,通过 localhost:8080 访问Tomcat1,通过 localhost:8081访问Tomcat2,现在我们要输入 localhost 这个地址,可以在这两个Tomcat服务器之间进行交替访问。基于比例加权轮询上述两台Tomcat服务器基本上是交替进行访问的。但是这里我们有个需求:由于Tomcat1服务器的配置更高点,我们希望该服务器接受更多的请求,而 Tomcat2 服务器配置低,希望其处理相对较少的请求。基于IP路由负载我们知道一个请求在经过一个服务器处理时,服务器会保存相关的会话信息,比如session,但是该请求如果第一个服务器没处理完,通过nginx轮询到第二个服务器上,那么这个服务器是没有会话信息的。最典型的一个例子:用户第一次进入一个系统是需要进行登录身份验证的,首先将请求跳转到Tomcat1服务器进行处理,登录信息是保存在Tomcat1 上的,这时候需要进行别的操作,那么可能会将请求轮询到第二个Tomcat2上,那么由于Tomcat2 没有保存会话信息,会以为该用户没有登录,然后继续登录一次,如果有多个服务器,每次第一次访问都要进行登录,这显然是很影响用户体验的。这里产生的一个问题也就是集群环境下的 session 共享,如何解决这个问题?通常有两种方法:内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库 与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。
推荐步骤:[root@centos01 ~]# mount /dev/cdrom /mnt/ //挂载系统光盘
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos01 ~]# ls /mnt/ //查看是否挂载成功
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
[root@centos01 ~]# rm -rf /etc/yum.repos.d/CentOS-* //删除系统自带的yum源
[root@centos01 ~]# cat /etc/yum.repos.d/local.repo //查看本地yum源
[local]
name=centos
baseurl=file:///mnt
enabled=1
gpgcheck=0
2)在Centos01上安装keepalived服务[root@centos01 ~]# yum -y install pcre-devel zlib-devel openssl-devel //安装依赖程序
[root@centos01 ~]# yum -y install keepalived //安装keepalived
[root@centos01 ~]# systemctl start keepalived //启动keepalived
[root@centos01 ~]# systemctl enable keepalived //设置开机自启[root@centos01 ~]# umount /mnt/ //卸载系统光盘
[root@centos01 ~]# ls /mnt/ //查看是否卸载成功
[root@centos01 ~]# mount /dev/cdrom /mnt/ //挂载云计算光盘
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos01 ~]# ls /mnt/ //查看是否卸载成功
amoeba-mysql-binary-2.2.0.tar.gz
apache-tomcat-7.0.54.tar.gz
haproxy-1.4.24.tar.gz
httpd-2.2.17.tar.gz
inotify-tools-3.14.tar.gz
jdk-6u14-linux-x64.bin
jdk-7u65-linux-x64.gz
nginx-1.6.0.tar.gz
---
[root@centos01 ~]# useradd -M -s /sbin/nologin nginx //创建nginx用户
[root@centos01 ~]# tar zxf /mnt/nginx-1.6.0.tar.gz -C /usr/src/ //解压nginx源代码程序到/usr/src
[root@centos01 ~]# cd /usr/src/nginx-1.6.0/ //切换到nginx目录
[root@centos01 nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module //安装模块
[root@centos01 nginx-1.6.0]# make && make install //编译安装
[root@centos01 ~]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/ //优化命令
[root@centos02 ~]# mount /dev/cdrom /mnt/ //挂载系统光盘
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos02 ~]# ls /mnt/ //查看是否挂载成功
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL
[root@centos02 ~]# rm -rf /etc/yum.repos.d/CentOS-* //删除系统自带的yum源
[root@centos02 ~]# cat /etc/yum.repos.d/local.repo //查看本地yum源
[local]
name=centos
baseurl=file:///mnt
enabled=1
gpgcheck=0
2)在Centos02上安装keepalived服务[root@centos02 ~]# yum -y install pcre-devel zlib-devel openssl-devel //安装依赖程序
[root@centos02 ~]# yum -y install keepalived //安装keepalived
[root@centos02 ~]# systemctl start keepalived //启动keepalived
[root@centos02 ~]# systemctl enable keepalived //设置开机自启[root@centos02 ~]# umount /mnt/ //卸载系统光盘
[root@centos02 ~]# ls /mnt/ //查看是否卸载成功
[root@centos02 ~]# mount /dev/cdrom /mnt/ //挂载云计算光盘
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos02 ~]# ls /mnt/ //查看是否卸载成功
amoeba-mysql-binary-2.2.0.tar.gz
apache-tomcat-7.0.54.tar.gz
haproxy-1.4.24.tar.gz
httpd-2.2.17.tar.gz
inotify-tools-3.14.tar.gz
jdk-6u14-linux-x64.bin
jdk-7u65-linux-x64.gz
nginx-1.6.0.tar.gz
---
[root@centos02 ~]# useradd -M -s /sbin/nologin nginx //创建nginx用户
[root@centos02 ~]# tar zxf /mnt/nginx-1.6.0.tar.gz -C /usr/src/ //解压nginx源代码程序到/usr/src
[root@centos02 ~]# cd /usr/src/nginx-1.6.0/ //切换到nginx目录
[root@centos02 nginx-1.6.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-file-aio --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module //安装模块
[root@centos02 nginx-1.6.0]# make && make install //编译安装
[root@centos02 ~]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/ //优化命令
[root@centos01 ~]# vim /opt/chk_nginx.sh //进入脚本文件
---
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ]
then
/usr/bin/systemctl stop keepalived
fi
---
[root@centos01 ~]# chmod +x /opt/chk_nginx.sh //给脚本添加执行权限
2)修改keepalived主配置文件[root@centos01 ~]# vim /etc/keepalived/keepalived.conf //进入keepalived主配置文件
---
1 ! Configuration File for keepalived
2 global_defs {
3 router_id Nginx_Master //名字
4 }
5 vrrp_script check_nginx { //检查nginx服务运行状态
6 script "/opt/chk_nginx.sh" //执行脚本
7 interval 2 //2秒
8 }
9 vrrp_instance VI_1 { //vrrp实例名字Vl_1
10 state MASTER //角色Master主
11 interface ens32 //监听网卡
12 virtual_router_id 51 //路由器id
13 priority 100 //优先级100
14 advert_int 1 //监控检测间隔时间1秒
15 authentication {
16 auth_type PASS //主备份设置验证
17 auth_pass 1111 //密码1111
18 }
19 virtual_ipaddress {
20 192.168.100.100 //nginx的群集漂移IP地址
21 }
22 track_script {
23 check_nginx //执行脚本
24 }
25}
[root@centos01 ~]# nginx //启动nginx服务
[root@centos01 ~]# systemctl restart keepalived //重启keepalived服务[root@centos01 ~]# ip a //查看IP地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:3a:c5:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.100.20/24 brd 192.168.100.255 scope global ens32
valid_lft forever preferred_lft forever
inet 192.168.100.100/32 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe3a:c56c/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff
3)停止nginx服务IP地址漂移[root@centos01 ~]# killall nginx //停止nginx服务
[root@centos01 ~]# netstat -anptu | grep nginx //监听网卡
[root@centos02 ~]# ip a //查看IP地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:3a:c5:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.100.20/24 brd 192.168.100.255 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe3a:c56c/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff[root@centos01 ~]# scp /etc/keepalived/keepalived.conf root@192.168.100.20:/etc/keepalived/ //备份keepalived配置文件
[root@centos01 ~]# scp /opt/chk_nginx.sh root@192.168.100.20:/opt/ 备份脚本配置文件[root@centos02 ~]# vim /etc/keepalived/keepalived.conf //进入主配置文件目录
---
1 ! Configuration File for keepalived
2 global_defs {
3 router_id Nginx_Master
4 }
5 vrrp_script check_nginx {
6 script "/opt/chk_nginx.sh"
7 interval 2
8 }
9 vrrp_instance VI_1 {
10 state BACKUP //修改为备份服务器
11 interface ens32
12 virtual_router_id 51
13 priority 90 //优先级改成90
14 advert_int 1
15 authentication {
16 auth_type PASS
17 auth_pass 1111
18 }
19 virtual_ipaddress {
20 192.168.100.100
21 }
22 track_script {
23 check_nginx
24 }
25 }
---
[root@centos02 ~]# nginx //启动nginx服务
[root@centos02 ~]# systemctl restart keepalived //重新启动keepalived服务
3)验证停止第一台nginx服务模拟故障[root@centos01 ~]# killall nginx //停止nginx服务
nginx: no process found
[root@centos01 ~]# ip a //查看IP地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:25:91:b5 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.10/24 brd 192.168.100.255 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe25:91b5/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff[root@centos02 ~]# ip a //查看IP地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:3a:c5:6c brd ff:ff:ff:ff:ff:ff
inet 192.168.100.20/24 brd 192.168.100.255 scope global ens32
valid_lft forever preferred_lft forever
inet 192.168.100.100/32 scope global ens32
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe3a:c56c/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:3f:6b:6d brd ff:ff:ff:ff:ff:ff
[root@centos01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
BOOTPROTO=static
NAME=ens32
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.100.10 //IP地址
NETMASK=255.255.255.0 //子网掩码
DNS1=192.168.100.10 //DNS
----
[root@centos01 ~]# systemctl restart network //重新启动网卡服务
[root@centos01 ~]# cat /etc/resolv.conf //查看DNS是否配置成功
# Generated by NetworkManager
nameserver 192.168.100.10[root@centos01 ~]# mount /dev/cdrom /mnt/ //挂载系统光盘
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos01 ~]# ls /mnt/ //查看系统光盘是否挂载成功
CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7
EFI images Packages RPM-GPG-KEY-CentOS-Testing-7
EULA isolinux repodata TRANS.TBL[root@centos01 ~]# rpm -ivh /mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm
警告:/mnt/Packages/bind-9.9.4-50.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:bind-32:9.9.4-50.el7 ################################# [100%]
[root@centos01 ~]# rpm -ivh /mnt/Packages/bind-chroot-9.9.4-50.el7.x86_64.rpm
警告:/mnt/Packages/bind-chroot-9.9.4-50.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:bind-chroot-32:9.9.4-50.el7 ################################# [100%][root@centos01 ~]# echo "" > /etc/named.conf //清空主配置文件
[root@centos01 ~]# vim /etc/named.conf //进入到主配置文件
----
options {
listen-on port 53 { any; };
};
zone "duanjiaxu.com" IN {
type master;
file "var/named/duanjiaxu.com.zone";
};
[root@centos01 ~]# named-checkconf /etc/named.conf //检查主配置文件是否修改正确
2)修改DNS区域配置文件[root@centos01 ~]# vim /var/named/duanjiaxu.com.zone //进入区域配置文件
----
$TTL 86400
@ SOA duanjiaxu.com. root.duanjiaxu.com. (
2023020210
1H
15M
1W
1D
)
@ NS centos01.duanjiaxu.com.
centos01 A 192.168.100.10
www A 192.168.100.100
[root@centos01 ~]# named-checkzone duanjiaxu.com /var/named/duanjiaxu.com.zone //检查主配置文件是否修改成功
zone duanjiaxu.com/IN: loaded serial 2023022310
OK
----
[root@centos01 ~]# systemctl start named //启动DNS服务
[root@centos01 ~]# systemctl enable named //设置开机自启[root@centos01 ~]# netstat -anptu | grep named
tcp 0 0 192.168.100.10:53 0.0.0.0:* LISTEN 42964/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 42964/named
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 42964/named
tcp6 0 0 ::1:953 :::* LISTEN 42964/named
udp 0 0 192.168.122.1:53 0.0.0.0:* 42964/named
udp 0 0 192.168.100.10:53 0.0.0.0:* 42964/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 42964/named[root@centos02 ~]# nslookup www.duanjiaxu.com
Server: 192.168.100.10
Address: 192.168.100.10#53
Name: www.duanjiaxu.com
Address: 192.168.100.100[root@centos03 ~]# mkdir /www //创建网站根目录
[root@centos03 ~]# echo "www.duanjiaxu.com" > /www/index.jsp //设置网站主页
[root@centos03 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos03 ~]# ls /mnt/
amoeba-mysql-binary-2.2.0.tar.gz
apache-tomcat-7.0.54.tar.gz //tomcat程序包
awstats-7.3.tar.gz
cacti-0.8.8b.tar.gz
cmake-2.8.6.tar.gz
cronolog-1.6.2.tar.gz
OpenStack.rar
OpenVPN.rar
percona-monitoring-plugins-1.1.4.tar.gz
php-5.3.28.tar.gz
phpMyAdmin-4.2.5-all-languages.tar.gz
postfix+dovecot.rar
puppet-2.7.21.tar.gz
rrdtool-1.4.8.tar.gz
Xshell4_4.0.0.112.exe
ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz
2)安装tomcat[root@centos03 ~]# tar zxf /mnt/apache-tomcat-7.0.54.tar.gz -C /usr/src/ //解压tomcat源代码程序
[root@centos03 ~]# mv /usr/src/apache-tomcat-7.0.54/ /usr/local/tomcat //剪切tomcat源代码程序到/usr/local/tomcat目录
[root@centos03 ~]# vim /usr/local/tomcat/conf/server.xml
---
127 <Context docBase="/www" path="" reloadable="false"/> //加载网站根目录
---
[root@centos03 ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@centos03 ~]# netstat -anptu | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 41437/java
[root@centos04 ~]# mkdir /www //创建网站根目录
[root@centos04 ~]# echo "www.djx.com" > /www/index.jsp //设置网站主页
[root@centos04 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos04 ~]# ls /mnt/
amoeba-mysql-binary-2.2.0.tar.gz
apache-tomcat-7.0.54.tar.gz //tomcat程序包
awstats-7.3.tar.gz
cacti-0.8.8b.tar.gz
cmake-2.8.6.tar.gz
cronolog-1.6.2.tar.gz
OpenStack.rar
OpenVPN.rar
percona-monitoring-plugins-1.1.4.tar.gz
php-5.3.28.tar.gz
phpMyAdmin-4.2.5-all-languages.tar.gz
postfix+dovecot.rar
puppet-2.7.21.tar.gz
rrdtool-1.4.8.tar.gz
Xshell4_4.0.0.112.exe
ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz
2)安装tomcat[root@centos04 ~]# tar zxf /mnt/apache-tomcat-7.0.54.tar.gz -C /usr/src/ //解压tomcat源代码程序
[root@centos04 ~]# mv /usr/src/apache-tomcat-7.0.54/ /usr/local/tomcat //剪切tomcat源代码程序到/usr/local/tomcat目录
[root@centos04 ~]# vim /usr/local/tomcat/conf/server.xml
---
127 <Context docBase="/www" path="" reloadable="false"/> //加载网站根目录
---
[root@centos04 ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@centos04 ~]# netstat -anptu | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 41437/java
[root@centos01 ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak //备份nginx主配置文件
[root@centos01 ~]# vim /usr/local/nginx/conf/nginx.conf //进入nginx主配置文件目录
---
1 user nginx;
2 worker_processes 1;
3 pid logs/nginx.pid;
4 events {
5 worker_connections 1024;
6 }
7
8 http {
9 include mime.types;
10 default_type application/octet-stream;
11 sendfile on;
12 keepalive_timeout 65;
13 gzip on;
14 upstream tomcat_server {
15 server 192.168.100.30:8080 weight=1; //虚拟主机
16 server 192.168.100.40:8080 weight=1;
17 }
18 server {
19 listen 80;
20 server_name localhost;
21 charset utf-8;
22 access_log logs/www.duanjiaxu.com.access.log;
23 location / {
24 proxy_pass http://tomcat_server;
25 root html;
26 index index.html index.htm;
27 }
28 }
29 }
---
[root@centos01 ~]# nginx -t //检查主配置文件你修改是否有误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@centos01 ~]# killall nginx //停止nginx服务
[root@centos01 ~]# nginx //启动nginx服务
[root@centos01 ~]# netstat -anptu | grep nginx //监听网卡
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 71534/nginx: master
2)修改第二台nginx服务器主配置文件[root@centos01 ~]# scp /usr/local/nginx/conf/nginx.conf root@192.168.100.20:/usr/local/nginx/conf/ //复制第一台nginx主配置问价你到第二台nginx服务器上
The authenticity of host '192.168.100.20 (192.168.100.20)' can't be established.
ECDSA key fingerprint is SHA256:E+tzb7HjG0mQ7n57HLilVf3yLuOM+2gcT77B4Sb/Oug.
ECDSA key fingerprint is MD5:97:fa:2e:0e:10:55:71:ba:d4:2a:e5:e6:76:e4:3b:4a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.100.20' (ECDSA) to the list of known hosts.
root@192.168.100.20's password:
nginx.conf
---
[root@centos02 ~]# killall nginx //停止nginx服务
nginx: no process found
[root@centos02 ~]# nginx //启动nginx服务
[root@centos02 ~]# netstat -anptu | grep nginx //监听网卡
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 48804/nginx: master
[root@centos02 ~]# systemctl restart keepalived //重启keepalived服务[root@centos01 ~]# tail -f /usr/local/nginx/logs/www.duanjiaxu.com.access.log
[root@centos02 ~]# tail -f /usr/local/nginx/logs/www.duanjiaxu.com.access.log第一次访问显示duanjiaxu(访问的是第一台tomcat网站)
第二次访问显示djx(访问的是第二台tomcat网站)
3)查看日志[root@centos01 ~]# tail -f /usr/local/nginx/logs/www.duanjiaxu.com.access.log //查看日志
192.168.100.102 - - [21/Feb/2023:04:45:40 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:45:40 +0800] "GET /favicon.ico HTTP/1.1" 404 411 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:46:40 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:46:40 +0800] "GET /favicon.ico HTTP/1.1" 404 411 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:46:41 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:46:43 +0800] "GET / HTTP/1.1" 200 4 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
4)模拟第一台nginx服务器故障,自动通过第二台nginx服务器访问tomcat网站[root@centos01 ~]# killall nginx //停止nginx服务
[root@centos01 ~]# netstat -anptu | grep nginx //监听网卡第一次访问显示duanjiaxu(访问的是第一台tomcat网站)
第二次访问显示duanjiaxu(访问的是第二台tomcat网站)
6)查看日志[root@centos02 ~]# tail -f /usr/local/nginx/logs/www.duanjiaxu.com.access.log //查看日志
192.168.100.102 - - [21/Feb/2023:04:51:14 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:51:14 +0800] "GET /favicon.ico HTTP/1.1" 404 411 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:53:01 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:53:01 +0800] "GET /favicon.ico HTTP/1.1" 404 411 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:53:01 +0800] "GET / HTTP/1.1" 200 18 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
192.168.100.102 - - [21/Feb/2023:04:53:02 +0800] "GET / HTTP/1.1" 200 4 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"
[root@centos03 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
---
1 Session ID:<%= session.getId() %><BR>
2 SessionPort:<%= request.getServerPort() %>
3 <% out.println("This tomcat server 192.168.100.30");%>[root@centos04 ~]# vim /usr/local/tomcat/webapps/ROOT/session.jsp
---
1 Session ID:<%= session.getId() %><BR>
2 SessionPort:<%= request.getServerPort() %>
3 <% out.println("This tomcat server 192.168.100.40");%>[root@centos01 ~]# vim /usr/local/nginx/conf/nginx.conf //进入nginx主配置文件
1 user nginx;
2 worker_processes 1;
3 pid logs/nginx.pid;
4 events {
5 worker_connections 1024;
6 }
7
8 http {
9 include mime.types;
10 default_type application/octet-stream;
11 access_log logs/www.duanjiaxu.com.log;
12 sendfile on;
13 keepalive_timeout 65;
14 gzip on;
15 upstream tomcat_server {
16 ip_hash; //配置基于IP地址保持会话
17 server 192.168.100.30:8080 weight=1 max_fails=1 fail_timeout=10s;
18 server 192.168.100.40:8080 weight=1 max_fails=1 fail_timeout=10s;
19 }
20 server {
21 listen 80;
22 server_name localhost;
23 charset utf-8;
24 access_log logs/www.duanjiaxu.com.access.log;
25
26 location / {
27 proxy_pass http://tomcat_server;
28 root html;
29 index index.html index.htm;
30 }
31 }
32 }
---
[root@centos01 ~]# killall nginx
nginx: no process found
[root@centos01 ~]# nginx
[root@centos01 ~]# netstat -anptu | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 52521/nginx: master[root@centos01 ~]# scp /usr/local/nginx/conf/nginx.conf root@192.168.100.20:/usr/local/nginx/conf/nginx.conf //复制第一台nginx主配置文件到第二台nginx服务器
root@192.168.100.20's password: //输入密码
nginx.conf 100% 759 1.6MB/s 00:00[root@centos03 ~]# /usr/local/tomcat/bin/shutdown.sh
[root@centos04 ~]# /usr/local/tomcat/bin/startup.sh第一次访问
第二次访问
[root@centos03 ~]# vim /usr/local/tomcat/conf/server.xml //进入第一台tomcat主配置文件
---
104 <Engine name="Catalina" defaultHost="localhost" jvmRoute="Centos03"> //会话复制centos03
113 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> //开启会话复制群集
[root@centos04 ~]# vim /usr/local/tomcat/conf/server.xml //进入第二台tomcat主配置文件
---
104 <Engine name="Catalina" defaultHost="localhost" jvmRoute="Centos04"> //会话复制centos04
113 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/> //开启会话复制群集[root@centos03 ~]# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml //第一台tomcat服务器开启会话复制功能
30 <distributable/>
---
[root@centos04 ~]# vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml //第二台tomcat服务器开启会话复制功能
30 <distributable/>
3)开启组播通信[root@centos03 ~]# route add -net 224.0.0.0 netmask 240.0.0.0 dev ens32
[root@centos03 ~]# /usr/local/tomcat/bin/shutdown.sh //停止tomcat服务
[root@centos03 ~]# /usr/local/tomcat/bin/startup.sh //启动tomcat服务
[root@centos03 ~]# netstat -anptu | grep java //监听网卡
---
[root@centos04 ~]# route add -net 224.0.0.0 netmask 240.0.0.0 dev ens32
[root@centos04 ~]# /usr/local/tomcat/bin/shutdown.sh //停止tomcat服务
[root@centos04 ~]# /usr/local/tomcat/bin/startup.sh //启动tomcat服务
[root@centos03 ~]# netstat -anptu | grep java //监听网卡
4)修改nginx主配置文件[root@centos01 ~]# vim /usr/local/nginx/conf/nginx.conf //修改第一台nginx服务器主配置文件
1 user nginx;
2 worker_processes 1;
3 pid logs/nginx.pid;
4 events {
5 worker_connections 1024;
6 }
7
8 http {
9 include mime.types;
10 default_type application/octet-stream;
11 sendfile on;
12 keepalive_timeout 65;
13 gzip on;
14 upstream tomcat_server {
15 server 192.168.100.30:8080 weight=1;
16 server 192.168.100.40:8080 weight=1;
17 }
18 server {
19 listen 80;
20 server_name localhost;
21 charset utf-8;
22 access_log logs/www.duanjiaxu.com.access.log;
23
24 location / {
25 proxy_pass http://tomcat_server;
26 root html;
27 index index.html index.htm;
28 }
29 }
30 }
---
[root@centos02 ~]# vim /usr/local/nginx/conf/nginx.conf //修改第二台nginx服务器主配置文件
1 user nginx;
2 worker_processes 1;
3 pid logs/nginx.pid;
4 events {
5 worker_connections 1024;
6 }
7
8 http {
9 include mime.types;
10 default_type application/octet-stream;
11 sendfile on;
12 keepalive_timeout 65;
13 gzip on;
14 upstream tomcat_server {
15 server 192.168.100.30:8080 weight=1;
16 server 192.168.100.40:8080 weight=1;
17 }
18 server {
19 listen 80;
20 server_name localhost;
21 charset utf-8;
22 access_log logs/www.duanjiaxu.com.access.log;
23
24 location / {
25 proxy_pass http://tomcat_server;
26 root html;
27 index index.html index.htm;
28 }
29 }
30 }第一次访问
第二次访问
[root@centos05 ~]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载
[root@centos05 ~]# ls /mnt
redis-3.2.0.gem redis-3.2.9.tar.gz[root@centos05 ~]# tar zxf /mnt/redis-3.2.9.tar.gz -C /usr/src/ //解压redis程序包
[root@centos05 ~]# mv /usr/src/redis-3.2.9/ /usr/local/redis
[root@centos05 ~]# cd /usr/local/redis/
[root@centos05 redis]# make && make install //编译安装[root@centos05 redis]# cd ./utils/
[root@centos05 utils]# ./install_server.sh[root@centos05 utils]# /etc/init.d/redis_6379 stop //停止redis服务
[root@centos05 utils]# vim /etc/redis/6379.conf
---
62 bind 0.0.0.0
[root@centos05 ~]# /etc/init.d/redis_6379 start //启动redis服务
Starting Redis server...
[root@centos05 ~]# netstat -anptu | grep 6379 //监听网卡
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 4468/redis-server 0[root@centos03 ~]# cd /usr/local/tomcat/lib/
[root@centos03 ~]#rz //上传tomcat连接redis依赖tar包[root@centos03 ~]# vim /usr/local/tomcat/conf/context.xml
<ValveclassName="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.100.50" //redis的IP地址
port="6379" //redis端口
database="0" //数据存储到0库
maxInactiveInterval="60" />
</Context>[root@centos03 ~]# /usr/local/tomcat/bin/shutdown.sh //停止tomcat服务
[root@centos03 ~]# /usr/local/tomcat/bin/startup.s //启动tomcat服务[root@centos04 ~]# cd /usr/local/tomcat/lib/
[root@centos04 ~]#rz //上传tomcat连接redis依赖tar包[root@centos04 ~]# vim /usr/local/tomcat/conf/context.xml
<ValveclassName="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="192.168.100.50" //redis的IP地址
port="6379" //redis端口
database="0" //数据存储到0库
maxInactiveInterval="60" />
</Context>[root@centos04 ~]# /usr/local/tomcat/bin/shutdown.sh //停止tomcat服务
[root@centos04 ~]# /usr/local/tomcat/bin/startup.s //启动tomcat服务
2)第二次访问请求的tomcat服务器变成了192.168.100.40客户端请求信息没有改变,实现会话保持

我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
通常,数组被实现为内存块,集合被实现为HashMap,有序集合被实现为跳跃列表。在Ruby中也是如此吗?我正在尝试从性能和内存占用方面评估Ruby中不同容器的使用情况 最佳答案 数组是Ruby核心库的一部分。每个Ruby实现都有自己的数组实现。Ruby语言规范只规定了Ruby数组的行为,并没有规定任何特定的实现策略。它甚至没有指定任何会强制或至少建议特定实现策略的性能约束。然而,大多数Rubyist对数组的性能特征有一些期望,这会迫使不符合它们的实现变得默默无闻,因为实际上没有人会使用它:插入、前置或追加以及删除元素的最坏情况步骤复
在ruby中,你可以这样做:classThingpublicdeff1puts"f1"endprivatedeff2puts"f2"endpublicdeff3puts"f3"endprivatedeff4puts"f4"endend现在f1和f3是公共(public)的,f2和f4是私有(private)的。内部发生了什么,允许您调用一个类方法,然后更改方法定义?我怎样才能实现相同的功能(表面上是创建我自己的java之类的注释)例如...classThingfundeff1puts"hey"endnotfundeff2puts"hey"endendfun和notfun将更改以下函数定
A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(