集群架构 - LAMP动态网站架构

1. LAMP架构-基础架构

后续的所有开源系统部署,都基于该环境之上完成。

1.1 基础环境

1
2
3
4
5
6
7
# 关闭SELinux
[root@apache ~]# sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
[root@apache ~]# setenforce 0

# 停止并禁用防火墙
[root@apache ~]# systemctl stop firewalld
[root@apache ~]# systemctl disable firewalld

1.2 安装LAMP架构

检查并移除旧版PHP

1
2
# 检查当前安装的PHP版本,如版本过低,请先移除旧版
[root@http-server ~]# rpm -e $(yum list installed | grep php)

安装PHP 7.2

1
2
3
4
5
6
7
8
# 安装epel扩展源和remi三方源
[root@http-server ~]# yum install epel-release
[root@http-server ~]# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# 安装最新php72版本
[root@http-server ~]# yum install -y php72-php php72-php-gd php72-php-mysqlnd \
php72-php-pecl-mysql php72-php-pecl-mysql-xdevapi php72-php-opcache \
php72-php-pecl-memcache php72-php-pecl-memcached php72-php-pecl-redis php72-php-pecl-mcrypt

PHP模块说明:

  • php72-php: PHP核心
  • php72-php-gd: 图像处理库
  • php72-php-mysqlnd: MySQL原生驱动
  • php72-php-opcache: OPcache加速
  • php72-php-pecl-memcache: Memcache扩展
  • php72-php-pecl-redis: Redis扩展
  • php72-php-pecl-mcrypt: 加密扩展

PHP基础优化

1
2
3
4
5
6
7
8
# 编辑PHP配置文件
[root@http-server ~]# vim /etc/opt/remi/php72/php.ini

# 修改以下参数
date.timezone = Asia/Shanghai
upload_max_filesize = 1024M
post_max_size = 1024M
memory_limit = 1024M

优化说明:

  • date.timezone: 设置时区
  • upload_max_filesize: 最大上传文件大小
  • post_max_size: POST数据最大大小
  • memory_limit: 脚本内存限制

启动Apache服务

1
2
3
4
5
6
# 启动服务并加入开机自启动
[root@http-server ~]# systemctl start httpd
[root@http-server ~]# systemctl enable httpd

# 检查服务状态
[root@http-server ~]# systemctl status httpd

1.3 安装MariaDB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用yum安装即可
[root@http-server ~]# yum install -y mariadb-server mariadb

# 启动服务并加入开机自启动
[root@http-server ~]# systemctl start mariadb
[root@http-server ~]# systemctl enable mariadb

# 简单初始化,配置root密码
[root@http-server ~]# mysql_secure_installation

Set root password? [Y/n] Y
New password: 输入密码123
Re-enter new password: 确认密码123
# 后面一路回车即可

# 登录Mariadb测试
[root@http-server ~]# mysql -uroot -p123
MariaDB [(none)]> quit

1.4 验证LAMP环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 创建PHP测试页面
cat > /var/www/html/info.php <<EOF
<?php
phpinfo();
?>
EOF

# 测试PHP
curl http://localhost/info.php

# 测试数据库连接
cat > /var/www/html/db.php <<EOF
<?php
\$link = mysqli_connect('localhost', 'root', '123');
if (\$link) {
echo "Database connection successful!";
} else {
echo "Database connection failed!";
}
mysqli_close(\$link);
?>
EOF

2. LAMP架构-部署论坛系统Discuz

2.1 配置Discuz虚拟主机

配置discuz虚拟主机,域名为discuz.bgx.com

1
2
# 创建虚拟主机配置文件
[root@http-server ~]# vim /etc/httpd/conf.d/discuz.conf
1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
ServerName discuz.bgx.com
DocumentRoot "/code/discuz"
DirectoryIndex index.php index.html
ErrorLog logs/error_discuz_log
CustomLog logs/access_discuz_log combined
</VirtualHost>

<Directory /code/discuz>
AllowOverride All
Require all granted
</Directory>
1
2
# 重启httpd服务
[root@http-server ~]# systemctl restart httpd

2.2 部署Discuz源代码

获取Discuz代码

1
2
3
4
5
# 安装git工具
[root@http-server ~]# yum install git -y

# 克隆Discuz代码
[root@http-server ~]# git clone https://gitee.com/ComsenzDiscuz/DiscuzX.git

拷贝代码至站点目录

1
2
3
4
5
6
7
8
9
10
11
# 创建站点目录
[root@http-server ~]# mkdir -p /code/discuz

# 拷贝代码至站点目录
[root@http-server ~]# cp -r DiscuzX/upload/ /code/discuz

# 安装过程中会出现目录不可写,针对对应目录授权即可(可等安装报错再执行)
[root@http-server ~]# chmod 777 -R /code/discuz/{config,data,uc_client,uc_server}

# 设置目录所有者
[root@http-server ~]# chown -R apache:apache /code/discuz

目录权限说明:

  • config: 配置文件目录
  • data: 数据目录
  • uc_client: UCenter客户端
  • uc_server: UCenter服务端

配置Windows hosts解析

在Windows系统中配置hosts解析,以便通过域名访问站点。

文件路径: C:\Windows\system32\drivers\etc\hosts

1
192.168.69.112 discuz.bgx.com

2.3 通过浏览器访问网站

  1. 打开浏览器,访问 http://discuz.bgx.com
  2. 按照安装向导完成Discuz安装
  3. 填写数据库信息:
    • 数据库服务器: localhost
    • 数据库用户名: root
    • 数据库密码: 123
    • 数据库名: discuz(需要先创建)

创建Discuz数据库

1
2
3
4
5
6
7
# 登录MySQL创建数据库
[root@http-server ~]# mysql -uroot -p123

MariaDB [(none)]> create database discuz character set utf8mb4 collate utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> exit

3. LAMP架构-部署博客系统Wordpress

3.1 配置Wordpress虚拟主机

配置wordpress虚拟主机,域名为blog.bgx.com

1
2
# 创建虚拟主机配置文件
[root@http-server ~]# vim /etc/httpd/conf.d/wordpress.conf
1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
ServerName blog.bgx.com
DocumentRoot "/code/wordpress"
DirectoryIndex index.php index.html
ErrorLog logs/error_wordpress_log
CustomLog logs/access_wordpress_log combined
</VirtualHost>

<Directory /code/wordpress>
AllowOverride All
Require all granted
</Directory>
1
2
# 重启httpd服务
[root@http-server ~]# systemctl restart httpd

3.2 部署Wordpress源代码

获取Wordpress代码

1
2
3
4
5
6
# 创建源码目录
[root@http-server ~]# mkdir -p /soft/src
[root@http-server ~]# cd /soft/src

# 下载Wordpress代码
[root@http-server /soft/src]# wget https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz

解压并部署

1
2
3
4
5
6
7
8
# 解压软件网站源码文件
[root@http-server /soft/src]# tar xf wordpress-4.9.4-zh_CN.tar.gz

# 拷贝到站点目录
[root@http-server /soft/src]# cp -r wordpress /code/

# 授权站点目录,不然会导致无法安装
[root@http-server ~]# chown -R apache:apache /code/wordpress/

创建Wordpress数据库

由于Wordpress无法自动创建数据库,所以需要手动建立数据库。

1
2
3
4
5
6
7
# 登录MySQL创建数据库
[root@http-server ~]# mysql -uroot -p123

MariaDB [(none)]> create database wordpress character set utf8mb4 collate utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> exit

配置Windows hosts解析

文件路径: C:\Windows\system32\drivers\etc\hosts

1
192.168.69.112 discuz.bgx.com blog.bgx.com

3.3 通过浏览器访问网站

  1. 打开浏览器,访问 http://blog.bgx.com
  2. 按照安装向导完成Wordpress安装
  3. 填写数据库信息:
    • 数据库名: wordpress
    • 用户名: root
    • 密码: 123
    • 数据库主机: localhost
    • 表前缀: wp_(默认)

4. LAMP架构-部署知乎系统Wecenter

4.1 配置Wecenter虚拟主机

配置wecenter虚拟主机,域名为zh.bgx.com

1
2
# 创建虚拟主机配置文件
[root@http-server ~]# vim /etc/httpd/conf.d/wecenter.conf
1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
ServerName zh.bgx.com
DocumentRoot "/code/wecenter"
DirectoryIndex index.php index.html
ErrorLog logs/error_wecenter_log
CustomLog logs/access_wecenter combined
</VirtualHost>

<Directory /code/wecenter>
AllowOverride All
Require all granted
</Directory>
1
2
# 重启httpd服务
[root@http-server ~]# systemctl restart httpd

4.2 部署Wecenter源代码

获取Wecenter代码

1
2
3
4
5
# 进入源码目录
[root@http-server ~]# cd /soft/src

# 下载Wecenter代码
[root@http-server /soft/src]# wget http://ahdx.down.chinaz.com/201605/WeCenter_v3.1.9.zip

解压并部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装unzip工具
[root@http-server ~]# yum install -y unzip

# 解压软件网站源码文件
[root@http-server /soft/src]# unzip WeCenter_v3.1.9.zip

# 拷贝到站点目录
[root@http-server /soft/src]# cp -rp UPLOAD/ /code/wecenter

# wecenter安装时需要授权的目录
[root@http-server ~]# chmod -R 777 /code/wecenter/system

# 设置目录所有者
[root@http-server ~]# chown -R apache:apache /code/wecenter

创建Wecenter数据库

1
2
3
4
5
6
7
8
# 登录MySQL创建数据库
[root@http-server ~]# mysql -uroot -p123

MariaDB [(none)]> create database wecenter character set utf8mb4 collate utf8mb4_unicode_ci;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> quit
Bye

配置Windows hosts解析

文件路径: C:\Windows\system32\drivers\etc\hosts

1
192.168.69.112 discuz.bgx.com blog.bgx.com zh.bgx.com

4.3 通过浏览器访问网站

  1. 打开浏览器,访问 http://zh.bgx.com
  2. 按照安装向导完成Wecenter安装
  3. 填写数据库信息:
    • 数据库主机: localhost
    • 数据库名: wecenter
    • 数据库用户名: root
    • 数据库密码: 123

5. LAMP架构-部署网校系统Edusohu

5.1 配置Edusohu虚拟主机

配置edusohu虚拟主机,域名为edu.bgx.com

1
2
# 创建虚拟主机配置文件
[root@http-server ~]# vim /etc/httpd/conf.d/edu.conf
1
2
3
4
5
6
7
8
9
10
11
12
<VirtualHost *:80>
ServerName edu.bgx.com
DocumentRoot "/code/edu/web"
DirectoryIndex app.php index.php index.html
ErrorLog logs/error_edu_log
CustomLog logs/access_edu_log combined
</VirtualHost>

<Directory /code/edu/web>
AllowOverride All
Require all granted
</Directory>
1
2
# 重启httpd服务
[root@http-server ~]# systemctl restart httpd

5.2 部署Edusohu源代码

获取Edusohu代码

1
2
3
4
5
# 进入源码目录
[root@http-server ~]# cd /soft/src/

# 下载Edusohu代码
[root@http-server /soft/src]# wget http://download.edusoho.com/edusoho-8.2.17.tar.gz

解压并部署

1
2
3
4
5
6
7
8
9
10
11
# 解压软件网站源码文件
[root@http-server /soft/src]# tar xf edusoho-8.2.17.tar.gz

# 拷贝到站点目录
[root@http-server /soft/src]# cp -r edusoho /code/edu

# 授权站点目录,不然会导致无法安装
[root@http-server ~]# chown -R apache:apache /code/edu/

# 设置目录权限
[root@http-server ~]# chmod -R 777 /code/edu/{app,web}

目录权限说明:

  • app: 应用目录
  • web: Web根目录

配置Windows hosts解析

由于edusohu会自动创建数据库,所以无需手动创建数据库。

文件路径: C:\Windows\system32\drivers\etc\hosts

1
192.168.69.112 discuz.bgx.com blog.bgx.com edu.bgx.com

5.3 通过浏览器访问网站

  1. 打开浏览器,访问 http://edu.bgx.com
  2. 按照安装向导完成Edusohu安装
  3. 填写数据库信息:
    • 数据库主机: localhost
    • 数据库名: edusoho(系统会自动创建)
    • 数据库用户名: root
    • 数据库密码: 123

6. LAMP架构-迁移数据至独立服务器

迁移LAMP的数据库到独立的数据库服务器步骤。

6.1 老服务器操作

步骤1: 从老的数据库里导出数据

1
2
3
4
5
6
# 导出所有数据库
[root@Httpd ~]# mysqldump -uroot -p123 -A -B --events | gzip > /tmp/backup.sql.gz

# 查看备份文件
[root@Httpd ~]# ls -lh /tmp/backup.sql.gz
-rw-r--r-- 1 root root 1.3M Nov 15 10:30 /tmp/backup.sql.gz

命令参数说明:

  • -A: 导出所有数据库
  • -B: 包含CREATE DATABASE语句
  • --events: 导出事件
  • gzip: 压缩备份文件

步骤2: 拷贝到独立的数据库服务器

1
2
3
# 使用scp拷贝到独立的数据库服务器
[root@Httpd ~]# scp /tmp/backup.sql.gz root@192.168.69.113:/tmp
backup.sql.gz 100% 1347KB 21.9MB/s 00:00

6.2 新服务器操作

步骤1: 导入数据库

1
2
3
4
5
# 解压备份文件
[root@MySQL ~]# gzip -d /tmp/backup.sql.gz

# 导入数据库
[root@MySQL ~]# mysql -uroot -p123 < /tmp/backup.sql

步骤2: 重新授权

1
2
3
4
5
6
7
8
9
10
11
12
# 登录MySQL
[root@MySQL ~]# mysql -uroot -p123

# 授权远程用户访问
MariaDB [(none)]> grant all on *.* to remote_user@'192.168.69.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

# 刷新权限
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> exit

授权说明:

  • remote_user: 远程用户名
  • 192.168.69.%: 允许访问的网段
  • 123456: 远程用户密码

6.3 Web服务器上修改程序连接文件

修改对应MySQL连接配置。

修改Wordpress连接

1
2
# 编辑Wordpress配置文件
[root@http-server ~]# vim /code/wordpress/wp-config.php
1
2
3
4
5
6
7
8
/** MySQL主机地址 */
define('DB_HOST', '192.168.69.113');

/** MySQL数据库用户名 */
define('DB_USER', 'remote_user');

/** MySQL数据库密码 */
define('DB_PASSWORD', '123456');

修改Discuz连接

1
2
# 编辑Discuz全局配置文件
[root@http-server ~]# vim /code/discuz/config/config_global.php
1
2
3
$_config['db']['1']['dbhost'] = '192.168.69.113';
$_config['db']['1']['dbuser'] = 'remote_user';
$_config['db']['1']['dbpw'] = '123456';
1
2
# 编辑Discuz UCenter配置文件
[root@http-server ~]# vim /code/discuz/config/config_ucenter.php
1
2
3
define('UC_DBHOST', '192.168.69.113');
define('UC_DBUSER', 'remote_user');
define('UC_DBPW', '123456');

修改Wecenter连接

1
2
# 编辑Wecenter配置文件
[root@http-server ~]# vim /code/wecenter/system/config/database.php
1
2
3
4
5
$config['master'] = array(
'hostname' => '192.168.69.113',
'username' => 'remote_user',
'password' => '123456',
);

修改Edusohu连接

1
2
# 编辑Edusohu配置文件
[root@http-server ~]# vim /code/edu/app/config/parameters.yml
1
2
3
database_host: 192.168.69.113
database_user: remote_user
database_password: 123456

6.4 验证数据库连接

1
2
3
4
5
# 测试数据库连接
[root@http-server ~]# mysql -h 192.168.69.113 -u remote_user -p123456

# 查看数据库列表
MariaDB [(none)]> show databases;

7. LAMP架构优化建议

7.1 Apache优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 启用压缩
LoadModule deflate_module modules/mod_deflate.so

# 启用缓存
LoadModule expires_module modules/mod_expires.so

# 优化MPM配置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

7.2 PHP优化

1
2
3
4
5
6
# PHP性能优化
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60

7.3 MySQL优化

1
2
3
4
5
6
7
# MySQL性能优化
[mysqld]
innodb_buffer_pool_size = 1G
max_connections = 500
query_cache_size = 64M
tmp_table_size = 64M
max_heap_table_size = 64M

7.4 安全加固

1
2
3
4
5
6
7
8
9
10
# 修改MySQL root密码
mysqladmin -u root -p password '新密码'

# 删除测试数据库
mysql -u root -p
DROP DATABASE test;

# 限制PHP函数
vim /etc/opt/remi/php72/php.ini
disable_functions = exec,passthru,shell_exec,system,proc_open,popen

8. 常见问题排查

8.1 权限问题

1
2
3
4
5
6
7
# 检查目录权限
ls -ld /code/*

# 修复权限
chown -R apache:apache /code/*
find /code -type d -exec chmod 755 {} \;
find /code -type f -exec chmod 644 {} \;

8.2 数据库连接问题

1
2
3
4
5
6
7
8
# 测试数据库连接
mysql -h localhost -u root -p123

# 检查MySQL服务状态
systemctl status mariadb

# 查看MySQL错误日志
tail -f /var/log/mariadb/mariadb.log

8.3 PHP错误排查

1
2
3
4
5
6
7
# 查看PHP错误日志
tail -f /var/log/httpd/error_log

# 启用PHP错误显示
vim /etc/opt/remi/php72/php.ini
display_errors = On
error_reporting = E_ALL

8.4 虚拟主机不生效

1
2
3
4
5
6
7
8
# 检查虚拟主机配置
apachectl -S

# 测试配置文件语法
apachectl configtest

# 检查DNS解析
nslookup discuz.bgx.com

9. 备份与恢复

9.1 数据库备份

1
2
3
4
5
# 备份所有数据库
mysqldump -uroot -p123 -A -B --events | gzip > /backup/db_$(date +%Y%m%d).sql.gz

# 备份单个数据库
mysqldump -uroot -p123 wordpress | gzip > /backup/wordpress_$(date +%Y%m%d).sql.gz

9.2 网站文件备份

1
2
3
4
5
# 备份网站文件
tar -czf /backup/wordpress_$(date +%Y%m%d).tar.gz /code/wordpress

# 备份所有网站
tar -czf /backup/websites_$(date +%Y%m%d).tar.gz /code

9.3 自动备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
# 创建备份脚本
cat > /root/backup.sh <<'EOF'
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)

# 备份数据库
mysqldump -uroot -p123 -A -B --events | gzip > $BACKUP_DIR/db_$DATE.sql.gz

# 备份网站文件
tar -czf $BACKUP_DIR/websites_$DATE.tar.gz /code

# 删除7天前的备份
find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
EOF

# 设置执行权限
chmod +x /root/backup.sh

# 添加到计划任务
echo "0 2 * * * /root/backup.sh" | crontab -

实战优化