关键词:
流程
1.需求分析,写项目规划书(项目经理、技术总监cto)
2.画架构图,将架构分解成各种模块(架构师)
3.各模块实施和测试(运维工程师)
4.自动化部署及运维(ansible/saltstack)
一、实现效果
搭建网站业务
PHP
wordpress 博客
http://blog.benet.com
wecenter知乎
http://www.discuz.net
Java
博客jpress
www.remote.com
二、步骤
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),创建所需数量虚拟机,并保存快照
3)同步时间
若未安装时间同步服务:yum -y install ntpdate
填写阿里云的八台NTP服务中任意一个也可以填写多台
永久:修改配置文件
vim /etc/chrony.conf
重启服务:systemctl restart chronyd
4)配置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
主机manager配置
设置IP地址、主机名、
ifdown ens33;ifup ens33
hostname -I
hostnamectl set-hostname manager
创建目录:
将软件包复制到soft目录
将脚本复制到scripts目录
自动免密脚本:首次使用,代码如下
#!/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
先创建免密主机清单,赋予执行权并执行。
安装ansible
yum -y install ansible
使用ansible为web组与lb组一起安装Nginx
1)编写剧本
注意:一般提前配置好Nginx配置文件直接拷贝到远程主机,本例,两组主机一起安装需要的配置文件不一样,可根据需要灵活调整
vim nginx.yaml
2)执行并验证,查看到主机组已经安装成功
拷贝WordPress代码目录及文件:可以用ansible,也可以用scp命令
scp -rp wordpress 172.16.0.129:/www/code/blog/
搭建网站
1)更改两项配置,默认目录更改为真实网站目录
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
注意:存在默认配置文件都是Nginx.conf,请把它们更改文件名为nginx.conf.bak,避免影响效果。
2)数据库与PHP搭建完成后,部署WordPress与jpress,详细部署见往期教程。
3)将网页代码拷贝到更目录,便于访问不用加目录
搭建数据库
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
搭建负载均衡
1)以主机lb1为例:用ansible将配置文件拷贝到/etc/nginx/conf.d/
Nginx的为lb1.conf
tomcat为tomcat_proxy.conf
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
总结
思路:
1)规划结构时,为企业发展,业务调整做好保留,如:数据库的增加、软件服务版本升级等等
2)将复杂部署简单化,再将简单部署向纵深发展。例如:部署高可用、负载均衡需要用到网站服务测试,可以先简单部署一个静态网页,创建两个测试首页index.html;内容分别为:web1、web2;最后再扩展,安装PHP,搭建WordPress、Tomcat网站。
报错及解决:
ansible
1)没有发现或无法访问Nginx.conf
解决:先定位问题根源是执行到Nginx config任务,找不到需要调用的文件;其次,查看剧本Nginx config任务是做什么?把Nginx.conf文件从本地拷贝到远程,查看此文件是否存在以及权限,发现当前目录没有此文件,拷贝过来即可解决。
2)yum进程由另一个程序持有
解决:在远程服务器本地执行,rm -rf /var/run/yum.pid
3)连接被拒绝
解决:rsync服务重启,检查配置文件
排错技巧:
网站报错502,badgateway;一般是PHP配置错误,检查监听地址,允许客户端地址
tomcat
1)问题: 404请求的资源在前端查明不存在或没有访问权,检查Tomcat配置
解决:定位,没有创建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)网站静态元素显示不过来
解决:
nfs目录没有执行权,默认权限是755
nfs未启动或没有反应过来,关闭重启;systemctl restart nfs rpcbind
nfs本地能查到正确端口映射,如下图,则成功:
面试官问:前后端分离项目,有什么优缺点?(代码片段)
1、背景前后端分离已成为互联网项目开发的业界标准使用方式,通过nginx+tomcat的方式(也可以中间加一个nodejs)有效的进行解耦,并且前后端分离会为以后的大型分布式架构、弹性计算架构、微服务架构、多... 查看详情
阿里云二面,面试官直接给我个网站让我渗透测试,我连信息收集都不会?(代码片段)
信息收集信息收集的意义主动信息收集被动信息收集网站信息收集操作系统网站服务/容器类型脚本类型数据库类型常见的数据库类型CMS识别敏感目录,后台**常见目录类型**常用工具网站Waf识别域名信息收集域名介绍**域名分... 查看详情
面试官:自己搭建过vue开发环境吗?(代码片段)
...:不懂代码的攻城师开篇前段时间,看到群里一些小伙伴面试的时候被面试官问到这类题目。平时大家开发vue项目的时候,相信大部分人都是使用 vue-cli脚手架生成的项目架构,然后npmruninstall 安装依赖,npmrunserve启动项... 查看详情
如何基于阿里云搭建适合初创企业的轻量级架构?(代码片段)
...个灵活多变、快速部署、持续集成并可以适应多种情况的架构便显得尤为重要。本文主要介绍基于阿里云搭建适合项目初期的后端架构----基于阿里云搭建的适合初创企业的轻量级架构前言在项目的初期往往存在很多变数,业务... 查看详情
面试官:你给我画一下秒杀系统的架构图!(代码片段)
...有那么普及(简历人均秒杀系统)。 第一次微众面试当年自己的八股文背的其实还可以 查看详情
十年项目经验面试官亲传大数据面试__大数据面试独孤九剑(代码片段)
文章目录引言第一剑「总决式」功能概述(三句话左右概况,简明扼要)第二剑「破剑式」项目周期(开发时长和人员配置)开发时长:人员配置第三剑「破刀式」技术架构(技术选项及框架版本)... 查看详情
企业级应用,如何实现服务化五(dubbo综合案例)(代码片段)
...一看在企业级应用中,如何将dubbo整合应用起来。1.案例架构项目模块说明:#描述项目模块:1.父/聚合项目:spring-dubbo-master统一管理依赖版本信息,用于快速构建各个项目模块2.实体类子项目: 查看详情
java面试官,一线互联网架构师360°全方面性能调优(代码片段)
10、从微服务到微服务测试11、什么是OAuth?12、什么是客户证书?13、什么是有界上下文14、微服务项目的设计要点15、SpringCloud解决了哪些问题?与分布式系统相关的复杂性–包括网络问题,延迟开销,带宽问... 查看详情
面试官们“乐此不疲”分布式系统架构是什么鬼?(代码片段)
目录:一、什么是分布式系统?二、为什么要走分布式系统架构?三、系统如何进行拆分?四、分布式之后带来的技术挑战?一、什么是分布式系统?在谈分布式系统架构前,我们先来看看,什么是分布式系统?假设原来我们有... 查看详情
综合架构web服务之nginx详解(代码片段)
文章目录nginx服务配置详细介绍关于作者前言一、nginxweb入门简介1.1什么是nginx1.2常见的网站服务1.3nginx网站服务特点1.4网站页面访问原理二、nginx服务部署安装2.1实验环境2.2YUM安装2.3源码编译安装2.4nginx重要文件目录结构2.5虚拟主... 查看详情
面试官:聊聊分布式事务,再说说解决方案!(代码片段)
前言开始我们今天的话题,说说分布式事务,或者说是我眼中的分布式事务,因为每个人可能对其的理解都不一样。分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西&... 查看详情
面试官|说说移动端项目适配(代码片段)
前置希望通过这篇文章帮助你很好的适配移动端项目,如有不足,恳请指点一二!单位分辨率:单位面积显示像素的数量,和css无关DPI:图像每英寸长度内的像素点数(1英尺=30.48厘米)css的px:96DPI的单像素的物理大小物理像素:... 查看详情
分布式之消息队列(代码片段)
其实面试官主要是想看看:第一,你知不知道你们系统里为什么要用消息队列这个东西?不少候选人,说自己项目里用了Redis、MQ,但是其实他并不知道自己为什么要用这个东西。其实说白了,就是为了用而用,或者是别人... 查看详情
阿里云二面,面试官直接给我个网站让我渗透测试,我连信息收集都不会?(代码片段)
信息收集信息收集的意义主动信息收集被动信息收集网站信息收集操作系统网站服务/容器类型脚本类型数据库类型常见的数据库类型CMS识别敏感目录,后台**常见目录类型**常用工具网站Waf识别域名信息收集域名介绍**域名分... 查看详情
基于云服务的个人网站架构设计(代码片段)
...。下面以基于腾讯云搭建的个人网站为例,对网站整体的架构进行介绍。网站目前的主要功能是个人博客,后续可以扩展如个人网盘等其他 查看详情
面试常备知识-linux网站架构优化(代码片段)
启用网站压缩deflate提示:以Apache为例1.查看并启用mod_deflate,压缩传输查看mod_deflate:提示未找到打开网页查看:也没有压缩响应头2.在httpd.conf配置文件末尾,添加deflate参数配置vim/usr/local/httpd/conf/httpd.conf定位104行... 查看详情
kafka从成神到升仙系列五面试官问我kafka生产者的网络架构,我直接开始从源码背起.......(代码片段)
👏作者简介:大家好,我是爱敲代码的小黄,独角兽企业的Java开发工程师,CSDN博客专家,Java领域新星创作者📕系列专栏:Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙... 查看详情
面试手稿关于自己面试记录面试官的问题(代码片段)
这份面试手稿是自己准备求职期间进行总结的一份面试记录,主要关于java的知识点进行记录面试手稿:首先自我介绍:尊敬的面试官您好;我叫aritso,毕业于皇家理工大学物联网工程专业的2020届本科毕业生,面试的是java软件工程师职... 查看详情