分类 Linux 下的文章

课程地址:18个Linux Shell脚本经典案例【共20课时】_自动化运维课程-51CTO学堂

服务器系统配置初始化

当我们拿到一台崭新的服务器时候需要对其进行初始化,一般的步骤如下:

  1. 安装系统新能分析工具已经其他的工具
  2. 设置时区并同步时间
  3. 禁用selinux
  4. 清空防火墙默认策源
  5. 历史命令显示操作时间
  6. 禁止root远程登录
  7. 禁止定时任务发送邮件
  8. 设置最大打开文件数
  9. 减少Swap使用
  10. 系统内核参数的优化

当我们的服务器只有一台的时候其实还好,但如果是 10 台,100 台呢?我们不可能还是手动的去一台一台的设置,我们肯定要借助脚本来自动完成。

#/bin/bash
# 安装系统性能分析工具及其他
yum install gcc make autoconf vim sysstat net-tools iostat iftop iotp wget lrzsz lsof unzip openssh-clients net-tool vim ntpdate -y

# 设置时区并同步时间
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
if ! crontab -l |grep ntpdate &>/dev/null ; then
    (echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab 
fi

# 禁用selinux
sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config

# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
    systemctl stop firewalld
    systemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then
    service iptables stop
    chkconfig iptables off
fi

# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
    echo 'export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  `whoami` "' >> /etc/bashrc
fi

# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
    echo "export TMOUT=600" >> /etc/profile
fi

# 禁止root远程登录 切记给系统添加普通用户,给su到root的权限
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# 禁止定时任务向发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab 

# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf << EOF
    * soft nofile 65535
    * hard nofile 65535
EOF
fi

# 系统内核优化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20  
EOF

# 减少SWAP使用
echo "0" > /proc/sys/vm/swappiness

发送告警邮件

安装软件

yum install mailx -y

进入qq邮箱首页,点击设置>账户,然后找到下图截取的地方(需要设置的,如图)

设置完之后呢,就要把生成的授权码作为邮箱的password的啦~

配置/etc/mail.rc文件【下面的配置qq是假的,别用】

#设置发件人名称
set [email protected]
#设置邮件服务器
set smtp=smtp.qq.com
#填写自己邮箱地址
set [email protected]
#输入邮箱验证码
set smtp-auth-password=pfljngafoqaxecff
#smtp的认证方式,默认是login
set smtp-auth=login

测试【已经完成】

 echo "admin ,文件内容" | mail -s "标题" 你的[email protected]

一键查看服务器利用率

#!/bin/bash
function cpu(){
    
    util=$(vmstat | awk '{if(NR==3)print $13+$14}')
    iowait=$(vmstat | awk '{if(NR==3)print $16}')
    echo "CPU -使用率:${util}% ,等待磁盘IO相应使用率:${iowait}:${iowait}%"
 
}
function memory (){
 
    total=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}'`
    used=`free -m |awk '{if(NR==2) printf "%.1f",($2-$NF)/1024}'`
    available=`free -m |awk '{if(NR==2) printf "%.1f",$NF/1024}'`
    echo "内存 - 总大小: ${total}G , 使用: ${used}G , 剩余: ${available}G"
}
disk(){
    
    fs=$(df -h |awk '/^\/dev/{print $1}')
    for p in $fs; do
        mounted=$(df -h |awk '$1=="'$p'"{print $NF}')
        size=$(df -h |awk '$1=="'$p'"{print $2}')
        used=$(df -h |awk '$1=="'$p'"{print $3}')
        used_percent=$(df -h |awk '$1=="'$p'"{print $5}')
        echo "硬盘 - 挂载点: $mounted , 总大小: $size , 使用: $used , 使用率: $used_percent"
    done
 
}
function tcp_status() {
    summary=$(ss -antp |awk '{status[$1]++}END{for(i in status) printf i":"status[i]" "}')
    echo "TCP连接状态 - $summary"
}
cpu
memory
disk
tcp_status

1. 学习目标和内容

1、能够理解描述网站业务访问流程

2、能够理解网站业务的优化方向

3、能够描述内存缓存软件Memcached的作用

4、能够通过命令行操作Memcached

5、能够操作安装php的memcached扩展 extension

6、能够实现session存储到memcached的案例

7、能够实现启动memcached多实例

2. 大型网站优化

2.1 网站访问流程

随着网站迭代开发,访问会变慢,LNMP架构中网站应用访问流程;

浏览器(app)=>web服务器=>后端服务(php)=>数据库(mysql)

访问流程越多,访问速度和出现问题的几率也越大

优化访问速度,就需要减少访问步骤或者提高单步骤的速度

2.2 如何优化

根据网页的访问流程,可以进行以下优化:

①提高web服务器并发 负载均衡(多台服务器架构) nginx

②页面静态化 把经常访问,但是数据不经常发生变动的动态页面,制作为静态页面

③内存缓存优化 把经常访问的数据,加载到内存中使用

④数据库优化 很多时候,还需要取数据库信息,所以优化数据库本身

3. 背景描述及其方案设计

3.1 业务背景描述

时间:2016.6.-2016.9

发布产品类型:互联⽹动态站点 商城

⽤户数量: 10000-12000(⽤户量猛增)

PV : 100000-500000(24⼩时访问次数总和)

QPS: 50-100*(每秒访问次数)

DAU: 2000(每⽇活跃⽤户数)

随着业务量增加,访问量越来越大,用户在访问某些页面数据时,通过慢查询日志发现慢查询SQL,经过优化之后效果还是不够明显。而此类数据发生变动的频率又较小,故提出使用缓存中间件(一般会将数据存储到内存中)的方式,降低MySQL的读压力,提高整个业务架构集群的稳定和快速响应能力

3.2 模拟运维设计方案

根据以上业务需求,准备加入缓存中间件服务器

1.jpg

根据以上业务需求和方案,服务器架构升级为如下示意图

2.jpg

在本次业务架构中,使用缓存中间件解决以下两个问题:

①session共享

②缓存热点数据,首页面的分类信息

4. memcached 介绍和安装启动

4.1 介绍

memory cache cache in memory 缓存放入内存中。

Memcached 是国外 社区 网站 LiveJournal 的开发团队开发的 高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性

3.jpg

关于缓存的过期,有效期问题,由业务编程代码实现

4.2 安装启动软件

官方网址http://memcached.org/

①上传软件到服务器

软件包名称 memcached-1.5.8.tar.gz

②解压并编译安装

 #memcache依赖libevent  安装libevent-devel解决
 shell > yum -y install libevent-devel
 #编译安装memcached
 shell > tar xvf memcached-1.5.8.tar.gz
 shell > cd memcached-1.5.8
 shell > ./configure --prefix=/usr/local/memcached
 shell > make && make install

③查看软件启动参数,并启动

 shell > cd /usr/local/memcached/bin
 shell > ./memcached -h

-p是设置Memcache监听的端口,最好是1024以上的端口;

  • d是启动一个守护进程;
  • m是分配给Memcache使用的内存数量,单位是MB;
  • u是运行Memcache的用户;
  • l是监听的服务器IP地址,可以有多个地址;
  • c是最大运行的并发连接数,默认是1024;
  • P是设置保存Memcache的pid文件

启动memcached

 #进入memcached文件目录
 shell > cd /usr/local/memcached/bin
 #后台启动memcached  可以创建一个普通用户(memcached)  用来启动管理memcached软件
 shell > ./memcached -uroot -d
 #进程查看是否启动成功
 shell > ps aux |grep memcached

5. memcached使用

5.1 命令行连接和操作

5.1.1 telnet连接使用

memcached默认使用启动服务占用tcp 11211端口。可以通过telnet进行连接使用。

 #安装telnet客户端
 shell > yum -y install telnet
 #通过telnet连接11211端口
 shell > telnet 127.0.0.1 11211
 #连接之后敲击多次,如果看到error,即为连接成功
 #显示error的原因是,没有输入命令,所以memcached服务器回复error

5.1.2 存储命令

语法:set

set 命令用于将 value(数据值) 存储在指定的 key(键) 中

如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用
devops。

set key flag exptime bytes

value

flag 服务端提供的一个标识,默认没什么意义,默认可以传个0,这个标识是为了编程语言一个状态,例如:flag(0,1) 代表是否采用压缩机制 0代表不压缩,1代表压缩

bytes 字节 计算机存储的最小单位 KB MB GB TB BB YB ZB

4.jpg

5.jpg

语法:add

add 命令用于将 value(数据值) 存储在指定的 key(键) 中

如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED

add key flag exptime bytes

value

6.jpg

语法:replace

replace 命令用于替换已存在的 key(键) 的 value(数据值)

如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED

replace key flag exptime bytes

value

7.jpg

语法:append

append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据

append key flag exptime bytes

value

8.jpg

语法:prepend

prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据

prepend key exptime bytes value

9.jpg

5.1.3 删除命令

语法:delete

delete 命令用于删除已存在的 key(键)

delete key

10.jpg

语法:flush_all

注意此命令,在业务线上环境禁止执行。如果执行,可能会造成所有缓存清空不存在,所有的数据请求都直接到了数据库服务器。造成数据库压力瞬间变大。数据库宕机。

flush_all 命令用于清理缓存中的所有 key=>value(键=>值) 对

该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作

flush_all [time]

11.jpg

5.1.4 查找和计算命令

语法:get

get 命令获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空

get key1 key2 key3

语法:incr(相加)/decr(相减)

计数器 每做一次操作 +1

incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作

incr 与 decr 命令操作的数据必须是十进制的32位无符号整数

incr key value

decr key value

12.jpg

5.1.5 统计状态命令

语法:stats

stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等

stats

13.jpg

stats的参数参考。

参数意义
pidmemcache服务器进程ID
uptime服务器已运行秒数
time服务器当前Unix时间戳
time-uptime启动时间
versionmemcache版本
pointer_size操作系统指针大小
rusage_user进程累计用户时间
rusage_system进程累计系统时间
curr_connections当前连接数量
total_connectionsMemcached 运行以来连接总数
connection_structuresMemcached分配的连接结构数量
cmd_getget命令请求次数
cmd_setset命令请求次数
cmd_flushflush命令请求次数
get_hitsget命令命中次数
get_missesget命令未命中次数
delete_missesdelete命令未命中次数
delete_hitsdelete命令命中次数
incr_missesincr命令未命中次数
incr_hitsincr命令命中次数
decr_missesdecr命令未命中次数
decr_hitsdecr命令命中次数
cas_missescas命令未命中次数
cas_hitscas命令命中次数
cas_badval使用擦拭次数
auth_cmds认证命令处理的次数
auth_errors认证失败数目
bytes_read读取总字节数
bytes_written发送总字节数
limit_maxbytes分配的内存总大小(字节)
accepting_conns服务器是否达到过最大连接(0/1)
listen_disabled_num失效的监听数
threads当前线程数
conn_yields连接操作主动放弃数目
bytes当前存储占用的字节数
curr_items当前存储的数据总数
total_items启动以来存储的数据总数
evictions:LRU释放的对象数目
reclaimed已过期的数据条目来存储新数据的数目

缓存命中率:命中数(get获取到数据)/获取次数(get的次数)

get_hits/cmd_get,如果命中率低,业务代码缓存有问题,命中率为0,缓存没有起作用

缓存穿透:访问的数据,数据库不存在的数据,每次都不能够生成缓存,每次请求都直接访问数据库,穿透了缓存,缓存没有起到作用。数据库压力没有得到缓解。解决方案,数据库查不到的,也做一个空缓存。

缓存雪崩:缓存具有失效时间,如果缓存失效时间都是一样,本来应该请求缓存的,但是因为缓存失效了,全部请求到了数据库,数据库压力剧增,可能会造成数据库宕机,进而造成系统崩溃。解决方案,设置缓存的失效时间均匀分布。

5.2 小工具

memcached_tool.php软件,可以查看memcached运行状态、key(item)的数量了、内存使用量等

需要php的运行环境

①上传memcached_tool.php到web服务器

上传到虚拟机主机可以访问的目录即可。

本次上传到了server01服务器的/usr/local/nginx/html/tp5shop/public下

②修改连接参数

 shell > vim /usr/local/nginx/html/tp5shop/public/memcached_tool.php

示例配置

memcached_tool.jpg

登录地址看实际的地址,演示用,软件脚本在server01上,memcached服务在server08上,所以地址应该填写memcached服务所在地址server08的IP(192.168.17.107)

③查看使用

14.jpg

5.3 失效机制(了解)

①如果key过期了,value会及时删除么,空间会及时清空么?

②如果分配的存储空间,写满了,还允许写么?

5.3.1 Lazy Expiration

memcached 内部不会监视记录是否过期,而是在 get时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy(惰性)expiration。因此,memcached 不会在过期监视上耗费 CPU 时间

比如php的里session机制 懒惰机制 php垃圾回收机制 gc回收 python 变量垃圾回收机制

编程语言中,变量分配 栈空间(变量名称) 堆空间(变量值)

memcached1.4.25之后 就不是懒惰机制了。

5.3.2 LRU

memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。因此,当 memcached 的内存空间不足时,就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想

不过,有些情况下 LRU 机制反倒会造成麻烦。memcached 启动时通过“­M”参数可以禁止 LRU

6. PHP使用memcached

6.1 PHP扩展安装

在LNMP架构中,如果需要使用到memcached。首先需要安装对应的扩展,php7以上需要安装memcached扩展。

官方扩展地址http://pecl.php.net/

①上传PHP扩展源码包

需要在web服务器的上安装扩展,server01和server03

memcached-3.1.3.tgz php的扩展 依赖libmemcached1.x以上版本

yum 本地源的 libmemcached依赖版本太低,不能够满足php扩展的依赖需要,需要手动源码编译libmemcached

libmemcached-1.0.18.tar.gz 依赖

②解压编译安装

 #1、解决libmemcached依赖
 shell > tar xvf libmemcached-1.0.18.tar.gz
 shell > cd libmemcached-1.0.18
 shell > ./configure --prefix=/usr/local/libmemcached && make && make install
 #2、源码编译php扩展
 shell > tar xvf memcached-3.1.3.tgz
 shell > cd memcached-3.1.3
 #扩展源码包和php关联生成configure文件
 #如果执行找不到phpize,说明之前没有给php安装目录bin目录配置环境变量,重新配置即可
 shell > phpize
 #编译安装php的memcached扩展
 shell > ./configure --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
 shell > make && make install

编译完成生成的扩展文件

15.jpg

③在php.ini配置文件里开启

 shell > vim /usr/local/php/etc/php.ini

16.jpg

重启php-fpm服务

④检测扩展

方法一:php -m

通过php -m调用查看php所加载的依赖模块

 shell > php -m |grep memcached

方法二:通过web页面访问phpinfo

 <?php
 phpinfo();

编写一个页面,通过web访问

17.jpg

6.2、PHP测试连接代码

php代码测试使用memcached

示例代码

 <?php
 //实例化类
 $mem = new memcached();
 //调用连接memcached方法 注意连接地址和端口号
 $mem->addServer('192.168.17.107',11211);
 //存数据
 var_dump($mem->set('name','lnmp'));
 //取数据
 var_dump($mem->get('name'));

7. 企业案例实现

7.1 session 入 memcached 共享

session共享:

分布式负载均衡架构中,web服务器间的session是不共享(默认session存储在本地的文件的),会造成session校验不一致。校验验证码不通过,登录之后session不一致,造成无法判断是否登录。

解决方案:

  1. session 生成校验在同一台服务器 nginx调度算法 ip_hash
  2. session 共享多台web服务器可以调用到session

文档参考

18.jpg

① 修改项目配置文件

server01和server03都需要修改,并且web服务器都要安装好memcached扩展

 shell > vim /usr/local/nginx/html/tp5shop/application/config.php

修改完成之后,之后的请求所生成的session,就被写入到memcached中了。

19.jpg

②访问测试

在memcached中,session_id作为key,session的内容作为value进行存储。

都是在业务代码中实现,服务架构中,只要按需配置即可。

7.2 缓存热点数据

把经常访问到的数据,发生变动较小,可以存储到内存缓存中,提供使用速度

20.jpg

注意修改web服务器的文件时,一定要都修改web1和web2

①修改缓存数据

修改代码文件

 shell > /usr/local/nginx/html/tp5shop/application/home/controller/Base.php

21.jpg

②修改项目缓存配置

学习目标和内容

1、能够描述项目流程

2、能够了解PV、QPS、DAU等参数

3、能够实现服务器基本环境配置

4、能够部署配置MySQL生产环境

5、能够部署配置Nginx生产环境

6、能够部署配置PHP生产环境

7、能够理解PHP-FPM和Nginx关联关系

8、能够配置Nginx关联到PHP-FPM

运维十年演变发展史

项目开发流程

  1. 公司老板和产品经理根据市场调查,决定开发的一整套互联网产品:互动社交+电商+用户论坛(BBS)
  2. 产品决策(老板+产品+UI设计)=》代码开发(程序开发人员[前端开发[客户端页面或者APP]和后端开发[java php python node ruby])=》测试工作(测试人员)=》部署上线(运维人员)(SA、dev 开发ops 运维)

项目从开始策划,实施,上线,维护,一直到结束。称之为项目的生命周期。

作为运维人员来说,不仅仅是在上线流程中参与。

需要在策划,实施之初,就进行准备工作。学习对应架构和方案的知识点等。

比如:

  1. 项目代码使用lnmp架构,那么就需要对lnmp架构熟悉;
  2. 开发人员需要多人协作开发,合并代码,就需要服务器上搭建代码版本控制器;
  3. 测试人员需要用到的测试环境等等;

企业架构分布式集群解决方案

  • 集群:多台服务器在一起作同样的事 。
  • 分布式 :多台服务器在一起作不同的事 。

小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群

最终的架构图示,实现负载均衡LB、高可用HA、数据库主从复制M-S、读写分离R-W、缓存中间件[memcached、Redis] nosql[mongodb]·······

1.png

业务背景

年份:2008-2010

发布产品类型:互联网动态站点、社区论坛、商城、社交类站点

⽤户数量: 100-500

PV : 1000-3000(24小时访问次数总和 8小时) 页面访问数量 点击量

QPS: 5-10(每秒访问查询次数) 并发量 吞吐量 TPS RPS

DAU: 10-50(每日活跃用户数) 日活数 根据用户登录等方式

QPS 两种方法:

  1. 计算 pv/时间 = qps
  2. 压测 使用ab等并发测试软件 在规定时间发送一定的请求数量

服务器基本环境部署

为了学习的方便和需要,需要先进行基本环境的搭建

1、安装一台虚拟机,centos6.9操作系统

2、网络配置

3、机器名FQDN设置

4、DNS解析设置 本地Hosts解析

5、各类防火墙暂时关闭

6、配置需要的yum环境及其源地址

7、vim安装配置

8、网络校时 ntpd

虚拟机软件搭建

可以参考文档《虚拟机和镜像.doc》

准备好ISO镜像文件

这里安装系统镜像,采用minimal的方式,自定义选择开发工具。安装更加快速,系统也更加轻便。

可以参考文档《虚拟机和镜像.doc》

以上操作完成基本服务器镜像系统的安装

网络配置和检测

维护的机器数量比较多时,单独配置静态IP是很繁琐。这里使用NAT模式,DHCP自动分配IP

①vmware NAT连接方式,本地DHCP服务启用

2.jpg

注意NAT服务和DHCP服务需要启动

3.jpg

②IP租约和续约

4.jpg

不管采用何种方式获取到IP都可以,能够管理清晰和使用明白即可。

FQDN设置(重要)

在集群中配置FQDN,有助于进行区分主机身份。

server01 server01.lnmp.com

①添加修改/etc/hosts

 shell > vim /etc/hosts
 #在文件里追加一行
 192.168.17.102 server01.lnmp.com server01

②网卡配置/etc/sysconfig/network

 shell > vim /etc/sysconfig/network
 #修改HOSTNAME的值为server01
 HOSTNAME=server01

防火墙关闭

centos6.x系列中

关闭iptables

 #关闭iptables
 shell > service iptables stop
 #关闭开机自启动
 shell > chkconfig iptables off

关闭selinux

 #临时关闭
 shell > setenforce 0 &>>/dev/null
 #修改配置文件  永久关闭
 shell > sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config;

yum源环境配置

配置本地光盘源,使用centos的两个光盘:

①虚拟机添加新光驱并选择光盘路径

5.jpg

注意添加设备,需要关闭虚拟机里的操作系统

6.jpg

7.jpg

②linux挂载多个光盘

 #建立光盘挂载目录文件夹
 shell > mkdir /dvd1 /dvd2
 #手动挂载光盘 顺便调整光盘顺序
 shell > mount /dev/sr0 /dvd2
 shell > mount /dev/sr1 /dvd1
 #lsblk查看是否挂载成功
 #添加到开启加载脚本  开机自动挂载光盘
 shell > echo "mount /dev/sr0 /dvd2" >> /etc/rc.local
 shell > echo "mount /dev/sr1 /dvd1" >> /etc/rc.local

③配置yum本地光盘源

 shell > cd /etc/yum.repos.d
 shell > mkdir bak
 #移动默认源 备份并使其失效
 shell > mv ./* ./bak
 #按照挂载光盘位置,配置光盘源

安装vim编辑器并配置

①yum 安装vim配置显示行号

 shell > yum -y install vim
 #配置vim默认显示行号
 shell > echo "set nu" >> /root/.vimrc

②grep搜索关键字高亮显示

 #搜索关键字高亮
 shell > sed -i "8calias grep='grep --color'" /root/.bashrc
 #当前窗口重新加载配置
 shell > source /root/.bashrc

8、网络校时(重要)

服务器校时的原因:

①因为计划任务要执行,提供准确的时间

②服务器间进行通信时,需要统一的一致时间

 #安装校时命令和服务
 shell > yum -y install ntp
 #开启ntpd服务
 shell > service ntpd start
 #开机自启ntpd
 shell > chkconfig ntpd on

国内第三方NTP校时网址

https://opsx.alibaba.com/service?lang=zh-cn&activeKey=2

企业服务器LNMP环境搭建

常见的软件架构:

①C/S client/server

②B/S browser/server

不管是C还是B,都是属于客户端属于前端。那么运维人员主要负责和管理的是server端,也统称为服务器端。为了能够提供快速的提供服务端使用,互联网中有多种解决方案和架构,其中以下两种架构有着广泛的使用基础。

1> LAMP Linux+Apache+MySQL+PHP2> LNMP Linux+Nginx+MySQL+PHP

lnmpa nginx+mysql+php+apache

lnmt nginx+mysql+tomcat(jdk)

nginx+mysql+(python+nodejs|ruby)

之前已经学习过了LAMP架构,接上来学习LNMP架构解决方案。

在企业中搭建实际业务环境时,一般依赖文件(小文件)使用yum安装解决,生产业务环境需要使用源码编译的方式进行安装。

源码编译预估时间:

Mysql 852s≈15m

Nginx 27s≈1m

PHP 564s≈10m

MySQL

1.1、相关参数介绍

编译参数的说明

参数作用
-DCMAKE_INSTALL_PREFIX安装到的软件目录
-DMYSQL_DATADIR数据文件存储的路径
-DSYSCONFDIR配置文件路径 (my.cnf)
-DENABLED_LOCAL_INFILE=1使用localmysql客户端的配置
-DWITH_PARTITION_STORAGE_ENGINE使mysql支持分表
-DEXTRA_CHARSETS安装支持的字符集
-DDEFAULT_CHARSET默认字符集使用 这里配置为utf8mb4
-DDEFAULT_COLLATION连接字符集
-DWITH_SSL开启mysql的ssl使用

初始化参数说明

--basedir安装到的软件目录
--datadir数据文件存储路径
--usermysql使用的用户

1.2、脚本实现安装及其初始化

 #!/bin/bash
 #源码编译安装MySQL
 mysql_install() {
     #1、创建用户
 `id mysql` &>/dev/null
 [ $? -ne 0 ] && useradd -s /sbin/nologin -M mysql
 #2、解决依赖
 yum install -y cmake
 yum install -y ncurses-devel
 #3、编译安装
 cd /root/soft
 tar zxvf mysql-5.6.33.tar.gz
 cd mysql-5.6.33
 cmake \
 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
 -DMYSQL_DATADIR=/usr/local/mysql/data \
 -DSYSCONFDIR=/etc \
 -DENABLED_LOCAL_INFILE=1 \
 -DWITH_PARTITION_STORAGE_ENGINE=1 \
 -DEXTRA_CHARSETS=all \
 -DDEFAULT_CHARSET=utf8mb4 \
 -DDEFAULT_COLLATION=utf8mb4_general_ci\
 -DWITH_SSL=bundled
 make && make install
 #配置文件
 rm -rf /etc/my.cnf
 cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
 #授权并初始化数据库
 chown -R mysql:mysql /usr/local/mysql
 /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
 #配置服务、自启动和环境变量
 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
 service mysqld start
 chkconfig --add mysqld
 echo 'PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile
 #删除匿名用户
 #设置root域名的密码
 rpm -qa|grep expect
 if [ $? -ne 0 ];then
    yum -y install expect
 fi
 #导入环境变量PATH
 export PATH=/usr/local/mysql/bin:$PATH
 #初始化root密码 删除匿名用户
 echo '#!/usr/bin/expect
 set timeout 60
 spawn mysql_secure_installation
 expect {
 "enter for none" { send "\r"; exp_continue}
 "Y/n" { send "Y\r" ; exp_continue}
 "password" { send "123456\r"; exp_continue}
 "Cleaning up" { send "\r"}
 }
 interact ' > mysql_secure_installation.exp
 chmod +x mysql_secure_installation.exp
 ./mysql_secure_installation.exp
 }
 #脚本开始时间
 start_time=`date +%s`
 #执行的脚本代码
 mysql_install
 #脚本结束时间
 end_time=`date +%s`
 #脚本执行花费时间
 const_time=$((end_time-start_time))
 echo 'Take time is: '$const_time's'

2、Nginx

2.1、介绍

常见用法:

1) web服务器软件 httpd http协议

同类的web服务器软件:apache nginx(俄罗斯) IIS(微软 fastcgi) lighttpd(德国)

2)代理服务器 反向代理

3)邮箱代理服务器 IMAP POP3 SMTP

4)负载均衡功能 LB loadblance

Nginx架构的特点:

①高可靠:稳定性 master进程 管理调度请求分发到哪一个worker=> worker进程 响应请求 一master多worker

热部署 :(1)平滑升级 (2)可以快速重载配置

高并发:可以同时响应更多的请求 事件 epoll模型 几万

响应快:尤其在处理静态文件上,响应速度很快 sendfile

低消耗:cpu和内存 1w个请求 内存2-3MB

分布式支持 :反向代理 七层负载均衡

官方网址:http://nginx.org/

2.2、安装

常见安装方式:

①yum安装配置,需使用Nginx官方源或者EPEL源

②源码编译

问题编译过程中出现问题:

9.jpg

10.jpg

11.jpg

依赖解决

 shell > yum -y install pcre-devel zlib-devel openssl-devel

安装步骤及其脚本

 #!/bin/bash
 #编译安装Nginx
 nginx_install(){
 #创建软件运行用户
 `id www` &>>/dev/null
 if [ $? -ne 0 ];then
    useradd -s/sbin/nologin -M www
 fi
 #安装依赖
 yum -y install pcre-devel zlib-devel openssl-devel
 #编译安装
 cd /root/soft
 tar xvf nginx-1.14.2.tar.gz
 cd nginx-1.14.2
 ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module && make && make install
 }
 #脚本开始时间
 start_time=`date +%s`
 #执行的脚本代码
 nginx_install
 #脚本结束时间
 end_time=`date +%s`
 #脚本执行花费时间
 const_time=$((end_time-start_time))
 echo 'Take time is: '$const_time's'

编译参数说明

参数作用
--prefix编译安装到的软件目录
--userworker进程运行用户
--groupworker进程运行用户组
--with-http_ssl_module支持https 需要pcel-devel依赖
--with-http_stub_status_module基本状态信息显示 查看请求数、连接数等
--with-http_realip_module定义客户端地址和端口为header头信息 常用于反向代理后的真实IP获取

2.3、目录介绍

查看安装目录/usr/local/nginx

目录作用
conf配置文件
html网站默认目录
logs日志
sbin可执行文件 [软件的启动 停止 重启等]

2.4、软件操作参数

查看nginx的二进制可执行文件的相关参数

 shell > cd /usr/local/nginx/sbin
 shell > ./nginx -h

执行后显示

 nginx version: nginx/1.14.2
 Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
 
 Options:
 #查看帮助
   -?,-h         : this help
 #查看版本并退出
   -v            : show version and exit
 #查看版本和配置选项并退出
   -V            : show version and configure options then exit
 #检测配置文件语法并退出
   -t            : test configuration and exit
 #检测配置文件语法打印它并退出
   -T            : test configuration, dump it and exit
 #在配置测试期间禁止显示非错误信息
   -q            : suppress non-error messages during configuration testing
 #发送信号给主进程  stop强制退出  quit优雅的退出  reopen重开日志   reload重载配置
   -s signal     : send signal to a master process: stop, quit, reopen, reload
 #设置nginx目录  $prefix路径
   -p prefix     : set prefix path (default: /usr/local/nginx/)
 #指定启动使用的配置文件
   -c filename   : set configuration file (default: conf/nginx.conf)
 #在配置文件之外设置全局指令
   -g directives : set global directives out of configuration file

一般主要使用:

  • s参数控制管理nginx服务
  • V参数查看nginx开启的模块和编译参数
  • t参数检测配置文件是否有错误

2.5、服务配置

①使用社区的服务配置文件

nginx编译包里默认没有服务启动脚本模板,可以通过社区获得

https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/

上传脚本到/etc/init.d目录下

 shell > vim /etc/init.d/nginx

修改软件和配置路径

 #执行文件路径  第22行
 nginx="/usr/local/nginx/sbin/nginx"
 #配置文件路径  第25行
 NGINIX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

②添加自启动

 shell > chmod +x /etc/init.d/nginx
 shell > chkconfig --add nginx
 shell > chkconfig nginx on

注意在服务脚本中,有chkconfig配置开启模式、开启顺序、关闭顺序设置

 #!/bin/sh
 #
 # nginx - this script starts and stops the nginx daemon
 #              开启模式(0-6)   开启顺序  关闭顺序
 # chkconfig:   - 85 15

3、PHP

3.1、介绍

PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)对于PHP 5.3.3之前的php来说,是一个补丁包 ,旨在将FastCGI进程管理整合进PHP包中。
相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab定时进行监控,而PHP-FPM则没有这种烦恼。
PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

页面分类:

静态页面 一般普通访问到的页面

动态页面 用户可以和服务器进行交互页面

执行动态页面,需要和服务器进行交互,使用后端语言进行开发

LNMP 使用php进行开发交互

13.png

LAMP和LNMP在使用和配置PHP的区别:

14.png

3.2、安装

解压进入目录

 shell > tar zxf php-7.2.12.tar.gz
 shell > cd php-7.2.12

编译参数配置

 shell > ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-ftp --with-gd --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --with-libzip --enable-soap --without-pear --with-gettext --disable-fileinfo --enable-maintainer-zts

--with 代表需要手动开启 可能需要加载第三方模块 第三方模块没有,就会error

  • -enable 代表开启php的默认功能
  • -without 关闭默认加载的模块

解决遇到的依赖软件问题

15.jpg

16.jpg

17.jpg

18.jpg

 shell > yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel openssl-devel

编译并安装到目录

 shell > make && make install

查看PHP的安装目录

 shell > cd /usr/local/php
 shell > ls
目录名称作用
binphp相关命令目录 php phpize、php-config在源码编译扩展时用
etc配置文件目录
includephp默认类库
libphp第三方扩展类库
phpman文档文件
sbinphp-fpm执行文件
varlog日志目录 run运行目录 保存pid文件

3.3、配置

使用php-fpm进行管理php服务,有两个配置文件:

①php.ini #默认php配置文件

②php-fpm.conf #php-fpm相关的配置

复制配置文件

 shell > cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
 shell > cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
 shell > cp /root/soft/php-7.2.12/php.ini-development /usr/local/php/etc/php.ini

添加启动服务

 shell > cp /root/soft/php-7.2.12/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
 shell > chmod +x /etc/init.d/php-fpm
 shell > chkconfig --add php-fpm

添加环境变量(方便php、phpize、phpconfig查找使用)

 shell > echo 'PATH=/usr/local/php/bin:$PATH' >> /etc/profile
 shell > source /etc/profile

php安装脚本及其初始化配置

以下脚本,作为编译安装和配置php的参考

 #!/bin/bash
 php_install(){
 #php编译安装
 #和nginx使用相同的用户,如果没有就创建
 `id www` &> /dev/null
 [ $? -ne 0 ] && useradd -s /sbin/nologin -M www
 #解决依赖
 yum -y install libxml2-devel libjpeg-devel libpng-devel freetype-devel curl-devel openssl-devel
 #解压
 tar xvf php-7.2.12.tar.gz
 cd php-7.2.12
 #编译安装php
 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --enable-ftp --with-gd --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --with-libzip --enable-soap --without-pear --with-gettext --disable-fileinfo --enable-maintainer-zts && make && make install
 #配置文件初始化
 cp php.ini-development /usr/local/php/etc/php.ini
 #php-fpm服务配置文件
 cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
 #php-fpm服务子配置文件
 cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
 #配置服务及其环境变量
 cp /root/soft/php-7.2.12/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
 chmod +x /etc/init.d/php-fpm
 service php-fpm start
 chkconfig --add php-fpm
 echo 'PATH=/usr/local/php/bin:$PATH' >> /etc/profile
 }
 #脚本开始时间
 start_time=`date +%s`
 #执行的脚本代码
 php_install
 #脚本结束时间
 end_time=`date +%s`
 #脚本执行花费时间
 const_time=$((end_time-start_time))
 echo 'Take time is: '$const_time's'

3.4、Nginx+php-fpm配置

①编写测试文件

 shell > vim /usr/local/nginx/html/index.php

文件内容

 <?php
     phpinfo();

②在nginx.conf中配置

修改配置文件,告知nginx如果接收到.php结尾的请求,交由给php-fpm进行处理

 shell  > vim /usr/local/nginx/conf/nginx.conf

打开location .php 结尾那一段注释,并修改script为$document_root

#1、把root变量提升上层
 root html;
         location / {
             #root   html;
             index  index.html index.htm;
         }
 
         #error_page  404              /404.html;
 
         # redirect server error pages to the static page /50x.html
         #
         error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
 
         # proxy the PHP scripts to Apache listening on 127.0.0.1:80
         #
         #location ~ \.php$ {
         #    proxy_pass   http://127.0.0.1;
         #}
 
         # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
         #
         location ~ \.php$ {
           #2、默认使用上层的root变量
         #    root           html;
             fastcgi_pass   127.0.0.1:9000;
             fastcgi_index  index.php;
           #3、把script修改为$document_root  $document_root 就是上面的root
             fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
             include        fastcgi_params;
         }

  1. 自动化系统初始化(update,软件安装,系统时区,安全策略)
  2. 自动化批量软件部署程序(LAMP/LNMP/Tomcat/LVS/Nginx)
  3. 管理应用程序(KVM,集群管理扩展)

ppozCYd.md.png

  1. 日志分析程序(PV,UV)
  2. 自动化备份恢复程序(MySQL 完全备份/增量 + Crond)
  3. 自动化管理程序(批量远程修改密码,润健升级,胚子更新)
  4. 自动化信息采集以及监控程序(收集系统/应用状态信息,CPU,Disk,Mem)
  5. 配合 Zabbix 信息采集(收集系统/应用状态信息)
  6. 自动扩容(增加云主机→业务上线):Zabbix 监控 CPU 80% + | - 50% Python APing AWS/EC2 (增加删除主机) + Shell Script
  7. 俄罗斯方块,打印三角形。。。
  8. 理论上可以做任何事(一切取决于业务的需求)