一、环境准备
首先我们先介绍下环境和实验中所需要的包
环境:
我使用的是centos7.6的系统
建议关掉selinux和影响到80端口的防火墙策略
- selinux永久有效
修改 /etc/selinux/config 文件中的 SELINUX=”” 为 disabled ,然后重启。
- selinux即时生效
setenforce 0
关闭防火墙的方法为:
- 永久性生效
开启:chkconfig iptables on
关闭:chkconfig iptables off
- 即时生效,重启后失效
开启:service iptables start
关闭:service iptables stop
程序包:
nginx(使用系统默认带的光盘里的包,当然也可以自己编译安装,但是搭建个人博客不建议,因为没必要)
mariadb mariadb-server(数据库使用maridb-server也是系统本地镜像里的)
php-fpm(用来管理php程序的,另外nginx不支持php模块)
php-mysql(用来事项php与数据库连接)
wordpress程序包官网地址:https://wordpress.org/download/
wordpress主题:https://wordpress.org/themes/
yum install nginx mariadb-server php-fpm php-mysql -y
systemctl enable nginx mariadb php-fpm 设置开机自启
二、各服务配置
Nginx配置
写nginx的配置文件也有两种方式,直接写主配置里,和写到conf.d文件夹下,这里使用第二种,其实没啥区别
vim /etc/nginx/nginx.conf
在http配置段里添加
http {
fastcgi_cache_path /var/cache/nginx/fcgi_cache levels=1:2:1 keys_zone=fcgicache:20m inactive=120s;
特别注意:用来设置缓存的一些参数,当你要做多虚拟主机时一定要在重新设置以个并在server配置段里修改
}
这个主要是定义缓存的一些配置,可直接拿来用
vim /etc/nginx/conf.d/blog.conf #必须conf后缀
server {
listen 80 ; #监听地址
server_name blog.luckynm.cn ; #域名
root /data/wordpress ; #web的根路径
index index.php index.html index.hml; #默认索引
location / {
try_files $uri uri&
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME fastcgi_script_name;
include fastcgi_params;
fastcgi_cache fcgicache;
fastcgi_cache_key #card=math&code=request_uri%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20fastcgi_cache_valid%20200%20302%2010m%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20fastcgi_cache_valid%20301%201h%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20fastcgi_cache_valid%20any%201m%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20location%20~%2A%20%5E%2F%28status%7Cping%29) { #用来查看网站的状态信息,可以不添加
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}
location /files { #用来在网页访问文件夹,相当于做了个文件夹映射,可根据个人情况添加
root /data/wordpress;
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
}
nginx的配置基本就这些。
MySQL设置
在命令行输入mysql进入数据库
数据库的话可以再做些安全配置,这里就不演示啦
mysql
MariaDB [(none)]> create user ‘wp_user’@’localhost’ identified by ‘密码’; 创建个给wordpress使用的连接数据库的账号
MariaDB [(none)]> create database wordpress; 创建数据库
MariaDB [(none)]> grant all privileges on wordpress.* to ‘wp_user’@’%’; 给wp_user用户授权
建议创建好后登陆测试一下
mysql -uwp_user -p
Php-Fpm设置
它有好多的参数可以设置,也有好多坑,在这里会给大家说一下需要注意的地方
vim /etc/php-fpm.d/www.conf
user = nginx #设置所属者所属组,不设置的话在装wordpress升级主题时有各种各样的权限问题
group = nginx
pm = ondemand #推荐使用这个模式,对他的详细介绍参考http://blog.luckynm.cn/?p=65
pm.max_children = 50 #这些都可以配置也可以默认,看情况
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.status_path = /status
pm.status_path = /status #后面这三个是用来设置在web页面上查看服务器状态信息的,配合nginx种server段的配置使用
ping.path = /ping
ping.response = pong
Wordpress配置
在做好前面的步骤后先不要启动,因为它们启动可能会有顺序问题
把下载下来的wordpress包传到本地,可以重新建一个文件夹存放也可以直接放到/root目录下
建议使用中文的包wordpress-5.0-zh_CN.tar.gz
mkdir -pv /data 创建data目录,这个要和nginx中root定义的根要一致
tar xvf wordpress-5.0-zh_CN.tar.gz -C /data/ 解压到/data目录下
chown -R nginx:nginx /data/wordpress 修改所属者所属组,不该没办法换主题升级插件,等一系列问题
cd /data/wordpress
mv wp-config-sample.php wp-config.php 设置配置文件
vim wp-config.php
define(‘DB_NAME’, ‘wordpress’); WordPress数据库的名称
define(‘DB_USER’, ‘wp_user’); MySQL数据库用户名
define(‘DB_PASSWORD’, ‘密码’); MySQL数据库密码
define(‘DB_HOST’, ‘localhost’); MySQL主机
启动
systemctl start mariadb php-fpm
systemctl start nginx
注意:php-fpm一定要在nginx前启动,要不然会提示找不到缓存文件夹
总结
以上就是我们搭建博客的全部内容,在搭建过程中一定要注意一些配置的细节,又可能一个参数没配,整个架构都起不来,这篇文章也仅代表我自己的见解,不同的系统有不同的配置,我总结了下平常小伙伴们可能遇到的问题,在这里和大家分享下:
解决办法:都是权限的问题,在php-fpm的/etc/php-fpm.d/www.conf里修改所属者所属组,默认时apache
user = nginx
group = nginx
问题描述:服务器内存小,mysql老自动停机
解决办法: 优化下pfp-fpm就好啦,本文中提到啦优化的方式,或参考:http://blog.luckynm.cn/?p=65
如果想要实现让nginx显示文件夹目录可参考:http://blog.luckynm.cn/?p=120
数据的实时同步
要实现数据的实时同步需要利用监控服务inotify,监控同步数据服务器目录中信息的变化,当发现目录中的数据产生变化,就利用rsync服务推送到备份服务器上。
inotify:异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的 轮询机制来获取事件,linux内核从2.6.13起支持 inotify,通过inotify可以监控文 件系统中添加、删除、修改、移动等各种事件
实现inotify软件:inotify-tools,sersync,lrsync
查看服务器内核是否支持inotify
查看/proc/sys/fs/inotify目录下是否有以下文件,若是有则支持
[root@localhost ~]# ll /proc/sys/fs/inotify/
total 0 #查看
-rw-r—r— 1 root root 0 Jul 29 08:47 max_queued_events
-rw-r—r— 1 root root 0 Jul 29 08:47 max_user_instances
-rw-r—r— 1 root root 0 Jul 29 08:47 max_user_watches
参数作用
max_queued_events:inotify事件队列最大长度,如值太小会出现Event Queue Overflow 错误,默认值:16384
max_user_watches:可以监视的文件数量(单进程),默认值:8192
max_user_instances:每个用户创建inotify实例最大值,默认值:128
参数修改
临时有效
[root@localhost ~]# echo “81920” > /proc/sys/fs/inotify/max_user_watches
永久生效
[root@localhost ~]# vim /etc/sysctl.conf
fs.inotify.max_user_watches = 81920
[root@localhost ~]# sysctl -p
fs.inotify.max_user_watches = 81920
inotify-tools
inotify-tools是基于epel源的,需要开启自建epel源或yum install epel-release安装
[root@localhost ~]# yum install inotify-tools -y
inotify-tools的主要文件
[root@localhost ~]# rpm -ql inotify-tools
/usr/bin/inotifywait
/usr/bin/inotifywatch
inotifywait:在被监控的文件或目录上等待特定文件系统事件(open close delete等)发生,常用于实时同步的目录监控
inotifywatch:收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数统计
inotify命令用法
语法:
inotifywait [ options ] file1 [ file2 ] [ file3 ] [ … ]
options 说明
-m 始终保持事件监听
-d 以守护方式执行
-r 递归监控目录数据信息变化
-q 输出少量事件信息
—exclude 指定排除文件或目录,是哪个扩展的正则表达式
—excludei 和—exclude相同,不区分大小写
-o FILE 输出事件到文件中,标准正确输出
-s 发送错误到syslog中
—timefmt OPT 指定时间输出的格式
—format OPT 指定的输出格式;即实际监控输出内容
-e 指定监听的时间,如省略表示监听所有
inotifywait使用方法
1.监控目录,不带任何参数默认工作在前台
[root@localhost ~]# inotifywait /data
Setting up watches.
Watches established.
/data/ OPEN,ISDIR #不带任何参数,被访问一次就退出
2.持续递归监控目录
[root@localhost ~]# inotifywait -mrq /data (复制ssh 执行)
/data/ OPEN,ISDIR #访问目录
/data/ CLOSE_NOWRITE,CLOSE,ISDIR
/data/ CREATE aaa #创建文件
/data/ OPEN aaa
/data/ ATTRIB aaa
/data/ CLOSE_WRITE,CLOSE aaa
3.以守护进程执行
[root@localhost ~]# inotifywait -o /root/inotify.log -rq /data
[root@localhost ~]# tail /root/inotify.log
/data/ CREATE bbb #创建文件
4.定义格式输出
定义格式输出需要定义时间格式和输出格式两个选项
—timefmt OPT 时间格式
参数 说明
%Y 年份信息,包含世纪信息
%y 年份信息,不包括世纪信息
%m 显示月份,范围 01-12
%d 每月的第几天,范围是 01-31
%H 小时信息,使用 24小时制,范围 00-23
%M 分钟,范围 00-59
—timefmt “%Y-%m-%d %H:%M”
—format OPT 输出格式
FMT 格式定义
%T 输出时间格式中定义的时间格式信息,通过—timefmt option语法格式指定时间信息
%w 事件出现时,监控文件或目录的名称信息
%f 事件出现时,将显示监控目录下触发事件的文件或目录信息,否则为空
%e 显示发生的事件信息,不同的事件默认用逗号分隔
%Xe 显示发生的事件信息,不同的事件指定用X进行分隔
—format “%T %w%f event: %;e”
—format ‘%T %w %f’
指定输出的格式
[root@localhost ~]# inotifywait -o /root/inotify.log -drq —timefmt “%Y-%m-%d %H:%M” —format “%T %w%f event: %;e” /data
[root@localhost ~]# cat /root/inotify.log
2019-07-31 19:43 /data/abc event: CREATE
2019-07-31 19:43 /data/abc event: OPEN
2019-07-31 19:43 /data/abc event: ATTRIB
2019-07-31 19:43 /data/abc event: CLOSE_WRITE;CLOSE
2019-07-31 19:43 /data/ event: OPEN;ISDIR
2019-07-31 19:43 /data/ event: CLOSE_NOWRITE;CLOSE;ISDIR
2019-07-31 19:44 /data/ event: OPEN;ISDIR
2019-07-31 19:44 /data/ event: CLOSE_NOWRITE;CLOSE;ISDIR
2019-07-31 19:44 /data/aaa event: DELETE
5.监听特定的事件
使用-e选项可以指定监听的特定事件
事件类型 说明
create 文件或目录创建
delete 文件或目录被删除
modify 文件或目录内容被写入
attrib 文件或目录属性改变
close_write 文件或目录关闭,在写入模式打开之后关闭的
close_nowrite 文件或目录关闭,在只读模式打开之后关闭的
close 文件或目录关闭,不管读或是写模式
open 文件或目录被打开
moved_to 文件或目录被移动到监控的目录中
moved_from 文件或目录从监控的目录中被移动
move 文件或目录不管移动到或是移出监控目录都触发事件
access 文件或目录内容被读取
delete_self 文件或目录被删除,目录本身被删除
unmount 取消挂载
监控新建,删除,改属性,改名字
[root@localhost ~]# inotifywait -mrq —timefmt “%Y-%m-%d %H:%M” —format “%T %w%f event: %;e” /data -e CREATE,MOVED_TO,DELETE,ATTRIB
2019-07-31 19:52 /data/abc event: DELETE
2019-07-31 19:52 /data/bbb event: DELETE
2019-07-31 19:52 /data/123 event: CREATE
2019-07-31 19:52 /data/123 event: ATTRIB
inotify和rsync实现实时同步
要实现inotify和rsync实时同步,需要将用来同步的服务器设置为rsync服务器
准备主机2台,客户端,rsync服务器,客户端监控本机/data目录下的数据变化,服务器端用来同步/data数据
主机 IP
rsync 192.168.37.51
client 192.168.3752
rsync服务器配置
1.安装rsync
[root@rsync ~]# yum install rsync -y
2.创建一个用来同步数据的目录
[root@rsync ~]# mkdir /data/backup
3.修改rsync配置文件
[root@rsync ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
max connections = 0
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
reverse lookup = no
host allow = 192.168.37.52
[backup]
path = /data/backup/
comment = backup
readonly = no
auth users = rsyncuser
secrets file = /etc/rsync.pass
4.生成验证用的账户密码,修改为安全权限
[root@rsync ~]# echo “rsyncuser:111111” > /etc/rsync.pass
[root@rsync ~]# chmod 600 /etc/rsync.pass
5.启动服务(rsyncd端口号873)
[root@rsync ~]# systemctl start rsyncd
client端配置
测试rsync一次性任务
1.安装rsync
[root@client ~]# yum install rsync -y
2.配置密码文件,修改为安全权限
[root@client ~]# echo “111111” > /etc/rsync.pass
[root@client ~]# chmod 600 /etc/rsync.pass
3.执行rsync命令
把本机的/data目录下的数据利用rsync远程同步到73.110的backup指定的文件夹中去
[root@client ~]# rsync -avz —password-file=/etc/rsync.pass /data/ rsyncuser@192.168.37.51::backup
sending incremental file list
./
nfs1/
nfs1/123
nfs1/aaa
nfs1/wang
nfs2/
nfs2/nfs2.txt
wanghome/
wanghome/.bash_history
wanghome/.bash_logout
wanghome/.bash_profile
wanghome/.bashrc
wanghome/.viminfo
wanghome/test
sent 1,587 bytes received 225 bytes 3,624.00 bytes/sec
total size is 1,215 speedup is 0.67
同步成功
让inotify配合sync实时同步
1.在客户端创建脚本
[root@client ~]# vim rsync.sh
!/bin/bash
SRC=’/data/‘
DEST=’rsyncuser@192.168.37.51::backup’
inotifywait -mrq —timefmt ‘%Y-%m-%d %H:%M’ —format ‘%T %w %f’ -e create,delete,moved_to,close_write,attrib {DIR}${FILE}
rsync -az —delete —password-file=/etc/rsync.pass $SRC $DEST && echo “At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync” >> /var/log/changelist.log
done
2.运行脚本
[root@client ~]# bash rsync.sh
CentOS7 搭建LVS/NAT 负载均衡集群
实验拓扑图:
操作流程:
Director Server pc50 : 192.168.37.50
172.16.131.244
安装并启用ipvsadm
创建虚拟服务器
向虚拟服务器上加入节点
web Server1 pc51: 192.168.37.51
web Server2 pc52: 192.168.37.52
配置WEB 客户端
Clinet : 172.16.131.247
连接虚拟服务器测试
具体步骤:
全局环境准备:
配置yam源或准备以下需要的软件
# systemctl stop firewalld.service //关闭防火墙
# systemctl disable firewalld.service //关闭开机自启
# firewall-cmd --state //查看
# setenforce 0 //设置SELinux 为宽松模式
web服务器 pc51 / pc52 :
# yum -y install httpd
[root@pc51 ~]# echo '192.168.37.51' > /var/www/html/test.html
[root@pc52 ~]# echo "192.168.37.52" > /var/www/html/test.html
# systemctl start httpd
# systemctl enable httpd
# yum -y install elinks
[root@pc51 ~]# elinks --dump http://localhost/test.html
192.168.37.51
[root@pc52 ~]# elinks --dump http://localhost/test.html
192.168.37.52
配置分发器 pc50:
#yum -y install ipvsadm
//开启内核的路由转发功能
# echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
# sysctl -p
net.ipv4.ip_forward = 1
网站服务器 pc51 / pc52 :
指定网关地址 192.168.37.50
# route -n//查看路由
# route add default gw 192.168.37.50//临时配置网关 网卡重启后生效
//永久配置网关
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
最后加:GATEWAY=192.168.37.50
# systemctl restart network //重新加载网卡
客户端 172.16.131.247 配置
指定网关地址 172.16.131.244 :
# vim /etc/sysconfig/network-scripts/ifcfg-ens33
最后加:GATEWAY=172.16.131.244
# systemctl restart network
# ping -c 2 192.168.37.51 //测试
PING 192.168.37.51 (192.168.37.51) 56(84) bytes of data.
64 bytes from 192.168.37.51: icmp_seq=1 ttl=63 time=0.322 ms
64 bytes from 192.168.37.51: icmp_seq=2 ttl=63 time=0.503 ms
--- 192.168.37.51 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.322/0.412/0.503/0.092 ms
# yum -y install elinks
配置分发器 pc50 :
# yum -y install ipvsadm
# rpm -q ipvsadm
ipvsadm-1.27-7.el7.x86_64
添加虚拟服务
# ipvsadm -L //查看 IPVS
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
# ipvsadm -A -t 172.16.131.244:80 -s rr//添加虚拟服务 调度算法为Round Robin
# ipvsadm -Ln //- n 数字显示
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.131.244:80 rr
//向虚拟服务器中加入节点
# ipvsadm -a -t 172.16.131.244:80 -r 192.168.37.51:80 -m
# ipvsadm -a -t 172.16.131.244:80 -r 192.168.37.52:80 -m
# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.131.244:80 rr
-> 192.168.37.51:80 Masq 1 0 0
-> 192.168.37.52:80 Masq 1 0 0
客户端测试
# elinks --dump http://172.16.131.244/test.html
192.168.37.51
# elinks --dump http://172.16.131.244/test.html
192.168.37.52
//客户端 轮询到不同的后端真实服务器
Director Server 查看:
[root@pc50 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 172.16.131.244:80 2 10 10 846 1098
-> 192.168.37.51:80 1 5 5 423 549
-> 192.168.37.52:80 1 5 5 423 549
模拟pc51 web服务故障:
[root@pc51 ~]# systemctl stop httpd
[root@pc50 ~]# ipvsadm -Z
//客户端测试
# elinks --dump http://172.16.131.244/test.html
192.168.4.52
# elinks --dump http://172.16.131.244/test.html
192.168.4.52
[root@pc50 ~]# ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 172.16.131.244:80 3 11 11 906 1138
-> 192.168.4.51:80 1 1 1 60 40
-> 192.168.4.52:80 2 10 10 846 1098
lvs工作模式和工作原理
文章目录
- 一、lVS基本介绍
二、LVS的体系架构
三、LVS集群
一、lVS基本介绍
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器。也是国人章文嵩博士发起的一个开源项目,现在LVS已经是Linux内核标准的一部分。
该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户,LVS工作模式分为NAT模式、TUN模式、以及DR模式。
利用LVS技术可以实现高性能,高可压缩的网络服务,例如www服务,FTP服务,MAIL服务等。
二、LVS的体系架构
使用LVS架设的服务器集群系统有三个部分组成:最前端的负载均衡层(LoaderBalancer),中间的服务器群组层,用Server Array 表示,最底层的数据共享存储层,用Shared Storage表示。在用户看来所有的应用都是透明的,用户只是在使用一个虚拟服务器提供的高性能服务。
1、LVS的体系架构如图
2、LVS集群分为三层结构:
Load Balancer层:位于整个集群系统的最前端,有一台或者多台负载调度器(Director Server)组成,LVS模块就安装在Director Server 上,而Director 的主要作用类似于一个路由器,它含有完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给Server Array层的应用服务器上。同时,在Director Server上还要安装对Real Server服务的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时把它从LVS路由表中剔除,恢复时加入。
Server Array层:服务器池(server pool)是一组真正执行clinet请求的服务器,一般是web服务器;除了web,还有FTP、MAIL、DNS等,每个Real Server之间通过高速的LAN或分布在各地的wan相连接。在实际的应用中,Director Server也可以同时兼任Real Server的角色。
Shared Storage层:共享存储(shared stord)它为server pool提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务。
从整个LVS结构可以看出,Director Server是整个LVS的核心,对于Real Server,可以是所有的系统平台,Linux、windows、Solaris、AIX、BSD系列都能很好的支持。
3、LVS相关术语
DS:Director Server。指的是前端负载均衡器节点
RS:Real Server。后端真实的工作服务器
VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址
DIP:Director Server IP,主要用于和内部主机通讯的IP地址
RIP:Real Server IP,后端服务器的IP地址
CIP:Client IP,访问客户端的IP地址
三、LVS集群
1、十种调度算法
(1)静态
rr 轮循调度 (Round-Robin Scheduling)
均等地对待每一台服务器,不管服务器上的实际连接数和系统负载wrr 加权轮循调度 (Weighted Round-Robin Scheduling)
调度器可以自动问询真实服务器的负载情况,并动态调整权值sh 源地址散列调度 (Source Hashing Scheduling)
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。dh 目的地址散列调度 (Destination Hashing Scheduling)
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
(2)动态
lc 最小连接调度 (Least-Connection Scheduling)
动态地将网络请求调度到已建立的连接数最少的服务器上
如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡wlc 加权最小连接调度 (Weighted Least-Connection Scheduling)
调度器可以自动问询真实服务器的负载情况,并动态调整权值
带权重的谁不干活就给谁分配,机器配置好的权重高sed 最短预期延时调度 (Shortest Expected Delay Scheduling)
不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙nq 不排队调度 (Never Queue Scheduling)
无需队列,如果有realserver的连接数为0就直接分配过去lblc 基于局部性的最少连接调度 (Locality-Based Least Connections Scheduling)
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器lblcr 带复制的基于局部性的最少连接调度 (Locality-Based Least Connections with Replication Scheduling)
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
2、三种IP负载均衡技术
(1)IPVS/NAT
IPVS/NAT模式的基本原理
用户请求LVS到达director,director将请求的报文的目的IP改为RIP,同时将报文的目标端口也改为realserver的相应端口,最后将报文发送到realserver上,realserver将数据返回给director,director再把数据发送给用户
IPVS/NAT模式优缺点
优点:
- 容易配置,容易理解,容易管理的工作模式
- 节省外网IP资源,LVS-NAT工作方式将系统架构封装在局域网中,只需要LVS有一个外网地址或外网地址映射就可实现访问
- 系统架构相对封闭,内网环境下防火墙的设置要求不会太高,容易进行物理服务器的运维
- LVS/NAT工作模式下的RS服务器可以是任何操作系统,只要支持TCP/IP协议即可
缺点:
- LVS-NAT中,负载均衡调度器作为转发点,当RS服务器数量变多时,调度器将会负载,转发点也是瓶颈点
(2)IPVS/DR
网络结构图
IPVS/DR模式的基本原理
LVS节点接收到请求报文后,会改写报文的数据链路层格式。将VIP MAC写成RIP的Mac,但是网络层和传输层报文不会改写,然后重新回发给交换机。这里就涉及一个问题,现在RIP和 IP的对应关系的错误的,这个数据报文到了交换机后,由于这种错位的关系,是不能进行三层交换的,只能进行二层交换(一旦进行IP交换,数据报文的验证就会出错,被丢弃)。所以LVS-DR方式要求Real Server和LVS节点必须在同一个局域网内,或者这样说更确切:LVS节点需要找到一个二层链路,将改写了Mac地址的报文发送给Real Server,而不能进行三层交换的校验。
简单来说就是CIP发送一个PV请求给VIP,VIP收到这个请求后会跟LVS设置的LB算法选择一个LB比较合理的realserver,然后将此请求的package的MAC地址修改为realserver的MAC地址;VIP会把这个包广播到当前这个LAN里面,所以,要提前保证VIP和所有的realserver在同一个网段
IPVS/DR 模式的优缺点
优点
- 解决了LVS-NAT工作模式中的转发瓶颈问题,能够支撑规模更大的负载均衡场
- 比较耗费网外IP资源,机房的外网IP资源都是有限的,如果在正式生产环境中确实存在这个问题,可以采用LVS-NAT和LVS-DR混合使用的方式来缓解
缺点
- 配置工作较LVS-NAT方式稍微麻烦一点,您至少需要了解LVS-DR模式的基本工作方式才能更好的指导自己进行LVS-DR模式的配置和运行过程中问题的解决
- 由于LVS-DR模式的报文改写规则,导致LVS节点和Real Server节点必须在一个网段,因为二层交换是没法跨子网的。但是这个问题针对大多数系统架构方案来说,实际上并没有本质限制
(3)IPVS/TUN
LVS TUN原理详解图
LVS TUN原理:用户请求LVS到达director,director通过IP-TUN加密技术将请求报文的包封装到一个新的IP包里面,目的IP为VIP(不变),然后director将报文发送到realserver,realserver基于IP-TUN解密,然后解析出来包的目的为VIP,检测网卡是否绑定了VIP,绑定了就处理这个包,如果在同一个网段,将请求直接返回给用户,否则通过网关返回给用户;如果没有绑定VIP就直接丢掉这个包。
- 负载均衡器只负责将请求包分发给物理服务器,而物理服务器将应答包直接发给用户。所以,负载均衡器能处理很巨大的请求量,这种方式,一台负载均衡能为超过100台的物理服务器服务,负载均衡器不再是系统的瓶颈。使用VS-TUN方式,如果你的负载均衡器拥有100M的全双工网卡的话,就能使得整个Virtual Server能达到1G的吞吐量。
缺点
- 这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议;
(4) LVS/FULLNAT模式
centos 7 搭建 keepalived + lvs/DR 集群
LVS负责多台WEB端的负载均衡(LB);Keepalived负责LVS的高可用(HA)使用Keepalived为LVS调度器提供高可用功能,防止调度器单点故障,为用户提供Web服务:
LVS1调度器真实IP地址为192.168.37.52(MASTER)
LVS2调度器真实IP地址为192.168.37.53(BACKUP)
服务器VIP地址设置为192.168.37.60
真实Web服务器地址分别为192.168.37.51、192.168.37.52
实验拓扑图:
实验步骤:
实验准备:
配置yum源(自行解决或使用系统自带)
全局设置:
# systemctl stop firewalld.service //关闭防火墙
# systemctl disable firewalld.service //关闭开机自启
# firewall-cmd --state //查看
# setenforce 0 //设置SELinux 为宽松模式
- 安装软件
1.在两台Web主机上安装http 或(NGINX)这里我用http,配置WEB服务器 pc51 / pc52
#yum -y install httpd
#systemctl start httpd
#systemctl enable httpd
[root@web1 ~] #echo " 192.168.37.51 " > /var/www/html/index.html
[root@web2 ~] #echo " 192.168.37.52 " > /var/www/html/index.html
#cat lvs-web.sh
脚本内容
vip=192.168.37.60
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
ifconfig $dev $vip netmask $mask #broadcast $vip up
#route add -host $vip dev $dev
echo "The RS Server is Ready!"
;;
stop)
ifconfig $dev down
echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "The RS Server is Canceled!"
;;
*)
echo "Usage: $(basename $0) start|stop"
exit 1
;;
esac
# bash lvs-web.sh start //执行脚本完成配置
2.在LVS-1和LVS-2两台主机上安装ipvsadm和keepalived
# yum install ipvsadm keepalived -y
3.Keepalived配置详解
[root@lvs1 ~]# vim /etc/keepalived/keepalived.conf // Master配置好的信息如下
! Configuration File for keepalived
notification_email { #邮件通知机制,当keepalived发生故障时,进行发邮件通知
root@localhost.com #可以将其修改也可以将其改为本机
}
notification_email_from root@localhost.com #邮件从哪里发出去
smtp_server 127.0.0.1 #本机的smtp服务器地址
smtp_connect_timeout 30 #smtp的连接超时时长
router_id n1 #虚拟路由的表示符一般写本机,确保每个节点都不相同
vrrp_skip_check_localhostadv_addr #跳过检查数据报文,默认会检查。
vrrp_strict #严格遵循vrrp协议,没有vip,单播地址,ipv6地址将无法启动
vrrp_iptables #不生成iptables规则
vrrp_mcast_group4 224.0.0.18 #组播,默认情况下向224.0.0.18发送组播消息
vrrp_garp_interval 0 #arp报文发送延迟
vrrp_gna_interval 0 #消息发送延迟
}
vrrp_instance VI_1 {
state MASTER ## LVS-1配置了为主,另外一台LVS-2配置为BACKUP
interface ens33 ## 注意匹配网卡名
virtual_router_id 51 ## 虚拟路由ID(0-255),在一个VRRP实例中主备服务器ID必须一样
priority 100 ## 优先级值设定:MASTER要比BACKUP的值大
advert_int 3 ## 通告时间间隔:单位秒,主备要一致
authentication { ##认证机制
auth_type PASS ## 默认PASS; 有两种:PASS或AH
auth_pass 1111 ## 默认1111; 可多位字符串,但仅前8位有效
}
virtual_ipaddress {
192.168.37.60 dev ens33 label ens33:0 //VIP地址
## 虚拟IP;可多个,写法为每行一个
}
}
virtual_server 192.168.37.60 80 {
delay_loop 3 ## 设置健康状态检查时间
lb_algo rr ## 调度算法,这里用了rr轮询算法,便于后面测试查看
lb_kind DR ## 这里测试用了Direct Route 模式,
# persistence_timeout 1 ## 持久连接超时时间,先注释掉,不然在单台上测试时,全部会被lvs调度到其中一台Real Server
protocol TCP
real_server 192.168.37.50 80 {
weight 1
TCP_CHECK {
connect_timeout 10 ##设置响应超时时间
nb_get_retry 3 ##设置超时重试次数
delay_before_retry 3 ##设置超时重试间隔时间
connect_port 80
}
}
real_server 192.168.37.51 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
[root@lvs2 ~]# vim /etc/keepalived/keepalived.conf //同样,修改BACKUP上的配置文件,如下
! Configuration File for keepalived
global_defs {
router_id LVS
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.37.60 dev ens33 label ens33:0
}
}
virtual_server 192.168.37.60 80 {
delay_loop 3
lb_algo rr
lb_kind DR
# persistence_timeout 1
protocol TCP
real_server 192.168.37.50 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.37.51 80 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
启动keepalived
# systemctl start keepalived
# systemctl enable keepalived
# ip a |grep ens33:0 //查看vip
#ipvsadm -Ln //服务器表
客户端测试
#curl 192.168.37.60 //或下面的方法
# while true ; do curl 1192.168.37.60; sleep 1;done //每秒执行一次curl 192.168.37.60
Centos7.5 编译安装mariadb10.2.25
安装环境
系统:CentOS 7.5
软件:MariaDB 10.2.25 官方下载地址 https://downloads.mariadb.org/interstitial/mariadb-10.2.25/source/mariadb-10.2.25.tar.gz/from/http%3A//mirrors.tuna.tsinghua.edu.cn/mariadb/
首先安装软件包和编译器:
[root@mybcc ~]# yum install bison bison-devel zlib-devel libcurl-devel
libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel
gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel -y
创建MariaDB安装目录、数据库存放目录、建立用户和目录
先创建一个名为mysql且没有登录权限的用户和一个名为mysql的用户组,然后安装mysql所需的依赖库和依赖包,最后通过cmake进行安装的详细配置。
创建mysql用户组和数据库相关目录
提前预定MariaDB
的安装目录为/app/mysql
并且数据目录为/data/mysql
,赋予mysql
用户权限
[root@mybcc ~]# mkdir /data/mysql -p
[root@mybcc ~]# useradd -r -s /sbin/nologin -d /data/mysql/ mysql
[root@mybcc ~]# chown mysql.mysql /data/mysql
删除CentOS 默认数据库配置文件
[root@mybcc ~]# find -H /etc/ | grep my.c
/etc/my.cnf.d
/etc/my.cnf.d/mysql-clients.cnf
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/certs/renew-dummy-cert
/etc/my.cnf
[root@mybcc ~]# rm -rf /etc/my.cnf /etc/my.cnf.d/
[root@mybcc ~]# find -H /etc/ | grep my.c
/etc/pki/tls/certs/make-dummy-cert
/etc/pki/tls/certs/renew-dummy-cert
卸载系统自带mariadb-libs(查询若无略过)
[root@mybcc ~]# rpm -qa|grep mariadb*
mariadb-libs-5.5.60-1.el7_5.x86_64
[root@mybcc ~]# rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps
下载解压源码包(软件自行下载wget下载过慢)
解压
[root@mybcc ~]# tar xvf mariadb-10.2.25.tar.gz
cmake 编译安装(开始已安装)
cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译
编译安装
[root@mybcc ~]# cd mariadb-10.2.25/
[root@mybcc mariadb-10.2.25]# cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/ \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
提示:如果出错,执行rm -f CMakeCache.txt
[root@mybcc ~]# make && make install
注释版(拷贝来的以便自己理解,只为安装自觉略过)
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ [MySQL安装的根目录]
-DDEFAULT_CHARSET=utf8 \ [设置默认字符集为utf8]
-DDEFAULT_COLLATION=utf8_general_ci \ [设置默认字符校对]
-DENABLED_LOCAL_INFILE=1 \ [启用加载本地数据]
-DENABLE_DOWNLOADS=1 \ [编译时允许自主下载相关文件]
-DEXTRA_CHARSETS=all \ [使MySQL支持所有的扩展字符]
-DSYSCONFDIR=/etc \ [MySQL配置文件所在目录]
-DWITHOUT_TOKUDB=1 \
-DWITH_ARCHIVE_STPRAGE_ENGINE=1 \ [MySQL的数据库引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
-DWITH_DEBUG=0 \ [禁用调试模式]
-DWITH_MEMORY_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
-DWITH_MYISAM_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
-DWITH_PARTITION_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
-DWITH_READLINE=1 \ [MySQL的readline library]
-DWITH_SSL=system \ [通讯时支持ssl协议]
-DWITH_ZLIB=system \ [允许使用zlib library]
-DWITH_LOBWRAP=0 \
-DMYSQL_DATADIR=/data/mysql \ [MySQL数据库文件存放目录]
-DMYSQL_USER=mysql \ [MySQL用户名]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \ [MySQL的通讯目录]
-DMYSQL_TCP_PORT=3306 \ [MySQL的监听端口]
-DMYSQL_MAINTAINER_MODE=0
准备环境变量
[root@mybc cprofile.d]# echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
[root@mybc cprofile.d]# . /etc/profile.d/mysql.sh
生成数据库文件(使用用户执行脚本, 安装数据库到数据库存放目录)
[root@mybc ~]#cd /app/mysql/
[root@mybc mysql]#scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
准备配置文件(>拷贝mariadb安装目录下 support-files目录下的文件wsrep.cnf到/etc目录并重命名为my.cnf)
[root@mybc ~]#cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf
准备启动脚本
[root@mybc ~]#cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
启动服务
[root@mybc ~]#chkconfig --add mysqld ;service mysqld start
初始化MariaDB
[root@mybc ~]# ./bin/mysql_secure_installation
以下提示:
Enter current password for root (enter for none): 输入当前root密码(没有输入)
Set root password? [Y/n] 设置root密码?(是/否)
New password: 输入新root密码
Re-enter new password: 确认输入root密码
Password updated successfully! 密码更新成功
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
默认情况下,MariaDB安装有一个匿名用户,
允许任何人登录MariaDB而他们无需创建用户帐户。
这个目的是只用于测试,安装去更平缓一些。
你应该进入前删除它们生产环境。
Remove anonymous users? [Y/n] 删除匿名用户?(是/否)
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
通常情况下,root只应允许从localhost连接。
这确保其他用户无法从网络猜测root密码。
Disallow root login remotely? [Y/n] 不允许root登录远程?(是/否)
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
默认情况下,MariaDB提供了一个名为“测试”的数据库,任何人都可以访问。
这也只用于测试,在进入生产环境之前应该被删除。
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
重新加载权限表将确保所有到目前为止所做的更改将立即生效。
Reload privilege tables now? [Y/n] 现在重新加载权限表(是/否)
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
全部完成!如果你已经完成了以上步骤,MariaDB安装现在应该安全。
Thanks for using MariaDB!
启动MariaDB
服务
[root@mybc ~]# systemctl restart mysqld
查看MariaDB
服务状态(开启状态)
[root@mybc ~]# systemctl status mysqld
● mysqld.service - LSB: start and stop MariaDB
Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
Active: active (exited) since Sat 2019-08-10 21:24:46 CST; 7s ago
Docs: man:systemd-sysv-generator(8)
Process: 7702 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)
Aug 10 21:24:46 mybcc systemd[1]: Starting LSB: start and stop MariaDB...
Aug 10 21:24:46 mybcc mysqld[7702]: Starting MariaDB[ OK ]
Aug 10 21:24:46 mybcc systemd[1]: Started LSB: start and stop MariaDB.
Aug 10 21:24:46 mybcc mysqld[7702]: 190810 21:24:46 mysqld_safe Logging to '/da...'.
Aug 10 21:24:46 mybcc mysqld[7702]: 190810 21:24:46 mysqld_safe A mysqld proces...ts
Hint: Some lines were ellipsized, use -l to show in full.
Centos7 php编译安装
准备工作
本机案例系统信息:centos7.5
安装路径:/usr/local/php
安装PHP
安装依赖(可自己定制)
[root@mybcc ~]# yum -y install libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libcurl libcurl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel gmp gmp-devel libmcrypt libmcrypt-devel readline readline-devel libxslt libxslt-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel ncurses curl gdbm-devel db4-devel libXpm-devel libX11-devel gd-devel gmp-devel expat-devel xmlrpc-c xmlrpc-c-devel libicu-devel libmcrypt-devel libmemcached-de
下载安装包并解压
[root@mybcc ~]# https://www.php.net/distributions/php-7.3.8.tar.gz
[root@mybcc ~]# tar xf php-7.3.8.tar.gz
[root@mybcc ~]# cd php-7.3.8/
编译安装(./configure —help可查看编译参数)
[root@mybcc ~]# ./configure \
--prefix=/usr/local/php\
--enable-fpm\
--with-fpm-user=www\
--with-fpm-group=www\
--with-config-file-path=/usr/local/php/conf\
--disable-rpath\
--enable-soap\
--with-libxml-dir\
--with-xmlrpc\
--with-openssl\
--with-mhash\
--with-pcre-regex\
--with-zlib\
--enable-bcmath\
--with-bz2\
--enable-calendar\
--with-curl\
--enable-exif\
--with-pcre-dir\
--enable-ftp\
--with-gd\
--with-openssl-dir\
--with-jpeg-dir\
--with-png-dir\
--with-zlib-dir\
--with-freetype-dir\
--enable-gd-jis-conv\
--with-gettext\
--with-gmp\
--with-mhash\
--enable-mbstring\
--with-onig\
--with-mysqli=mysqlnd\
--with-pdo-mysql=mysqlnd\
--with-zlib-dir\
--with-readline\
--enable-shmop\
--enable-sockets\
--enable-sysvmsg\
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx\
--with-libxml-dir\
--with-xsl\
--enable-zip\
--with-pear
注意:如果在配置时报libzip版本太低,请卸载重新安装高版本(以下安装仅做参考,可自行编译)
[root@mybcc ~]# yum install http://rpms.remirepo.net/enterprise/7/remi/x86_64//libzip5-1.5.2-1.el7.remi.x86_64.rpm -y
[root@mybcc ~]# yum install http://rpms.remirepo.net/enterprise/7/remi/x86_64//libzip5-devel-1.5.2-1.el7.remi.x86_64.rpm -y
完成后,再进行编译及安装(重新./configure)
执行
[root@mybcc ~]# make && make install
即可完成安装
安装后配置
完安装后php就已经安装在到了/usr/local/php目录下了,可查看安装是否成功
[root@mybcc ~]# /usr/local/php/bin/php -v
编辑 /etc/profile 添加环境变量 ,添加到最后面
[root@mybcc ~]# PATH=$PATH:/usr/local/php/bin
[root@mybcc ~]#export PATH
然后更新环境变量。
[root@mybcc ~]# source /etc/profile
查看环境变量
[root@mybcc ~]# echo $PATH
查看php版本
[root@mybcc ~]# php -v
配置php-fpm
[root@mybcc php-7.3.8]#cp php.ini-production /usr/local/php/conf/php.ini
[root@mybcc php-7.3.8]#cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
[root@mybccphp-7.3.8]#cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
将php-fpm加入启动服务
[root@mybcc ~]# cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm.service
启动php-fpm
[root@mybcc ~]# systemctl start php-fpm.service
错误扩展
注意:如果编译时报:php7 configure: error: off_t undefined; check your library configuration错误,请执行以下操作:
# 添加搜索路径到配置文件
echo '/usr/local/lib64
/usr/local/lib
/usr/lib
/usr/lib64'>>/etc/ld.so.conf
# 更新配置
ldconfig -v
注意:如果编译时报:/usr/local/include/zip.h:59:21: fatal error: zipconf.h: No such file or directory 错误,请执行以下操作:
在安装完新版的 libzip 时可能会出现打不到 zipconf.h,手动复制一下
cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipc
启动时:如果报这种错误
Starting php-fpm [2-Feb-2019 21:02:25] ERROR: [pool www] cannot get uid for user 'www'
说明没有该用户,直接执行
groupadd www
useradd -g www www