用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下。 1 设计你认为合理的架构,用visio把架构图画出来 2 搭建lnmp、tomcat jdk环境 3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客 4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip 5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录) 6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root) 7 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo 8 给所有服务器做一个简单的命令审计功能 9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月 10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月 11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据 13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性, 14 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警 15 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警 16 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数 17 利用jmx,在zabbix上监控tomcat 18 给三个站点的后台访问做二次认证,增加安全性 19 用shell脚本实现文件、代码同步上线(参考分发系统)
如上需求拆分成以下几部分:
一、系统流程
1 设计你认为合理的架构,用visio把架构图画出来 2所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo 8 给所有服务器做一个简单的命令审计功能
二、lnmp tomcat环境搭建
2 搭建lnmp、tomcat jdk环境 3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客 4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip 5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录) 6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root) 9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月 10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月 18 给三个站点的后台做二次认证,增加安全性
三、数据备份
11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据 19 用shell脚本实现文件、代码同步上线(参考分发系统)
四、zabbix监控搭建
13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性, 14 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警 15 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警 16 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数 17 利用jmx,在zabbix上监控tomcat
一、系统流程
1. 设计你认为合理的架构,用visio把架构图画出来
1.1 服务器分组:
负载均衡服务器2台 分别安装keepalived lvs 分别安装nginx
后端服务器 其中一台安装 LNMP TOMCAT zabbix-server NFS(共享3个站点的程序目录,如/data/wwwroot/) 其余服务器安装 LNMP TOMCAT zabbix-agent NFS(挂载3个站点的程序目录,)
数据库服务器 设置主从架构 主服务器设置数据库备份脚本,设置crontab定时任务
备份服务器 接收mysql数据库的备份文件 接受站点程序的数据备份
1.2 负载均衡master端和backup端安装
安装keepalived 和 ipvsadm,并且打开路由转发功能
代码语言:javascript复制echo 1 > /proc/sys/net/ipv4/ip_forward
yum install -y ipvsadm
yum install -y keepalived
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
#备用服务器上为 BACKUP
state MASTER
#绑定vip的网卡为eth0
interface eth0
virtual_router_id 51
#备用服务器上为90
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux
}
virtual_ipaddress {
192.168.141.200
}
}
virtual_server server_ip1 80 {
#(每隔10秒查询realserver状态)
delay_loop 10
#(lvs 算法)
lb_algo wlc
#(DR模式)
lb_kind DR
#(同一IP的连接60秒内被分配到同一台realserver)
persistence_timeout 0
#(用TCP协议检查realserver状态)
protocol TCP
real_server server_ip2 80 {
#(权重)
weight 100
TCP_CHECK {
#(10秒无响应超时)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server server_ip3 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
1.3 安装nginx
keepalived master端和backup端都需安装nginx
代码语言:javascript复制cd /usr/local/src/
wget http://nginx.org/download/nginx-1.16.0.tar.gz
tar -zxvf nginx-1.16.0.tar.gz
cd nginx
yum install -y pcre-devel zlib-devel
./configure --prefix=/usr/local/nginx
make
make install
设置nginx启动脚本
代码语言:javascript复制vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start()
{
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop()
{
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETVAL=$?
echo
return $RETVAL
}
reload()
{
echo -n $"Reloading $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -HUP
RETVAL=$?
echo
return $RETVAL
}
restart()
{
stop
start
}
configtest()
{
$NGINX_SBIN -c $NGINX_CONF -t
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
configtest)
configtest
;;
*)
echo $"Usage: $0 {start|stop|reload|restart|configtest}"
RETVAL=1
esac
exit $RETVAL
编辑nginx配置,在配置文件中httpd段添加 include /usr/local/nginx/conf/vhost/*.conf;
编辑server配置文件
代码语言:javascript复制vim /usr/local/nginx/conf/vhost/zrlog.com.conf
## 文件内容如下
upstream zrlog_com
{
ip_hash;
server server_ip:8080;
server server_ip:8080;
server server_ip:8080;
}
server
{
listen 80;
server_name www.zrlog.com;
location /
{
proxy_pass http://zrlog_com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
代码语言:javascript复制vim /usr/local/nginx/conf/vhost/discuz.com.conf
## 文件内容如下
upstream discuz.com
{
ip_hash;
server server_ip:80;
server server_ip:80;
server server_ip:80;
}
server
{
listen 80;
server_name www.discuz.com;
location /
{
proxy_pass http://discuz.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
代码语言:javascript复制vim /usr/local/nginx/conf/vhost/dedecms.com.conf
## 文件内容如下
upstream dedecms.com
{
ip_hash;
server server_ip:80;
server server_ip:80;
server server_ip:80;
}
server
{
listen 80;
server_name www.dedecms.com;
location /
{
proxy_pass http://dedecms.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
代码语言:javascript复制vim /usr/local/nginx/conf/vhost/zabbix.com.conf
## 文件内容如下
upstream zabbix.com
{
ip_hash;
server server_ip:80;
}
server
{
listen 80;
server_name www.zabbix.com;
location /
{
proxy_pass http://zabbix.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /zabbix/
{
proxy_pass http://zabbix_com/zabbix;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
1.4 启动keepalived和nginx
keepalived两台和nginx两台都启动
代码语言:javascript复制systemctl start keepalived
/etc/init.d/nginx start
1.4 在web服务器上设置
代码语言:javascript复制vim /usr/local/sbin/lvs_rs.sh
#/bin/bash
vip=192.168.141.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdonw lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sh /usr/local/sbin/lvs_rs.sh
1.5 搭建mysql主从
1.5.1 设置myslq 主服务器
代码语言:javascript复制cd /usr/local/src/
wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz
tar -zxvf mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz
yum install -y perl-Data-Dumper.x86_64 libaio
mkdir /data/mysql/
mkdir -p /data/mysql
useradd -M mysql
mv mysql-5.6.43-linux-glibc2.12-x86_64 /usr/local/mysql
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
cp /usr/local/mysql/my.cnf /etc/my.cnf
chmod 755 /etc/init.d/mysqld
修改mysql配置文件 server-id= // id号可以设置成机器ip地址的末为数字 log_bin= // 给binlog文件设置个名字
代码语言:javascript复制vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=222
log_bin=master-bin
key_buffer=16K
table_open_cache=4
query_cache_limit=256K
query_cache_size=4M
max_allowed_packet=1M
sort_buffer_size=64K
read_buffer_size=256K
thread_stack=64K
innodb_buffer_pool_size = 56M
[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/var/run/mysql/mysql.pid
修改启动mysql启动脚本 /etc/init.d/mysqld
代码语言:javascript复制basedir=/usr/local/mysql
datadir=/data/mysql
配置环境变量 /etc/profile 修改完成记得 source /etc/profile
代码语言:javascript复制export PATH=$PATH:/usr/local/mysql/bin/
进入mysql,设置root密码
代码语言:javascript复制mysql -uroot
mysql> set password=password('123456');
mysql> quit
1.5.2 设置myslq 从服务器
设置流程如 1.5.1,从服务器的my.cnf设置需要添加
代码语言:javascript复制[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=223
key_buffer=16K
table_open_cache=4
query_cache_limit=256K
query_cache_size=4M
max_allowed_packet=1M
sort_buffer_size=64K
read_buffer_size=256K
thread_stack=64K
innodb_buffer_pool_size = 56M
[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/var/run/mysql/mysql.pid
以上操作设置完成之后,两台服务器,重启mysql服务器
1.5.3 配置同步
在mysql主上进行以下设置:
创建用作同步数据的用户
代码语言:javascript复制 grant replication slave on *.* to 'repl'@slave_ip identified by 'password';
flush tables with read lock;
show master status;
在mysql从上进行以下设置,设置完成还要到主上执行 unlock tables;
代码语言:javascript复制stop slave;
change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
start slave;
查看两台slave的主从状态是否正常,Slave_IO_Running和 Slave_SQL_Running要为yes:
2 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo
使用visudo命令编辑配置文件,设置用户的alias: User_Alias ADMINS = user1, user2, user3
然后批量执行useradd命令在全部服务器上添加user1、user2、user3用户
找到Allow root to run any commands anywhere,在这行下面添加以下内容:
ADMINS ALL=(ALL) NOPASSWD: /usr/bin/su, /usr/bin/ls, /usr/bin/cat, /usr/bin/mkdir
sshd.config配置文件,修改以下内容:
vim /etc/ssh/sshd_config PermitRootLogin no PubkeyAuthentication yes PasswordAuthentication no
重启服务:systemctl restart sshd.service
服务器A生成公钥 ssh-keygen 查看公钥内容 cat .ssh/id_rsa.pub
登录服务器B,设置权限 .ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
3 给所有服务器做一个简单的命令审计功能
在/etc/profile文件后面写入以下内容
代码语言:javascript复制export PS1='[u@h w]# '
history
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
if [ ! -d /root/history ]
then
mkdir /root/history
chmod 777 /root/history
fi
if [ ! -d /root/history/${LOGNAME} ]
then
mkdir /root/history/${LOGNAME}
chmod 300 /root/history/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date "%Y%m%d_%H%M%S"`
export HISTFILE="/root/history/${LOGNAME}/${USER_IP} history.$DT"
chmod 600 /root/history/${LOGNAME}/*history* 2>/dev/null
记得使用source /etc/profile 使上面的配置生效。