目录

  • ​​流程​​
  • ​​一、实现效果​​
  • ​​二、步骤​​
  • ​​1.实施规范​​
  • ​​2.实施流程​​
  • ​​总结​​

流程

1.需求分析,写项目规划书(项目经理、技术总监cto)
2.画架构图,将架构分解成各种模块(架构师)
3.各模块实施和测试(运维工程师)
4.自动化部署及运维(运维工程师)


一、实现效果

搭建网站业务

PHP
wordpress 博客
​ http://blog.benet.com​ wecenter知乎
http://www.discuz.net

Java
博客jpress
www.remote.com

备份、监控和管理

云计算必备-企业架构网站综合项目_redis

二、步骤

1.实施规范

  • 所有的服务必须开机自启动
  • 所有的服务器必须做必要的Linux系统基本优化(防火墙、selinux、卸载冲突软件)
  • 软件、脚本的存放目录要规范:
    软件安装目录:/server/soft
    脚本目录:/server/scripts
    站点目录:
    PHP网站 /www/code/{zh,blog}
    Java网站 /opt/Tomcat
    备份目录:/backup
    存储目录:/nfs/data
  • 主机名、ip地址规范、密码标准化,系统密码123456,其余管理密码123.com,完成可做修改
  • yum源:阿里云
  • 时间同步:阿里云
    手动同步:ntpdate -u ntp1.aliyun.com

服务器数量及作用

服务器角色

数量

作用及软件

负载均衡、高可用

2

负载均衡,调度客户请求;高可用,实现故障切换

网站

2

接收客户请求,提供网页显示给用户,Nginx、tomcat

PHP

1

解析Nginx的动态网页请求

共享存储

1

存储多媒体数据,图片、音频、视频,nfs、sersync

数据库

1

处理web数据的存储和访问:mysql、redis(缓存或共享会话、消息队列)

备份

1

提供内网全服务器的备份服务,异地灾备,rsync

管理

1

管理内部所有服务器,批量分发软件,自动化运维,ansible、ssh

监控

1

监控内部服务器系统和服务状态,zabbix

日志

1

收集分析内部服务器日志:ELK、EFK

主机名及安装程序:

顺序

服务器角色

主机名

IP

程序

1

管理

manager

172.16.0.128

ansible

2

网站

web1

172.16.0.129

Nginx、Tomcat

3

网站

web2

172.16.0.130

Nginx、Tomcat、PHP

4

负载均衡、高可用

lb1、lb2

172.16.0.131、172.16.0.134

LB、keepalived

4

共享存储

NFS

172.16.0.136

nfs-utils、rpcbind

5

备份

backup

172.16.0.133

rsync

6

数据库

db

172.16.0.135

mysql、Redis

7

监控

zabbix

172.16.0.128

zabbix

8

日志

efk

172.16.0.132

efk

2.实施流程

创建虚拟机模板

注意:试验环境有的服务整合到一台服务器,尽量保持所有主机初始状态一致,先关闭防火墙,最后统一做安全部署。zabbix必须关闭selinux

1)永久关闭防火墙、selinux,需重启系统,永久配置才生效

systemctl disable firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2)删除uuid,设置网卡不用每次启动都激活(no改成yes),创建所需数量虚拟机,并保存快照

云计算必备-企业架构网站综合项目_1024程序员节_02


3)同步时间

若未安装时间同步服务:yum -y install ntpdate

填写阿里云的八台NTP服务中任意一个也可以填写多台

永久:修改配置文件

vim /etc/chrony.conf

云计算必备-企业架构网站综合项目_redis_03


重启服务:systemctl restart chronyd

4)配置yum(先把本地原有yum备份到其他位置)
以阿里云为例:

下载yum源文件
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

命令建立元数据
yum makecache

一、主机manager配置

安装ansible并为被管理端做免密

yum -y install ansible

每台主机都一样的操作:设置IP地址、主机名
1)设置并查看IP

vim /etc/sysconfig/network-scripts/ifcfg-ens33

云计算必备-企业架构网站综合项目_1024程序员节_04


重启网卡:

ifdown ens33;ifup ens33

查看IP
hostname -I

2)设置主机名
hostnamectl set-hostname manager

3)创建目录:只在ansible上手动操作,其他主机用ansible批量创建

mkdir -p /server/{soft,scripts}

将部署服务所需文件复制到soft目录

yum源文件

云计算必备-企业架构网站综合项目_运维_05

4)在scripts目录,编辑脚本

vim /server/scripts/expect.sh

首次使用,添加代码如下:

#!/usr/bin/env bash
#ssh secret free

secret_free() {
echo " = = = = = = = = = = = = = = = = 免密交互 = = = = = = = = = = = = = = = = "
yum -y install expect

if [ ! -f /root/.ssh/id_rsa ];then
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
echo "id_rsa创建成功"
else
mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
echo "id_rsa已存在"
fi

while read line
do
user=`echo $line | cut -d " " -f 2`
ip=`echo $line | cut -d " " -f 1`
passwd=`echo $line | cut -d " " -f 3`
expect <<EOF
set timeout 10
spawn scp -r /root/.ssh $ip:/root
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$passwd\n" }
}
expect eof

EOF
done < /root/hosts
}

secret_free

后续使用:更改代码

#!/usr/bin/env bash
#ssh secret free

secret_free() {
echo " = = = = = = = = = = = = = = = = 免密交互 = = = = = = = = = = = = = = = = "
#yum -y install expect

if [ ! -f /root/.ssh/id_rsa ];then
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
echo "id_rsa创建成功"
else
# mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
echo "id_rsa已存在"
fi

while read line
do
user=`echo $line | cut -d " " -f 2`
ip=`echo $line | cut -d " " -f 1`
passwd=`echo $line | cut -d " " -f 3`
expect <<EOF
set timeout 10
spawn scp -r /root/.ssh $ip:/root
expect {
"yes/no" { send "yes\n";exp_continue }
"password" { send "$passwd\n" }
}
expect eof

EOF
done < /root/hosts
}

secret_free

5)创建免密主机清单,赋权并执行。

vim /root/hosts

云计算必备-企业架构网站综合项目_1024程序员节_06


云计算必备-企业架构网站综合项目_数据库_07

云计算必备-企业架构网站综合项目_memcached_08


6)验证:确定ansible免密是否成功

编辑ansible主机清单配置:

vim /etc/ansible/hosts

云计算必备-企业架构网站综合项目_运维_09


执行命令查看被管理端主机名:成功如下图显示

云计算必备-企业架构网站综合项目_memcached_10

为web组与lb组一起安装Nginx

1)编写剧本
注意:一般提前配置好Nginx配置文件直接拷贝到远程主机,本例,两组主机一起安装需要的配置文件不一样,可根据需要灵活调整

有两种思路:
局域网主机可以连接互联网场景:主机自行下载yum源文件,网速不好特别慢

vim /server/scripts/base.yaml

-  hosts:  all
tasks:
- name: clear repos.d
file: path=/etc/yum.repos.d/ state=absent

- name: create repos.d
file: path=/etc/yum.repos.d/ state=directory

- name: install base repo
get_url: url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/etc/yum.repos.d/CentOS-Base.repo

- name: install epel repo
get_url: url=http://mirrors.aliyun.com/repo/Centos-7.repo dest=/etc/yum.repos.d/epel.repo

- name: delete file yum.pid
file: path=/etc/yum.repos.d/yum.pid state=absent

- name: create metadata
shell: yum makecache

推荐此方法:局域网主机不能连接互联网场景:ansible管理主机下载yum源文件拷贝到其他主机

拷贝yum文件到指定目录

云计算必备-企业架构网站综合项目_memcached_11

vim /server/scripts/base.yaml

云计算必备-企业架构网站综合项目_1024程序员节_12

-  hosts:  all
tasks:
- name: clear repos.d
file: path=/etc/yum.repos.d/ state=absent

- name: create repos.d
file: path=/etc/yum.repos.d/ state=directory

- name: scp repo
copy: src=/server/soft/CentOS-Base.repo dest=/etc/yum.repos.d/ owner=root group=root mode=644

- name: scp epel.repo
copy: src=/server/soft/epel.repo dest=/etc/yum.repos.d/ owner=root group=root mode=644

- name: delete file yum.pid
file: path=/etc/yum.repos.d/yum.pid state=absent

- name: create metadata
shell: yum makecache

vim nginx.yaml

-  hosts:   all
tasks:
- name: install nginx
yum: name=nginx state=installed

根据熟练程度可以多增加一些代码

云计算必备-企业架构网站综合项目_运维_13


vim /server/scripts/main.yaml

-  import_playbook:  base.yaml
- import_playbook: nginx.yaml

2)测试成功执行

ansible-playbook -C base.yaml

云计算必备-企业架构网站综合项目_1024程序员节_14


注意:测试总剧本,会报错安装Nginx失败,因为在测试环境,前面的yum仓库剧本没有执行,正常现象

云计算必备-企业架构网站综合项目_memcached_15

3)验证:执行总剧本,查看到主机组四台主机Nginx已经安装成功

云计算必备-企业架构网站综合项目_运维_16


4)ansible批量创建网站目录

ansible web -m shell -a ‘mkdir -p /www/code/{zh,blog}’

拷贝WordPress代码目录及文件:可以用ansible,也可以用scp命令
scp -rp wordpress 172.16.0.129:/www/code/blog/

网站web1主机配置

1)更改两项配置,默认目录更改为真实网站目录(web2相同略过)

vim /etc/nginx/conf.d/blog.conf

server {
listen 80;
server_name blog.benet.com;
root /www/code/blog/wordpress;
index index.php index.html;

location ~ \.php$ {
root /www/code/blog/wordpress;
fastcgi_pass 172.16.0.130:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

vim /etc/nginx/nginx.conf

云计算必备-企业架构网站综合项目_运维_17


注意:存在默认配置文件都是Nginx.conf,请把它们更改文件名为nginx.conf.bak,避免影响效果。2)数据库与PHP搭建完成后,部署WordPress与jpress,详细部署见往期教程。

3)将网页代码拷贝到更目录,便于访问不用加目录

云计算必备-企业架构网站综合项目_redis_18

搭建数据库
mysql

1)安装mysql省略(注意版本不能过低,否则,WordPress不能安装)

2)创建blog数据库和管理用户

登录数据库:mysql 
创建数据库:create database blog;
设置管理用户及密码:grant all on blog.* to wangwu@‘%’ identified by '123.com';

3)创建jpress数据库和管理用户

create database jpress DEFAULT CHARACTER SET utf8;
grant all on jpress.* to jpress@'%' identified by '123.com';
flush privileges;

Redis
1)准备安装和数据目录
mkdir -p /data/soft
mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}

2)下载redis安装包
cd /data/soft
wget http://download.redis.io/releases/redis-5.0.7.tar.gz

3)解压redis到/opt/redis_cluster/
tar xf redis-5.0.7.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-5.0.7 /opt/redis_cluster/redis

4)切换目录安装redis
cd /opt/redis_cluster/redis
make && make install

5)编写配置文件
vim /opt/redis_cluster/redis_6379/conf/6379.conf
添加,保存退出

bind 127.0.0.1 172.16.0.135
port 6379
daemonize yes
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
databases 16
dbfilename redis.rdb
dir /opt/redis_cluster/redis_6379

6)启动当前redis服务(不打后面配置,以默认文件启动)
redis-server /opt/redis_cluster/redis_6379/conf/6379.conf

7)关闭redis服务
redis-cli shutdown

8)登录redis
redis-cli

搭建PHP

注意:实验环境,把它和web2安装到一起
将提前下载好的PHP服务rpm包拷贝到/server/soft

1)安装 php72 版本
yum -y install php72w php72w-cli php72w-common php72w-devel
php72w-embedded php72w-gd php72w-mbstring php72w-pdo php72w-xml php72w-fpm
php72w-mysqlnd php72w-opcache

2)配置:vim /etc/php-fpm.d/www.conf

云计算必备-企业架构网站综合项目_memcached_19

搭建负载均衡lb1

1)以主机lb1为例:用ansible将配置文件拷贝到/etc/nginx/conf.d/

Nginx的为lb1.conf

tomcat为tomcat_proxy.conf

云计算必备-企业架构网站综合项目_memcached_20


lb1.conf代码:

upstream webcluster {
server 172.16.0.129:80;
server 172.16.0.130:80;
}

server {
listen 80;
server_name blog.benet.com;

location / {
proxy_pass http://webcluster;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

tomcat_proxy.conf代码:

upstream java {
server 172.16.0.129:8080;
server 172.16.0.130:8080;
}

server {
listen 80;
server_name www.remote.com;
root html;
index index.html index.htm;
location / {
proxy_pass http://java;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

搭建nfs

1)安装,非最小化安装默认已安装

yum -y install nfs-utils rpcbind

2)创建挂载点
mkdir -p /nfs/data

3)发布共享目录(也可ansible将文件远程拷贝过来)

vim /etc/exports
添加保存退出
/nfs/blog 172.16.0.0/24(rw,sync,no_root_squash)

4)重启nfs服务
systemctl restart rpcbind
systemctl restart nfs

5)在nginx服务器上查看nfs共享目录
showmount -e 172.16.0.136

6)把wordpress的静态内容目录挂载到nfs

cd /www/code/blog/wordpress
创建目录 wp-contentbak,拷贝所有源文件到里面
cp -rp wp-content/ wp-contentbak
挂载静态内容目录(当前为空)
mount -t nfs 172.16.0.136:/nfs/data wp-content
验证:访问不了静态元素
将所有静态内容拷贝到wp-content
cp -rp wp-contentbak/* wp-content/

或者ansible执行
ansible web2 -m mount -a ‘src=172.16.0.136:/nfs/data path=/www/code/blog/wordpress’
验证:
可以正常访问WordPress网站

7)设置永久挂载

修改vim /etc/fstab

云计算必备-企业架构网站综合项目_数据库_21


总结

思路:
1)规划结构时,为企业发展,业务调整做好保留,如:数据库的增加、软件服务版本升级等等

2)将复杂部署简单化,再将简单部署向纵深发展。例如:部署高可用、负载均衡需要用到网站服务测试,可以先简单部署一个静态网页,创建两个测试首页index.html;内容分别为:web1、web2;最后再扩展,安装PHP,搭建WordPress、Tomcat网站。

报错及解决:

ansible

1)没有发现或无法访问Nginx.conf

云计算必备-企业架构网站综合项目_redis_22


解决:先定位问题根源是执行到Nginx config任务,找不到需要调用的文件;其次,查看剧本Nginx config任务是做什么?把Nginx.conf文件从本地拷贝到远程,查看此文件是否存在以及权限,发现当前目录没有此文件,拷贝过来即可解决。2)yum进程由另一个程序持有

云计算必备-企业架构网站综合项目_redis_23


解决:改编剧本,在里面加上删除yum.pid文件的代码

云计算必备-企业架构网站综合项目_redis_24

3)连接被拒绝

云计算必备-企业架构网站综合项目_运维_25


解决:rsync服务重启,检查配置文件

4)执行无报错,但是没有实现效果

软件,总有不如意的地方,我们检查发现web1的yum文件没有拷贝到,手动拷贝即可!

云计算必备-企业架构网站综合项目_1024程序员节_26


报了一个错,卡到一个进度

云计算必备-企业架构网站综合项目_数据库_27


网络不通,检查提示的主机网络状态。从根本上避免,则需要在执行剧本前先检测网络连通情况,基础没问题再执行

ansible all -a 'ping -c 3 www.baidu.com ’

排错技巧:

网站报错502,badgateway;一般是PHP配置错误,检查监听地址,允许客户端地址

云计算必备-企业架构网站综合项目_1024程序员节_28


云计算必备-企业架构网站综合项目_1024程序员节_29

tomcat

1)问题: 404请求的资源在前端查明不存在或没有访问权,检查Tomcat配置

云计算必备-企业架构网站综合项目_redis_30


解决:定位,没有创建Tomcat程序用户,或没有为其安装目录授予权限;拷贝的Tomcat配置必须创建软连接

groupadd -r tomcat
useradd -r -d /opt/tomcat/ -s /bin/nologin -g tomcat tomcat
chown -R tomcat:tomcat /opt/
ln -s apache-tomcat-8.5.64 tomcat

2)Tomcat 访问日志没有负载均衡服务器IP

拷贝过去的,另一台Tomcat配置文件没有做软连接
ln -s apache-tomcat-8.5.64 tomcat

验证:Tomcat负载均衡,配置hosts文件,172.16.0.131 www.remote.com

NFS

1)网站静态元素显示不过来

云计算必备-企业架构网站综合项目_1024程序员节_31

解决:

nfs目录没有执行权,默认权限是755

nfs未启动或没有反应过来,关闭重启;systemctl restart nfs rpcbind

云计算必备-企业架构网站综合项目_redis_32


nfs本地能查到正确端口映射,如下图,则成功:

云计算必备-企业架构网站综合项目_memcached_33