DIscuz
是由 PHP
语言开发的一款开源社交论坛项目。运行在典型的LNMP/LAMP
环境中。
安装MySQL数据库5.7
主机名 | IP地址 | 操作系统 | 硬件配置 |
---|---|---|---|
discuz-db | 192.168.226.128 | CentOS 7-mini-2009 | 2 Core/4G Memory |
修改主机名用来自己识别
hostnamectl set-hostname discuz-db
#重连远程更新或使用bash命令启动一个新的交互式的命令行界面
下载 MySQL
仓库
rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
导入 GPG
密钥文件
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
安装 MySQL
软件包
yum install mysql-server -y
启动 MySQL
程序
systemctl enable mysqld --now
查看 MySQL
的 root
初始密码
grep -i password /var/log/mysqld.log
通过初始密码登录到数据库
mysql -uroot -p'密码'
修改密码复杂度策略(即不验证复杂度)
mysql> SET GLOBAL validate_password_policy=LOW;
修改密码长度(用来短位数密码方便学习使用)
mysql> SET GLOBAL validate_password_length=4;
设置 root
本机登录密码(长度须满足8位)
mysql> alter user root@"localhost" identified by "1234";
退出数据库
mysql> exit
修改 /etc/my.cnf
文件,在文件中定义密码策略,让策略永久生效
vim /etc/my.cnf
#最后一行新增如下代码
validate_password_policy=0
#设置字符集支持中文
character-set-server=utf8
重启 MySQL
使配置生效
systemctl restart mysqld
登录数据库授权 root
账号可以远程登录,后边需要测试 PHP
与数据库的连接
mysql -uroot -p1234
#创建一个root用户用来远程访问用,这个root和登录本机登录数据库的root不是同一个哈,现在创建成功后数据库就有两个root用户拉。
mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'admin123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'admin123456';
mysql> FLUSH PRIVILEGES;
创建对应的 discuz
库
mysql> create database discuz;
退出数据库
mysql> exit
安装Nginx web服务
主机名 | IP地址 | 操作系统 | 硬件配置 |
---|---|---|---|
discuz01 | 192.168.226.129 | CentOS 7 | 2 Core/4G Memory |
discuz02 | 192.168.226.130 | CentOS 7 | 2 Core/4G Memory |
Nginx版本分为 Mainline
(开发版本)、Stable
(最新稳定版)和Legacy
(旧的稳定版)。
修改主机名(记得初始化脚本对虚拟机初始设置)
#对192.168.226.129操作
hostnamectl set-hostname discuz01
#对192.168.226.130操作
hostnamectl set-hostname discuz02
准备 Nginx
稳定版仓库,仓库地址:https://nginx.org/en/linux_packages.html#RHEL
提示:在 discuz01
和 discuz02
主机安装
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
安装 Nginx
软件包
yum install nginx-1.20.2 -y
Nginx常用相关文件
/etc/nginx/nginx.conf
#Nginx主配置文件
/usr/share/nginx/html
#Nginx网页目录
/var/log/nginx/error.log
#Nginx错误日志文件
/var/log/nginx/access.log
#Nginx访问日志文件
/etc/nginx/conf.d/
#虚拟web主机目录
安装PHP相关软件
php
#是php代码的解释器
php-fpm
#管理php进程接收请求
php-mysql
#与MySQL集成,连接MySQL数据库并进行增删改查
php-gd
#帮助php处理图片的扩展,如生成图片、裁剪图片、缩放图片等
提示:在 discuz01
和 discuz02
主机安装
yum install php php-fpm php-mysql php-gd -y
修改配置文件:/etc/php-fpm.d/www.conf
,指定PHP程序运行时的用户与组,并开启PHP状态页面用于监控服务状态。
vim /etc/php-fpm.d/www.conf
#...
#指定PHP程序运行时的用户和组为Nginx
#在第39行
user = nginx
#在第41行
group = nginx
#在第121行,取消 ;号注释,开启PHP状态页面,并改名为/php_status
pm.status_path = /php_status
修改配置文件指定php时区:/etc/php.ini
vim /etc/php.ini +878
#...
#在第878行取消注释,并修改PHP时区
date.timezone ="Asia/shanghai"
修改 Nginx
虚拟web主机配置文件,定义网站信息:/etc/nginx/conf.d/
#清空该路径默认文件
rm -rf /etc/nginx/conf.d/*
vim /etc/nginx/conf.d/discuz.conf
server {
listen 80;
server_name localhost;
#开启nginx状态页面
location = /status {
stub_status;
}
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
#配置nginx连接php
location ~ \.php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#开启php页面
location /php_status {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
}
启动 Nginx
与 PHP
systemctl start nginx php-fpm
systemctl enable nginx php-fpm
测试 Nginx
与 PHP
之间的连接
vim /usr/share/nginx/html/phpinfo.php
<?php
phpinfo();
?>
重启Nginx和PHP
systemctl restart nginx php-fpm
访问页面测试(你需要改成你的IP):访问正确页面则会显示php默认页面
http://192.168.226.129/phpinfo.php
http://192.168.226.130/phpinfo.php
测试 PHP
与 MySQL
之间的连接
vim /usr/share/nginx/html/mysql.php
#这里面的ip要修改成你配数据库的虚拟机的ip,root密码就是添加的一个root用户的admin123456的密码
#在数据库哪里新增创建拉一个root专门用来远程访问的,这里迷惑拉去看数据库那
<?php
$con=mysql_connect("192.168.226.128","root","admin123456");
if(!$con){
die("could not connect to the db:\n".mysql_error());
}
else{
echo "success";
}
mysql_close($con);
?>
访问页面测试:正确页面会显示 success
http://192.168.226.129/mysql.php
http://192.168.226.130/mysql.php
上线Discuz论坛项目
在 discuz01
主机切换到Nginx网页目录并删除自带的页面文件
cd /usr/share/nginx/html/
rm -rf *
自行将项目源码包上传
下载解压工具
yum -y install zip unzip
解压项目到网页目录
unzip Discuz_X3.3_SC_UTF8.zip
将 upload
下的页面文件移动到至当前 html
目录
mv upload/* .
修改项目文件权限,确保 Nginx
用户对所有项目文件具备完全权限
chown -R nginx.nginx .
访问Discuz:
http://192.168.226.129/
http://192.168.226.130/
两个ip都能看到如下页面就表示成功
如下页面安装只针对一台机器操作,这里我对discuz01操作安装。
将 discuz01
主机的 html
目录同步给 discuz02
主机(此时项目中已经包含了连接数据库的相关信息)
[root@discuz01 ~]# scp -r /usr/share/nginx/html 192.168.226.130:/usr/share/nginx/
在 discuz02
主机修改 html
目录下项目文件权限
[root@discuz02 ~]# cd /usr/share/nginx/html/
[root@discuz02 html]# chown -R nginx.nginx .
访问 discuz02
测试:http://192.168.226.130/
上面我只对discuz01安装拉这个项目,而discuz02没有安装,将主机discuz01的html目录拷贝到discuz02,现在主机discuz02
没有安装也可以访问到项目网页,这样就完成拉集群操作,同理,可以部署更多的服务主机用不同的主机都可以访问同一个网站。
Redis为论坛提供缓存
通过 Redis
缓存数据库将论坛数据存储在内存中,使其能够处理高并发的读写操作,每秒可以执行高达数十万次的读写操作,来提高论坛的性能。
在 discuz-db
主机安装Redis数据库
[root@discuz-db ~]# yum install redis -y
Redis
默认只允许本地访问,需要修改 Redis
配置文件允许远程访问
[root@discuz-db ~]# vim /etc/redis.conf +61
#查找 bind 127.0.0.1 这一行修改为0.0.0.0 监听所有接口。如下所示:
bind 0.0.0.0
启动 Redis
服务
[root@discuz-db ~]# systemctl start redis
[root@discuz-db ~]# systemctl enable redis
在 Discuz
中检查是否支持 Redis
默认不支持 Redis
缓存,Discuz
是 php
语言开发,如需通过 Redis
提供缓存,需要安装 php
连接 Redis
的扩展模块。
在 discuz01和discuz02
主机安装 php-pecl-redis
扩展模块
yum -y install php-pecl-redis
两台都重启 php-fpm
并检查是否支持 redis
systemctl restart php-fpm
php -m | grep redis
再次刷新Discuz页面检查是否支持Redis
但是现在 Discuz
与 Redis
之间还没有建立连接,接下来配置Discuz连接 Redis
。
在 discuz01
和discuz02
主机修改文件:/usr/share/nginx/html/config/config_global.php
vim /usr/share/nginx/html/config/config_global.php +19
#...
#指定Redis服务器地址
$_config['memory']['redis']['server'] = '192.168.226.128';
再次刷新页面可看到Discuz已经成功与Redis连接,并且已经利用Redis存储了数据。
Nginx为Discuz实现负载均衡
负载均衡通过分散流量到多台服务器,避免单一服务器负载过重,提高系统性能和响应速度
配置多个负载均衡节点,当其中一个节点发生故障,其他节点可以接管其工作,避免业务中断。
主机名 | IP地址 | 操作系统 | 硬件配置 |
---|---|---|---|
master-proxy | 192.168.226.131 | CentOS 7 | 2 Core/4G Memory |
backup-proxy | 192.168.226.132 | CentOS 7 | 2Core/4G Memory |
再准备两台虚拟机分别修改主机名修改主机名
#对192.168.226.131操作
hostnamectl set-hostname master-proxy
#对192.168.226.132操作
hostnamectl set-hostname backup-proxy
两台机器安装 Nginx
软件包
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
yum install nginx-1.20.2 -y
创建 Nginx
代理配置文件,实现代理功能
rm -rf /etc/nginx/conf.d/*
vim /etc/nginx/conf.d/proxy.conf
upstream web {
server 192.168.226.129:80; #这里你要修改成discuz01的IP 注意改成你的
server 192.168.226.130:80; #这里改成discuz02的IP
}
server {
listen 80;
server_name web.discuz.com;
#开启nginx状态页面
location = /status {
stub_status;
}
location / {
proxy_pass http://web;
}
location ~ .* {
proxy_pass http://web;
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;
}
}
两台代理主机都启动 Nginx
程序
systemctl start nginx
systemctl enable nginx
访问两台代理测试:
http://192.168.226.131/
http://192.168.226.132/
Keepalived为Nginx实现高可用
通过 keepalived
为 Nginx
代理实现高可用,当其中一个代理节点发生故障,keepalived
可以实现故障自动切换,避免业务中断。
在两台代理节点安装 keepalived
软件包
yum install keepalived -y
master-proxy 主机修改 keepalived
配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens33 #这里的ens33是我的网卡,你要注意你的网卡是什么,再修改
virtual_router_id 51
priority 101 #这里是优先级 和备用代理节点的优先级数字不能一样
advert_int 2
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.226.111/24 #这个虚拟IP自定义,但需要在同一个网段并没有占用的IP
}
track_script {
chk_nginx
}
}
backup-proxy 主机修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_nginx {
script "/etc/keepalived/check_nginx.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33 #这里的ens33是我的网卡,你要注意你的网卡是什么,再修改
virtual_router_id 51
priority 99 #这里是优先级 和主代理机的优先级数字不能一样
advert_int 2
authentication {
auth_type PASS
auth_pass abc123
}
virtual_ipaddress {
192.168.226.111/24 #这个虚拟IP自定义,但需要在同一个网段并没有占用的IP
}
track_script {
chk_nginx
}
}
keepalived的配置文件详解
#定义一个自定义脚本,名称为chk_nginx
vrrp_script chk_nginx {
#脚本所在的路径及名称
script "/etc/keepalived/check_nginx.sh"
#监控检查的时间间隔,单位秒
interval 5
#健康检查的次数,连续2次健康检查失败,服务器将被标记为不健康
fall 2
#连续健康检查成功的次数,有1次健康检查成功,服务器将被标记为健康
rise 1
}
#配置了一个名为VI_1的VRRP实例组
vrrp_instance VI_1 {
#该节点在VRRP组中的身份,Master节点负责处理请求并拥有虚拟IP地址
state MASTER
#实例绑定的网络接口,实例通过这个网络接口与其他VRRP节点通信,以及虚拟IP地址的绑定
interface ens32
#虚拟的路由ID,范围1到255之间的整数,用于在一个网络中区分不同的VRRP实例组,但是在同一个VRRP组中的节点,该ID要保持一致
virtual_router_id 51
#实例的优先级,范围1到254之间的整数,用于决定在同一个VRRP组中哪个节点将成为Master节点,数字越大优先级越>高
priority 101
#Master节点广播VRRP报文的时间间隔,用于通知其他Backup节点Master节点的存在和状态,在同一个VRRP组中,所有>节点的advert_int参数值必须相同
advert_int 2
#实例之间通信的身份验证机制
authentication {
#PASS为密码验证
auth_type PASS
#此密码必须为1到8个字符,在同一个VRRP组中,所有节点必须使用相同的密码,以确保正确的身份验证和通信
auth_pass abc123
}
#定义虚拟IP地址
virtual_ipaddress {
192.168.0.111/24
}
#引用自定义脚本,名称与上方vrrp_script中定义的名称保持一致
track_script {
chk_nginx
}
}
在两台主机的 /etc/keepalived/
目录准备 check_nginx.sh
脚本
vim /etc/keepalived/check_nginx.sh
#!/bin/bash
conut=`ps -C nginx | grep -v PID | wc -l`
if [ $conut -eq 0 ];then
systemctl stop keepalived
fi
为脚本添加执行权限
chmod +x /etc/keepalived/check_nginx.sh
两台主机启动 keepalived
服务
systemctl start keepalived
systemctl enable keepalived
在 master-proxy 主机查看 keepalived
虚拟IP地址
[root@master-proxy ~]# ip a
#...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#本机IP
inet 192.168.226.131/24 brd 192.168.226.255
#keepalived虚拟IP
inet 192.168.226.111/24 scope global secondary ens33
在 window
s 的 hosts
文件中配置本地解析:C:\Windows\System32\drivers\etc\hosts
注:建议用记事本的管理员身份运行去修改这个配置文件,普通身份可能会失败
192.168.226.111 web.discuz.com
访问域名测试:http://web.discuz.com/
测试备用代理,当主代理的Nginx挂掉,Keepalived会将使用备用代理
将master-proxy主机关闭nginx,观察备用代理的IP
#关闭nginx服务
systemctl stop nginx
#查看keepalived 正常是同时关闭拉
systemctl status keepalived
在备用代理backup-proxy查看IP
[root@master-proxy ~]# ip a
#...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#本机IP
inet 192.168.226.132/24 brd 192.168.226.255
#keepalived虚拟IP
inet 192.168.226.111/24 scope global secondary ens33 ~]# ip a
#可以看到虚拟IP现在成功切换到拉备用代理主机上拉
现在再切换回master-proxy主机开启nginx和keepalived并查看master-proxy的IP
systemctl start nginx keepalived
[root@master-proxy ~]# ip a
#...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#本机IP
inet 192.168.226.131/24 brd 192.168.226.255
#keepalived虚拟IP
inet 192.168.226.111/24 scope global secondary ens33
可以发现,当主代理nginx挂掉,就成功让keepalived也关闭,从而使虚拟IP成功切换到备用代理机上,当主代理机恢复nginx和keepalived服务后,主代理机又拿回拉虚拟IP,至此成功实现了高可用。
将master-proxy主机关闭nginx,观察备用代理的IP
#关闭nginx服务
systemctl stop nginx
#查看keepalived 正常是同时关闭拉
systemctl status keepalived
在备用代理backup-proxy查看IP
[root@master-proxy ~]# ip a
#...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#本机IP
inet 192.168.226.132/24 brd 192.168.226.255
#keepalived虚拟IP
inet 192.168.226.111/24 scope global secondary ens33 ~]# ip a
#可以看到虚拟IP现在成功切换到拉备用代理主机上拉
现在再切换回master-proxy主机开启nginx和keepalived并查看master-proxy的IP
systemctl start nginx keepalived
[root@master-proxy ~]# ip a
#...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
#本机IP
inet 192.168.226.131/24 brd 192.168.226.255
#keepalived虚拟IP
inet 192.168.226.111/24 scope global secondary ens33
可以发现,当主代理服务器发生故障后,Keepalived会自动把IP切换到备用代理服务器上,当主代理恢复服务后,又从新换回来,从而达到代理服务器的高可用效果。