一、环境准备

首先我们先介绍下环境和实验中所需要的包

环境:

我使用的是centos7.6的系统

建议关掉selinux和影响到80端口的防火墙策略

  1. selinux永久有效

修改 /etc/selinux/config 文件中的 SELINUX=”” 为 disabled ,然后重启。

  1. selinux即时生效

setenforce 0

关闭防火墙的方法为:

  1. 永久性生效

开启:chkconfig iptables on

关闭:chkconfig iptables off

  1. 即时生效,重启后失效

开启: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 nginx和wordpress博客 - 图1uri&nginx和wordpress博客 - 图2 {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME nginx和wordpress博客 - 图3fastcgi_script_name;
include fastcgi_params;
fastcgi_cache fcgicache;
fastcgi_cache_key nginx和wordpress博客 - 图4#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 nginx和wordpress博客 - 图5{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源或准备以下需要的软件

  1. # systemctl stop firewalld.service //关闭防火墙
  2. # systemctl disable firewalld.service //关闭开机自启
  3. # firewall-cmd --state //查看
  4. # setenforce 0 //设置SELinux 为宽松模式

web服务器 pc51 / pc52 :

  1. # yum -y install httpd
  2. [root@pc51 ~]# echo '192.168.37.51' > /var/www/html/test.html
  3. [root@pc52 ~]# echo "192.168.37.52" > /var/www/html/test.html
  4. # systemctl start httpd
  5. # systemctl enable httpd
  6. # yum -y install elinks
  7. [root@pc51 ~]# elinks --dump http://localhost/test.html
  8. 192.168.37.51
  9. [root@pc52 ~]# elinks --dump http://localhost/test.html
  10. 192.168.37.52

配置分发器 pc50:

  1. #yum -y install ipvsadm
  2. //开启内核的路由转发功能
  3. # echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
  4. # sysctl -p
  5. net.ipv4.ip_forward = 1

网站服务器 pc51 / pc52 :

指定网关地址 192.168.37.50

  1. # route -n//查看路由
  2. # route add default gw 192.168.37.50//临时配置网关 网卡重启后生效
  3. //永久配置网关
  4. # vim /etc/sysconfig/network-scripts/ifcfg-ens33
  5. 最后加:GATEWAY=192.168.37.50
  6. # systemctl restart network //重新加载网卡

客户端 172.16.131.247 配置

指定网关地址 172.16.131.244 :

  1. # vim /etc/sysconfig/network-scripts/ifcfg-ens33
  2. 最后加:GATEWAY=172.16.131.244
  3. # systemctl restart network
  4. # ping -c 2 192.168.37.51 //测试
  5. PING 192.168.37.51 (192.168.37.51) 56(84) bytes of data.
  6. 64 bytes from 192.168.37.51: icmp_seq=1 ttl=63 time=0.322 ms
  7. 64 bytes from 192.168.37.51: icmp_seq=2 ttl=63 time=0.503 ms
  8. --- 192.168.37.51 ping statistics ---
  9. 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
  10. rtt min/avg/max/mdev = 0.322/0.412/0.503/0.092 ms
  11. # yum -y install elinks

配置分发器 pc50 :

  1. # yum -y install ipvsadm
  2. # rpm -q ipvsadm
  3. ipvsadm-1.27-7.el7.x86_64

添加虚拟服务

  1. # ipvsadm -L //查看 IPVS
  2. IP Virtual Server version 1.2.1 (size=4096)
  3. Prot LocalAddress:Port Scheduler Flags
  4. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  5. # ipvsadm -A -t 172.16.131.244:80 -s rr//添加虚拟服务 调度算法为Round Robin
  6. # ipvsadm -Ln //- n 数字显示
  7. IP Virtual Server version 1.2.1 (size=4096)
  8. Prot LocalAddress:Port Scheduler Flags
  9. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  10. TCP 172.16.131.244:80 rr
  11. //向虚拟服务器中加入节点
  12. # ipvsadm -a -t 172.16.131.244:80 -r 192.168.37.51:80 -m
  13. # ipvsadm -a -t 172.16.131.244:80 -r 192.168.37.52:80 -m
  14. # ipvsadm -Ln
  15. IP Virtual Server version 1.2.1 (size=4096)
  16. Prot LocalAddress:Port Scheduler Flags
  17. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  18. TCP 172.16.131.244:80 rr
  19. -> 192.168.37.51:80 Masq 1 0 0
  20. -> 192.168.37.52:80 Masq 1 0 0

客户端测试

  1. # elinks --dump http://172.16.131.244/test.html
  2. 192.168.37.51
  3. # elinks --dump http://172.16.131.244/test.html
  4. 192.168.37.52
  5. //客户端 轮询到不同的后端真实服务器
  6. Director Server 查看:
  7. [root@pc50 ~]# ipvsadm -Ln --stats
  8. IP Virtual Server version 1.2.1 (size=4096)
  9. Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
  10. -> RemoteAddress:Port
  11. TCP 172.16.131.244:80 2 10 10 846 1098
  12. -> 192.168.37.51:80 1 5 5 423 549
  13. -> 192.168.37.52:80 1 5 5 423 549
  14. 模拟pc51 web服务故障:
  15. [root@pc51 ~]# systemctl stop httpd
  16. [root@pc50 ~]# ipvsadm -Z
  17. //客户端测试
  18. # elinks --dump http://172.16.131.244/test.html
  19. 192.168.4.52
  20. # elinks --dump http://172.16.131.244/test.html
  21. 192.168.4.52
  22. [root@pc50 ~]# ipvsadm -Ln --stats
  23. IP Virtual Server version 1.2.1 (size=4096)
  24. Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
  25. -> RemoteAddress:Port
  26. TCP 172.16.131.244:80 3 11 11 906 1138
  27. -> 192.168.4.51:80 1 1 1 60 40
  28. -> 192.168.4.52:80 2 10 10 846 1098

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的体系架构如图

nginx和wordpress博客 - 图6

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

nginx和wordpress博客 - 图7

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

网络结构图

nginx和wordpress博客 - 图8

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原理详解图

nginx和wordpress博客 - 图9

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模式

nginx和wordpress博客 - 图10

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源(自行解决或使用系统自带)

全局设置:

  1. # systemctl stop firewalld.service //关闭防火墙
  2. # systemctl disable firewalld.service //关闭开机自启
  3. # firewall-cmd --state //查看
  4. # setenforce 0 //设置SELinux 为宽松模式
  1. 安装软件

1.在两台Web主机上安装http 或(NGINX)这里我用http,配置WEB服务器 pc51 / pc52

  1. #yum -y install httpd
  2. #systemctl start httpd
  3. #systemctl enable httpd
  4. [root@web1 ~] #echo " 192.168.37.51 " > /var/www/html/index.html
  5. [root@web2 ~] #echo " 192.168.37.52 " > /var/www/html/index.html
  6. #cat lvs-web.sh
  7. 脚本内容
  8. vip=192.168.37.60
  9. mask='255.255.255.255'
  10. dev=lo:1
  11. case $1 in
  12. start)
  13. echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
  14. echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  15. echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
  16. echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
  17. ifconfig $dev $vip netmask $mask #broadcast $vip up
  18. #route add -host $vip dev $dev
  19. echo "The RS Server is Ready!"
  20. ;;
  21. stop)
  22. ifconfig $dev down
  23. echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
  24. echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
  25. echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
  26. echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
  27. echo "The RS Server is Canceled!"
  28. ;;
  29. *)
  30. echo "Usage: $(basename $0) start|stop"
  31. exit 1
  32. ;;
  33. esac
  34. # bash lvs-web.sh start //执行脚本完成配置

2.在LVS-1和LVS-2两台主机上安装ipvsadm和keepalived

  1. # yum install ipvsadm keepalived -y

3.Keepalived配置详解

  1. [root@lvs1 ~]# vim /etc/keepalived/keepalived.conf    // Master配置好的信息如下 
  2. ! Configuration File for keepalived
  3. notification_email { #邮件通知机制,当keepalived发生故障时,进行发邮件通知
  4. root@localhost.com #可以将其修改也可以将其改为本机
  5. }
  6. notification_email_from root@localhost.com #邮件从哪里发出去
  7. smtp_server 127.0.0.1 #本机的smtp服务器地址
  8. smtp_connect_timeout 30 #smtp的连接超时时长
  9. router_id n1 #虚拟路由的表示符一般写本机,确保每个节点都不相同
  10. vrrp_skip_check_localhostadv_addr #跳过检查数据报文,默认会检查。
  11. vrrp_strict #严格遵循vrrp协议,没有vip,单播地址,ipv6地址将无法启动
  12. vrrp_iptables #不生成iptables规则
  13. vrrp_mcast_group4 224.0.0.18 #组播,默认情况下向224.0.0.18发送组播消息
  14. vrrp_garp_interval 0 #arp报文发送延迟
  15. vrrp_gna_interval 0 #消息发送延迟
  16. }
  17. vrrp_instance VI_1 {      
  18. state MASTER        ## LVS-1配置了为主,另外一台LVS-2配置为BACKUP
  19. interface ens33       ## 注意匹配网卡名
  20. virtual_router_id 51    ## 虚拟路由ID(0-255),在一个VRRP实例中主备服务器ID必须一样
  21. priority 100        ## 优先级值设定:MASTER要比BACKUP的值大
  22. advert_int 3        ## 通告时间间隔:单位秒,主备要一致
  23. authentication {      ##认证机制
  24. auth_type PASS     ## 默认PASS; 有两种:PASS或AH 
  25. auth_pass 1111     ## 默认1111; 可多位字符串,但仅前8位有效
  26. }
  27. virtual_ipaddress {
  28. 192.168.37.60 dev ens33 label ens33:0     //VIP地址
  29. ## 虚拟IP;可多个,写法为每行一个
  30. }
  31. }
  32. virtual_server 192.168.37.60 80 {
  33. delay_loop 3       ## 设置健康状态检查时间
  34. lb_algo rr        ## 调度算法,这里用了rr轮询算法,便于后面测试查看
  35. lb_kind DR        ## 这里测试用了Direct Route 模式,
  36. # persistence_timeout 1  ## 持久连接超时时间,先注释掉,不然在单台上测试时,全部会被lvs调度到其中一台Real Server
  37. protocol TCP
  38. real_server 192.168.37.50 80 {
  39. weight 1
  40. TCP_CHECK {
  41. connect_timeout 10    ##设置响应超时时间
  42. nb_get_retry 3       ##设置超时重试次数
  43. delay_before_retry 3   ##设置超时重试间隔时间
  44. connect_port 80
  45. }
  46. }
  47. real_server 192.168.37.51 80 {
  48. weight 1
  49. TCP_CHECK {
  50. connect_timeout 10
  51. nb_get_retry 3
  52. delay_before_retry 3
  53. connect_port 80
  54. }
  55. }
  56. }
  1. [root@lvs2 ~]# vim /etc/keepalived/keepalived.conf     //同样,修改BACKUP上的配置文件,如下
  2. ! Configuration File for keepalived
  3. global_defs {
  4. router_id LVS
  5. }
  6. vrrp_instance VI_1 {
  7. state BACKUP
  8. interface ens33
  9. virtual_router_id 51
  10. priority 80
  11. advert_int 3
  12. authentication {
  13. auth_type PASS
  14. auth_pass 1111
  15. }
  16. virtual_ipaddress {
  17. 192.168.37.60 dev ens33 label ens33:0
  18. }
  19. }
  20. virtual_server 192.168.37.60 80 {
  21. delay_loop 3
  22. lb_algo rr
  23. lb_kind DR
  24. # persistence_timeout 1
  25. protocol TCP
  26. real_server 192.168.37.50 80 {
  27. weight 1
  28. TCP_CHECK {
  29. connect_timeout 10
  30. nb_get_retry 3
  31. delay_before_retry 3
  32. connect_port 80
  33. }
  34. }
  35. real_server 192.168.37.51 80 {
  36. weight 1
  37. TCP_CHECK {
  38. connect_timeout 10
  39. nb_get_retry 3
  40. delay_before_retry 3
  41. connect_port 80
  42. }
  43. }
  44. }

启动keepalived

  1. # systemctl start keepalived
  2. # systemctl enable keepalived
  3. # ip a |grep ens33:0 //查看vip
  4. #ipvsadm -Ln //服务器表

客户端测试

  1. #curl 192.168.37.60 //或下面的方法
  2. # 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/
首先安装软件包和编译器:

  1. [root@mybcc ~]# yum install bison bison-devel zlib-devel libcurl-devel
  2. libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel
  3. gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel -y

创建MariaDB安装目录、数据库存放目录、建立用户和目录
先创建一个名为mysql且没有登录权限的用户和一个名为mysql的用户组,然后安装mysql所需的依赖库和依赖包,最后通过cmake进行安装的详细配置。

创建mysql用户组和数据库相关目录

提前预定MariaDB的安装目录为/app/mysql并且数据目录为/data/mysql,赋予mysql用户权限

  1. [root@mybcc ~]# mkdir /data/mysql -p
  2. [root@mybcc ~]# useradd -r -s /sbin/nologin -d /data/mysql/ mysql
  3. [root@mybcc ~]# chown mysql.mysql /data/mysql

删除CentOS 默认数据库配置文件

  1. [root@mybcc ~]# find -H /etc/ | grep my.c
  2. /etc/my.cnf.d
  3. /etc/my.cnf.d/mysql-clients.cnf
  4. /etc/pki/tls/certs/make-dummy-cert
  5. /etc/pki/tls/certs/renew-dummy-cert
  6. /etc/my.cnf
  7. [root@mybcc ~]# rm -rf /etc/my.cnf /etc/my.cnf.d/
  8. [root@mybcc ~]# find -H /etc/ | grep my.c
  9. /etc/pki/tls/certs/make-dummy-cert
  10. /etc/pki/tls/certs/renew-dummy-cert

卸载系统自带mariadb-libs(查询若无略过)

  1. [root@mybcc ~]# rpm -qa|grep mariadb*
  2. mariadb-libs-5.5.60-1.el7_5.x86_64
  3. [root@mybcc ~]# rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64 --nodeps

下载解压源码包(软件自行下载wget下载过慢)

解压

  1. [root@mybcc ~]# tar xvf mariadb-10.2.25.tar.gz

cmake 编译安装(开始已安装)
cmake的重要特性之一是其独立于源码(out-of-source)的编译功能,即编译工作可以在另一个指定的目录中而非源码目录中进行,这可以保证源码目录不受任何一次编译的影响,因此在同一个源码树上可以进行多次不同的编译,如针对于不同平台编译

编译安装

  1. [root@mybcc ~]# cd mariadb-10.2.25/
  2. [root@mybcc mariadb-10.2.25]# cmake . \
  3. -DCMAKE_INSTALL_PREFIX=/app/mysql \
  4. -DMYSQL_DATADIR=/data/mysql/ \
  5. -DSYSCONFDIR=/etc/ \
  6. -DMYSQL_USER=mysql \
  7. -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  8. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
  9. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  10. -DWITH_PARTITION_STORAGE_ENGINE=1 \
  11. -DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
  12. -DWITH_DEBUG=0 \
  13. -DWITH_READLINE=1 \
  14. -DWITH_SSL=system \
  15. -DWITH_ZLIB=system \
  16. -DWITH_LIBWRAP=0 \
  17. -DENABLED_LOCAL_INFILE=1 \
  18. -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
  19. -DDEFAULT_CHARSET=utf8 \
  20. -DDEFAULT_COLLATION=utf8_general_ci
  21. 提示:如果出错,执行rm -f CMakeCache.txt
  22. [root@mybcc ~]# make && make install

注释版(拷贝来的以便自己理解,只为安装自觉略过)

  1. cmake . \
  2. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ [MySQL安装的根目录]
  3. -DDEFAULT_CHARSET=utf8 \ [设置默认字符集为utf8]
  4. -DDEFAULT_COLLATION=utf8_general_ci \ [设置默认字符校对]
  5. -DENABLED_LOCAL_INFILE=1 \ [启用加载本地数据]
  6. -DENABLE_DOWNLOADS=1 \ [编译时允许自主下载相关文件]
  7. -DEXTRA_CHARSETS=all \ [使MySQL支持所有的扩展字符]
  8. -DSYSCONFDIR=/etc \ [MySQL配置文件所在目录]
  9. -DWITHOUT_TOKUDB=1 \
  10. -DWITH_ARCHIVE_STPRAGE_ENGINE=1 \ [MySQL的数据库引擎]
  11. -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
  12. -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
  13. -DWITH_DEBUG=0 \ [禁用调试模式]
  14. -DWITH_MEMORY_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
  15. -DWITH_MYISAM_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
  16. -DWITH_INNOBASE_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
  17. -DWITH_PARTITION_STORAGE_ENGINE=1 \ [MySQL的数据库引擎]
  18. -DWITH_READLINE=1 \ [MySQLreadline library]
  19. -DWITH_SSL=system \ [通讯时支持ssl协议]
  20. -DWITH_ZLIB=system \ [允许使用zlib library]
  21. -DWITH_LOBWRAP=0 \
  22. -DMYSQL_DATADIR=/data/mysql \ [MySQL数据库文件存放目录]
  23. -DMYSQL_USER=mysql \ [MySQL用户名]
  24. -DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \ [MySQL的通讯目录]
  25. -DMYSQL_TCP_PORT=3306 \ [MySQL的监听端口]
  26. -DMYSQL_MAINTAINER_MODE=0

准备环境变量

  1. [root@mybc cprofile.d]# echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
  2. [root@mybc cprofile.d]# . /etc/profile.d/mysql.sh

生成数据库文件(使用用户执行脚本, 安装数据库到数据库存放目录)

  1. [root@mybc ~]#cd /app/mysql/
  2. [root@mybc mysql]#scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql

准备配置文件(>拷贝mariadb安装目录下 support-files目录下的文件wsrep.cnf到/etc目录并重命名为my.cnf)

  1. [root@mybc ~]#cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf

准备启动脚本

  1. [root@mybc ~]#cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld

启动服务

  1. [root@mybc ~]#chkconfig --add mysqld ;service mysqld start

初始化MariaDB

  1. [root@mybc ~]# ./bin/mysql_secure_installation

以下提示:

  1. Enter current password for root (enter for none): 输入当前root密码(没有输入)
  2. Set root password? [Y/n] 设置root密码?(是/否)
  3. New password: 输入新root密码
  4. Re-enter new password: 确认输入root密码
  5. Password updated successfully! 密码更新成功
  6. By default, a MariaDB installation has an anonymous user, allowing anyone
  7. to log into MariaDB without having to have a user account created for
  8. them. This is intended only for testing, and to make the installation
  9. go a bit smoother. You should remove them before moving into a
  10. production environment.
  11. 默认情况下,MariaDB安装有一个匿名用户,
  12. 允许任何人登录MariaDB而他们无需创建用户帐户。
  13. 这个目的是只用于测试,安装去更平缓一些。
  14. 你应该进入前删除它们生产环境。
  15. Remove anonymous users? [Y/n] 删除匿名用户?(是/否)
  16. Normally, root should only be allowed to connect from 'localhost'. This
  17. ensures that someone cannot guess at the root password from the network.
  18. 通常情况下,root只应允许从localhost连接。
  19. 这确保其他用户无法从网络猜测root密码。
  20. Disallow root login remotely? [Y/n] 不允许root登录远程?(是/否)
  21. By default, MariaDB comes with a database named 'test' that anyone can
  22. access. This is also intended only for testing, and should be removed
  23. before moving into a production environment.
  24. 默认情况下,MariaDB提供了一个名为“测试”的数据库,任何人都可以访问。
  25. 这也只用于测试,在进入生产环境之前应该被删除。
  26. Reloading the privilege tables will ensure that all changes made so far
  27. will take effect immediately.
  28. 重新加载权限表将确保所有到目前为止所做的更改将立即生效。
  29. Reload privilege tables now? [Y/n] 现在重新加载权限表(是/否)
  30. All done! If you've completed all of the above steps, your MariaDB
  31. installation should now be secure.
  32. 全部完成!如果你已经完成了以上步骤,MariaDB安装现在应该安全。
  33. Thanks for using MariaDB!

启动MariaDB服务

  1. [root@mybc ~]# systemctl restart mysqld

查看MariaDB服务状态(开启状态)

  1. [root@mybc ~]# systemctl status mysqld
  2. mysqld.service - LSB: start and stop MariaDB
  3. Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
  4. Active: active (exited) since Sat 2019-08-10 21:24:46 CST; 7s ago
  5. Docs: man:systemd-sysv-generator(8)
  6. Process: 7702 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)
  7. Aug 10 21:24:46 mybcc systemd[1]: Starting LSB: start and stop MariaDB...
  8. Aug 10 21:24:46 mybcc mysqld[7702]: Starting MariaDB[ OK ]
  9. Aug 10 21:24:46 mybcc systemd[1]: Started LSB: start and stop MariaDB.
  10. Aug 10 21:24:46 mybcc mysqld[7702]: 190810 21:24:46 mysqld_safe Logging to '/da...'.
  11. Aug 10 21:24:46 mybcc mysqld[7702]: 190810 21:24:46 mysqld_safe A mysqld proces...ts
  12. Hint: Some lines were ellipsized, use -l to show in full.

Centos7 php编译安装

下载php

准备工作

本机案例系统信息:centos7.5

安装路径:/usr/local/php

安装PHP

安装依赖(可自己定制)

  1. [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

下载安装包并解压

  1. [root@mybcc ~]# https://www.php.net/distributions/php-7.3.8.tar.gz
  2. [root@mybcc ~]# tar xf php-7.3.8.tar.gz
  3. [root@mybcc ~]# cd php-7.3.8/

编译安装(./configure —help可查看编译参数)

  1. [root@mybcc ~]# ./configure \
  2. --prefix=/usr/local/php\
  3. --enable-fpm\
  4. --with-fpm-user=www\
  5. --with-fpm-group=www\
  6. --with-config-file-path=/usr/local/php/conf\
  7. --disable-rpath\
  8. --enable-soap\
  9. --with-libxml-dir\
  10. --with-xmlrpc\
  11. --with-openssl\
  12. --with-mhash\
  13. --with-pcre-regex\
  14. --with-zlib\
  15. --enable-bcmath\
  16. --with-bz2\
  17. --enable-calendar\
  18. --with-curl\
  19. --enable-exif\
  20. --with-pcre-dir\
  21. --enable-ftp\
  22. --with-gd\
  23. --with-openssl-dir\
  24. --with-jpeg-dir\
  25. --with-png-dir\
  26. --with-zlib-dir\
  27. --with-freetype-dir\
  28. --enable-gd-jis-conv\
  29. --with-gettext\
  30. --with-gmp\
  31. --with-mhash\
  32. --enable-mbstring\
  33. --with-onig\
  34. --with-mysqli=mysqlnd\
  35. --with-pdo-mysql=mysqlnd\
  36. --with-zlib-dir\
  37. --with-readline\
  38. --enable-shmop\
  39. --enable-sockets\
  40. --enable-sysvmsg\
  41. --enable-sysvsem \
  42. --enable-sysvshm \
  43. --enable-wddx\
  44. --with-libxml-dir\
  45. --with-xsl\
  46. --enable-zip\
  47. --with-pear

注意:如果在配置时报libzip版本太低,请卸载重新安装高版本(以下安装仅做参考,可自行编译)

  1. [root@mybcc ~]# yum install http://rpms.remirepo.net/enterprise/7/remi/x86_64//libzip5-1.5.2-1.el7.remi.x86_64.rpm -y
  2. [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)

执行

  1. [root@mybcc ~]# make && make install

即可完成安装

安装后配置

完安装后php就已经安装在到了/usr/local/php目录下了,可查看安装是否成功

  1. [root@mybcc ~]# /usr/local/php/bin/php -v

编辑 /etc/profile 添加环境变量 ,添加到最后面

  1. [root@mybcc ~]# PATH=$PATH:/usr/local/php/bin
  2. [root@mybcc ~]#export PATH

然后更新环境变量。

  1. [root@mybcc ~]# source /etc/profile

查看环境变量

  1. [root@mybcc ~]# echo $PATH

查看php版本

  1. [root@mybcc ~]# php -v

配置php-fpm

  1. [root@mybcc php-7.3.8]#cp php.ini-production /usr/local/php/conf/php.ini
  2. [root@mybcc php-7.3.8]#cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
  3. [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加入启动服务

  1. [root@mybcc ~]# cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm.service

启动php-fpm

  1. [root@mybcc ~]# systemctl start php-fpm.service

错误扩展

注意:如果编译时报:php7 configure: error: off_t undefined; check your library configuration错误,请执行以下操作:

  1. # 添加搜索路径到配置文件
  2. echo '/usr/local/lib64
  3. /usr/local/lib
  4. /usr/lib
  5. /usr/lib64'>>/etc/ld.so.conf
  6. # 更新配置
  7. ldconfig -v

注意:如果编译时报:/usr/local/include/zip.h:59:21: fatal error: zipconf.h: No such file or directory 错误,请执行以下操作:

  1. 在安装完新版的 libzip 时可能会出现打不到 zipconf.h,手动复制一下
  2. cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipc

启动时:如果报这种错误

  1. Starting php-fpm [2-Feb-2019 21:02:25] ERROR: [pool www] cannot get uid for user 'www'

说明没有该用户,直接执行

  1. groupadd www
  2. useradd -g www www

参考文献