LAMP 与阿里云服务器详解
Chen Kai CTO

LAMP 是 Linux 服务器上的一套经典 Web 服务器架构,由 Linux(操作系统)、Apache(Web 服务器)、MySQL(数据库)和 PHP/Python/Perl(动态脚本语言)组成。阿里云服务器提供了强大的计算资源,使得用户可以在云环境中搭建 LAMP 服务器来部署 Web 应用。


一、LAMP 架构概述

LAMP 是构建动态网站和 Web 应用的主流架构。它的每个组件在架构中发挥特定作用:

  • Linux:作为服务器操作系统,提供稳定的运行环境。
  • Apache:作为 Web 服务器,处理 HTTP 请求并将网页内容返回给客户端。
  • MySQL:提供数据库服务,用于存储网站数据。
  • PHP、Python、Perl:用于动态生成网页,与 MySQL 交互,处理用户请求。

![img](./LAMP 与阿里云服务器详解/420px-LAMP_software_bundle.svg.png)

下图展示了 LAMP 架构的工作流程:

  1. 用户访问网站,浏览器向 Apache 服务器发送 HTTP 请求。
  2. Apache 解析请求并调用 PHP 处理逻辑。
  3. PHP 脚本查询 MySQL 数据库获取数据。
  4. 数据返回给 PHP 处理,并最终由 Apache 服务器返回给用户。

![LAMP架构_lamp具体结构包括-CSDN博客](./LAMP 与阿里云服务器详解/ee8c173e981c46068d93961c484c43e2.png)

![LAMP架构的详细内容以及通信过程- Nice_keep-going - 博客园](./LAMP 与阿里云服务器详解/992547-20170619140819648-1336856462.png)

二、阿里云服务器概述与网络配置

阿里云服务器(ECS)为用户提供弹性计算资源,并支持多种操作系统(如 Ubuntu)。在阿里云环境中,关键的网络配置包括公网 IP 与防火墙安全组设置。下面是云服务器控制台的监控界面:

![image-20250211211700378](./LAMP 与阿里云服务器详解/image-20250211211700378.png)

1. 阿里云服务器基础

  • 弹性扩展:根据实际需求调整 CPU、内存、带宽等资源。

    ![image-20250211211940966](./LAMP 与阿里云服务器详解/image-20250211211940966.png)

  • 公网 IP:使服务器可以被外部访问。你可以在阿里云控制台为 ECS 实例分配公网 IP。

    ![image-20250211212019600](./LAMP 与阿里云服务器详解/image-20250211212019600.png)

  • 安全组(防火墙):阿里云提供安全组管理工具,用于配置允许哪些端口和 IP 能访问你的服务器。

2. 防火墙与公网 IP 配置

公网 IP 配置

在阿里云 ECS 控制台:

  • 为实例分配或绑定公网 IP。
  • 在实例信息中查看公网 IP,并通过浏览器访问测试。

安全组规则设置

在 ECS 控制台的安全组配置中,添加以下入站规则:

  • SSH:端口 22(允许远程登录)。
  • HTTP:端口 80(用于网站访问)。
  • HTTPS:端口 443(用于安全网站访问)。
  • 可根据需要开放 MySQL(3306)、FTP 等端口。

默认安全组配置如下:

![image-20250211154055070](./LAMP 与阿里云服务器详解/image-20250211154055070.png)

配置方式如下:

![image-20250211221452657](./LAMP 与阿里云服务器详解/image-20250211221452657.png)

配置结果如下:

![image-20250211221531005](./LAMP 与阿里云服务器详解/image-20250211221531005.png)

或在服务器上使用 iptables 命令手动配置:

1
2
3
4
5
6
7
8
# 允许 HTTP 访问
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许 HTTPS 访问
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 SSH 访问
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 保存规则(Ubuntu 下使用 iptables-persistent)
sudo netfilter-persistent save

三、LAMP 环境搭建(Ubuntu 实例)

在阿里云的 Ubuntu 服务器上,搭建 LAMP 环境主要包括安装 Apache、MySQL 和 PHP,并进行简单配置与验证。

0. 准备工作

在开始之前,我们一般要关闭所有防火墙(内置防火墙和 Linux 的软件防火墙)。

第一步就是关闭 selinux,这是美国航空安全局开发的内置防火墙。我们首先可以通过 getenforce 查询 selinux 状态,但基本只有CentOS 8 会有比较多的 seinux 的策略,CentOS7 不用。我们可以修改其默认配置,永久禁止其开机自启:

第二步是关闭内置的 firewalld 以及清空 iptables 规则:

1
2
3
iptables -F
systemctl stop firewalld
systemctl disable firewalld

1. 安装 Apache Web 服务器

1
2
3
4
5
sudo apt update
sudo apt install apache2 -y

# 或者在CentOS里
yum install httpd -y

启动并设置 Apache 开机自启:

1
2
sudo systemctl start apache2
sudo systemctl enable apache2

验证:在浏览器访问 http://<公网_IP>/ 应显示 Apache 默认欢迎页面。

⚠️注意,如果之前没有配置安全组通过 80 端口,会显示:

![image-20250211221630066](./LAMP 与阿里云服务器详解/image-20250211221630066.png)

按前面说的配置一下安全组就行,最终会显示如下页面:

![image-20250211221716957](./LAMP 与阿里云服务器详解/image-20250211221716957.png)

下面为 CentOS 下的 Apache 服务器启动以及测试方式:

![image-20250211220450481](./LAMP 与阿里云服务器详解/image-20250211220450481.png)

curl ifconfig.me 可以拿到自己的 ip 地址

2. MySQL 数据库

安装

命令如下:

1
sudo apt install mysql-server -y

运行安全安装向导:

1
sudo mysql_secure_installation

按照提示设置 MySQL root 密码,移除匿名用户,禁止远程 root 登录。

验证:

1
sudo systemctl status mysql

在阿里云服务器安装时,默认的阿里云源是没有 mysql 的,只有 mariadb

![image-20250211222133896](./LAMP 与阿里云服务器详解/image-20250211222133896.png)

我们可以给服务器换源:

首先进入到 /etc/yum.repos.d,进行如下操作:

![image-20250211225358267](./LAMP 与阿里云服务器详解/image-20250211225358267.png)

1
2
wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm

查看 mysql-community.repo 文件:

![image-20250211225836835](./LAMP 与阿里云服务器详解/image-20250211225836835.png)

随后运行以下命令安装即可:

1
yum -y install mysql-community-server

![image-20250211232057979](./LAMP 与阿里云服务器详解/image-20250211232057979.png)

可以输入 mysql_secure_installation 来进行密码设置:

![image-20250211232544886](./LAMP 与阿里云服务器详解/image-20250211232544886.png)

登录后可以查看一些基本信息如下:

![image-20250211232802711](./LAMP 与阿里云服务器详解/image-20250211232802711.png)

当使用源码编译的方式安装 mysql 时如果系统中没有安装 openssl 或其开发头文件和库,就会遇到报错缺少 openssl,这时我们需要做两步:

  1. 删除编译的目录:编译失败后,通常会有一个部分完成的目录(即使没有完全成功安装),此时需要删除该目录。

    1
    rm -rf /path/to/mysql/source/directory

    删除这个目录,确保不会使用到损坏的或不完整的文件。

  2. 安装 openssl:确保系统中安装了 openssl 和相关的开发工具。如果缺少开发头文件,还需要安装 openssl-devel 包。

    1
    yum install openssl openssl-devel
  3. 重新编译 MySQL:在安装了 openssl 之后,重新进入 MySQL 源代码目录,开始新的编译安装。

    1
    2
    3
    4
    cd /path/to/mysql/source
    ./configure # 配置 MySQL 编译选项
    make # 编译 MySQL
    make install # 安装 MySQL

配置与远程访问

现在我们可以对 MySQL 数据库进行配置与远程访问

1. 修改 MySQL 绑定地址

编辑 MySQL 配置文件:

1
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

找到 bind-address 字段,将其改为:

1
bind-address = 0.0.0.0

保存后退出编辑器,然后重启 MySQL 服务:

1
sudo systemctl restart mysql

2. 创建远程访问用户

登录 MySQL 客户端:

1
sudo mysql -u root -p

在 MySQL 提示符下,执行以下 SQL 语句:

1
2
3
CREATE USER 'admin'@'%' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
FLUSH PRIVILEGES;

退出 MySQL。

3. 安全注意

确保安全组允许 MySQL 端口(3306)的访问,或通过 SSH 隧道访问 MySQL 服务。

3. PHP 及相关模块

安装

命令如下:

1
2
3
sudo apt install php libapache2-mod-php php-mysql -y
# CentOS下
yum install php -y

验证 PHP 安装:

1
2
3
4
5
php -v

# PHP 5.4.16 (cli) (built: Apr 1 2020 04:07:17)
# Copyright (c) 1997-2013 The PHP Group
# Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

创建页面

为了确认 PHP 环境安装成功,我们可以创建一个简单的 phpinfo() 页面。

1. 创建 phpinfo.php 测试页面

将以下内容写入 /var/www/html/phpinfo.php

1
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/phpinfo.php

2. 访问测试页面

在浏览器中访问:

1
http://<公网_IP>/phpinfo.php

如果页面显示 PHP 的详细配置信息,说明 PHP 安装正确并且与 Apache 正常集成。(访问不成功可以尝试 systemctl restart httpd

![image-20250212000319587](./LAMP 与阿里云服务器详解/image-20250212000319587.png)

或者可以尝试些别的,我们可以使用 PHP 的数组、随机函数以及内置的日期函数生成动态内容

  • 利用 array_rand() 随机选择名言
  • 使用 date() 函数显示当前时间
  • 输出简单的 HTML 页面

![image-20250212000842498](./LAMP 与阿里云服务器详解/image-20250212000842498.png)

四、Discuz! 论坛部署

Discuz! 是一个基于 PHP 和 MySQL 的开源论坛程序,常用于搭建社区网站。下面介绍如何在 LAMP 环境中部署 Discuz!。

![image-20250212003942527](./LAMP 与阿里云服务器详解/image-20250212003942527.png)

1. 下载并解压 Discuz! 安装包

我们要进入 Apache 的默认目录,可以通过 rpm -ql 来查找:

![image-20250211235946415](./LAMP 与阿里云服务器详解/image-20250211235946415.png)

上面那些 share 的都可以不用管,只有最后一行数据是有用的,也就是我们要找的 Apache 的默认目录,进入 Apache 默认目录并下载:

1
2
cd /var/www/html
wget https://download.comsenz.com/DiscuzX/3.4/Discuz_X3.4_SC_UTF8.zip

解压安装包:

1
unzip Discuz_X3.4_SC_UTF8.zip

将解压后的内容移动到网站根目录:

1
sudo mv upload/* /var/www/html/

![image-20250212005140326](./LAMP 与阿里云服务器详解/image-20250212005140326.png)

2. 安装 Discuz!

在浏览器中访问:

1
http://<公网_IP>/install/

![image-20250212005209279](./LAMP 与阿里云服务器详解/image-20250212005209279.png)

发现报错:

![image-20250212005412101](./LAMP 与阿里云服务器详解/image-20250212005412101.png)

下面开始升级 PHP 版本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 1. 更新系统并安装必要的软件包
sudo yum update -y # 更新系统
sudo yum install -y epel-release yum-utils # 安装 EPEL 仓库和 yum-utils 工具

# 2. 安装 Remi 仓库(CentOS 7 专用)
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm # 添加 Remi 仓库

# 3. 启用所需的 PHP 版本
sudo yum-config-manager --enable remi-php81 # 这里以 PHP 8.1 为例,其他版本请修改对应的数字

# 4. 升级或安装 PHP 及其常见扩展
sudo yum install -y php php-cli php-common php-mbstring php-xml php-mysqlnd php-fpm php-opcache php-curl php-gd php-zip

# 5. 验证 PHP 版本是否正确安装
php -v # 查看 PHP 版本,确认升级是否成功

# 6. 选择正确的 PHP 版本(如果 `php -v` 仍然是旧版本)
sudo alternatives --config php # 可能需要手动选择 PHP 版本

# 7. 重启 Web 服务器以应用新 PHP 版本
sudo systemctl restart httpd # 如果使用的是 Apache
sudo systemctl restart php-fpm # 如果使用的是 Nginx+PHP-FPM
sudo systemctl restart nginx # 如果 Nginx 也需要重启

# 8. 确保 PHP-FPM 正常运行
sudo systemctl enable php-fpm # 开机自启 PHP-FPM
sudo systemctl status php-fpm # 检查 PHP-FPM 运行状态

经过一系列猛如虎的操作,PHP升级成功了,环境检查也不再报错了:

![image-20250212010201948](./LAMP 与阿里云服务器详解/image-20250212010201948.png)

但下面又报错了,问题出在了目录权限,下面我们就把目录权限做修改。

3. 配置 Apache 目录权限

设置文件所有者为 www-data,并赋予适当权限:

1
chmod -R 777 ./*

![image-20250212010501483](./LAMP 与阿里云服务器详解/image-20250212010501483.png)

现在终于大功告成:

![image-20250212010528759](./LAMP 与阿里云服务器详解/image-20250212010528759.png)

如果提示少了驱动,我们可以通过 yum install php-mysqli -y 安装

按照安装向导输入数据库信息:

  • 数据库地址:localhost
  • 数据库名称:discuz
  • 数据库用户:admin
  • 数据库密码:yourpassword

![image-20250212011051827](./LAMP 与阿里云服务器详解/image-20250212011051827.png)

![image-20250212011102231](./LAMP 与阿里云服务器详解/image-20250212011102231.png)

完成安装后,即可进入 Discuz! 后台管理,进一步配置论坛设置。

![image-20250212013221831](./LAMP 与阿里云服务器详解/image-20250212013221831.png)

五、源码编译安装

我们现在要搞事情,我们现在准备清空整个 LAMP(Linux + Apache + MySQL + PHP)环境并从头开始重新用源码编译,以下是详细的步骤指南。

MySQL 5.6.31 + PHP 7.2.17

1. 清空原有环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 1. 停止 Apache 和 MySQL 服务
sudo systemctl stop httpd
sudo systemctl stop mysqld

# 2. 卸载 Apache、MySQL 和 PHP
sudo yum remove httpd mysql mysql-server php php-cli php-fpm php-mysqlnd

# 3. 删除 Apache、MySQL 和 PHP 配置文件和数据文件
sudo rm -rf /etc/httpd
sudo rm -rf /var/www
sudo rm -rf /var/lib/mysql
sudo rm -rf /etc/my.cnf
sudo rm -rf /etc/php

# 4. 删除 MySQL 和 Apache 用户和组,组可能不存在,会报错,但不用管
sudo userdel mysql
sudo groupdel mysql
sudo userdel apache
sudo groupdel apache

# 5. 删除残留的依赖和配置文件
sudo yum autoremove

![image-20250212115847770](./LAMP 与阿里云服务器详解/image-20250212115847770.png)

![image-20250212115742880](./LAMP 与阿里云服务器详解/image-20250212115742880.png)

2. 基础软件运行环境准备

在重新安装之前,确保系统安装了编译所需的工具:

1
2
sudo yum groupinstall "Development Tools"
sudo yum install -y gcc-c++ make cmake bison libaio-devel ncurses-devel zlib-devel openssl-devel

还可以选择安装一些其他的开发包以避免可能存在的错误:

1
sudo yum install gcc patch libffi-devel python-devel bzip2-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel net-tools vim -y

注意:在开始后续操作之前一定要关闭防火墙(selinuxfirewalld

1
2
3
4
5
[root@iZ7xv858yt7ltpn85a6qv8Z yum.repos.d]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)

下载太慢可以更换yum源或dns源或换网络环境

3. 编译安装 MySQL

编译安装顺序:

  1. Apache 一定要先于 PHP
  2. Apache 和 MySQL没有明显的依赖关系,先后无所谓
  3. 在 PHP 3.5 之前,MySQL必须先于 PHP 编译,因为 PHP 需要实现连接数据库的功能,它通过 MySQL接口才能实现这一功能;在 3.5 之后 PHP 已经集成了一套连接 MySQL 数据库的代码,编译顺序无所谓了

创建 MySQL 用户

用于给 MySQL 的数据、进程设置相关的 user 属主:

1
useradd -r -s /sbin/nologin mysql

下载 MySQL

首先我们要创建一个源码目录用于下载对应软件:

1
2
3
cd /usr/local
mkdir software-mysql
cd software-mysql

我们可以在华为提供的库内下载需要的 MySQL 版本:

![image-20250212171131843](./LAMP 与阿里云服务器详解/image-20250212171131843.png)

选择一个合适的版本:

![image-20250214202606094](./LAMP 与阿里云服务器详解/image-20250214202606094.png)

下载源码并解压缩:

1
2
wget https://repo.huaweicloud.com:8443/artifactory/mysql-local/Downloads/MySQL-5.6/mysql-5.6.49.tar.gz
tar -xzvf mysql-5.6.49.tar.gz

编译安装

进入解压缩后的目录可以发现,这里没有我们之前看到的 configure,只有 cmake,我们需要安装 cmake 命令。然后我们需要在 MySQL 的源码目录下,执行 cmake 命令以配置并生成 Makefile,然后编译源代码。可以将以下命令保存为 cmake.sh

1
2
3
4
5
6
7
8
9
10
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DENABLE_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql

下面是对这些参数的解释:

  • -DCMAKE_INSTALL_PREFIX=/usr/local/mysql:指定 MySQL 安装路径
  • -DMYSQL_DATADIR=/usr/local/mysql/data:指定 MySQL 数据目录
  • -DENABLE_LOCAL_INFILE=1:启用 LOCAL 文件加载
  • -DWITH_INNOBASE_STORAGE_ENGINE=1:启用 InnoDB 存储引擎
  • -DMYSQL_TCP_PORT=3306:指定 MySQL 使用的 TCP 端口
  • -DDEFAULT_CHARSET=utf8mb4:指定默认字符集为 utf8mb4
  • -DDEFAULT_COLLATION=utf8mb4_general_ci:指定默认排序规则为 utf8mb4_general_ci
  • -DWITH_EXTRA_CHARSETS=all:启用所有额外字符集
  • -DMYSQL_USER=mysql:指定 MySQL 的默认用户

然后对文件需要修改权限,加入可执行权限,首先运行 cmake.sh

![image-20250214202711590](./LAMP 与阿里云服务器详解/image-20250214202711590.png)

运行成功如上图后,执行 make,因为时间不是太久就直接选择前台执行了:

![image-20250214202440317](./LAMP 与阿里云服务器详解/image-20250214202440317.png)

![image-20250214205348391](./LAMP 与阿里云服务器详解/image-20250214205348391.png)

运行成功后如上图所示,再执行 make install,就会发现 /usr/local/ 路径下多了 mysql 这个文件夹,随后将文件夹里的 bin 目录添加到 ~/.bashrc 即可:

1
export PATH=$PATH:/usr/local/mysql/bin

保存并激活即可。

删除旧文件残留

我们接下来要检查是否有旧的 mysql 数据文件残留,发现存在我们将其进行移动备份:

![image-20250214122846366](./LAMP 与阿里云服务器详解/image-20250214122846366.png)

修改文件属主属组

可以看到现在文件的属主和属组都还是 root,我们需要将其修改为 mysql

![image-20250214213331153](./LAMP 与阿里云服务器详解/image-20250214213331153.png)

初始化 mysql

现在我们开始尝试连接 mysql 客户端,但会报错,说无法连接到本地的 mysql 服务端:

![image-20250214210714681](./LAMP 与阿里云服务器详解/image-20250214210714681.png)

Linux 的软件启动后会有两种形式提供给客户端去访问:

  1. ip:port 形式,如 0.0.0.0:3306,网络连接方式
  2. socket 本地套接字文件形式,本地进程套接字文件,启动 mysql,提供它的本地连接进程文件 tmp/mysql.sock,只要这个文件存在,mysql 就是启动的

总之就是 mysql 还没启动,因此此时首先要对 mysql 数据库初始化,生成一些必备的数据文件,因为 mysql 要设置账号密码总得有一个库和表可以存储。具体操作如下:

1
2
3
4
5
6
7
8
9
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-5.6.49]# cd /usr/local/mysql
[root@iZ7xv858yt7ltpn85a6qv8Z mysql]# ls ./scripts/
mysql_install_db
[root@iZ7xv858yt7ltpn85a6qv8Z mysql]# ./scripts/mysql_install_db --user=mysql
Installing MySQL system tables...2025-02-14 21:36:08 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2025-02-14 21:36:08 0 [Note] Ignoring --secure-file-priv value as server is running with --bootstrap.
2025-02-14 21:36:08 0 [Note] ./bin/mysqld (mysqld 5.6.49) starting as process 1270 ...
2025-02-14 21:36:08 1270 [Note] InnoDB: Using atomics to ref count buffer pool pages
2025-02-14 21:36:08 1270 [Note] InnoDB: The InnoDB memory heap is disabled

运行一长串之后我们会看到两个 OK,这说明初始化成功:

![image-20250214213731409](./LAMP 与阿里云服务器详解/image-20250214213731409.png)

创建启动脚本

因为我们是手动编译安装,还需要自己创建启动脚本:

1
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

我们可以查看这个文件:

![image-20250214214619451](./LAMP 与阿里云服务器详解/image-20250214214619451.png)

此时使用 service 命令,会去读取 /etc/init.d 下的脚本文件,启动 mysql

![image-20250214214835608](./LAMP 与阿里云服务器详解/image-20250214214835608.png)

设置密码与登录

![image-20250214215614743](./LAMP 与阿里云服务器详解/image-20250214215614743.png)

4. 编译安装 Apache

安装依赖包 apr

apr(Apache portable run-time Libraries,Apache 可移植运行库),主要是为上层的应用程序提供一个可以跨越多操作系统平台的底层支持接口库。下载地址为:https://archive.apache.org/dist/apr/,进入该地址会有如下内容:

![image-20250214220544809](./LAMP 与阿里云服务器详解/image-20250214220544809.png)

一直往下拉会有一些可以下载的安装包,具体的地址可以用下面的:

1
2
wget https://archive.apache.org/dist/apr/apr-1.5.2.tar.bz2
tar -xf apr-1.5.2.tar.bz2; cd apr-1.5.2

可能由于这个版本的一个 bug,这里我们需要修改一个配置:

1
2
vim configure
# 修改 29605 行 ‘RM’ = 'RM -f' 添加一个 -f 参数

如果不指定配置参数,就会安装到默认路径 /usr/local,一般推荐这些小的依赖库不要修改路径,我们直接 ./configure

![image-20250214221932200](./LAMP 与阿里云服务器详解/image-20250214221932200.png)

然后执行编译三部曲的后两步即可:

1
make && make install

![image-20250214222220789](./LAMP 与阿里云服务器详解/image-20250214222220789.png)

安装基础库 apr-util

完整的 APR(Apache 可移植运行库)实际上包含了三个开发包:aprapr-utilapr-iconv,每一个包分别独立开发,并拥有自己的版本。apr-util这个库中也是包含了一些常用的开发组件,这些组件与 apr 目录下的相比,它们与 Apache 的关系更加密切一些,比如存储段和存储段组、加密等。这个包还是在刚刚的 https://archive.apache.org/dist/apr/ 下可以找到

1
2
wget https://archive.apache.org/dist/apr/apr-util-1.5.4.tar.bz2
tar -xf apr-util-1.5.4.tar.bz2; cd apr-util-1.5.4

然后还是三部曲,这里的 configure 要加个参数:

1
2
./configure --with-apr=/usr/local/apr/bin/apr-1-config
make && make install

![image-20250214224641704](./LAMP 与阿里云服务器详解/image-20250214224641704.png)

此时 aprapr-util 库就生成了一些基础的 Linux 文件(动态链接库,和 C 语言相关),我们需要告诉 Linux 系统多了一些这些工具,Linux 才能读取到这些信息,才能给 Apache 调用。

1
2
3
# ls /usr/local/apr/lib/
apr.exp aprutil.exp libapr-1.la libapr-1.so.0 libaprutil-1.a libaprutil-1.so libaprutil-1.so.0.5.4
apr-util-1 libapr-1.a libapr-1.so libapr-1.so.0.5.2 libaprutil-1.la libaprutil-1.so.0 pkgconfig

通常,库文件会被安装到标准的系统目录,如 /lib, /lib64, /usr/lib/, /usr/lib64 等地方,这些路径是默认的库文件搜索路径,因此系统和应用程序能够找到它们。

但是,如果某个软件 A 将库文件安装到一个非标准目录,例如 /usr/local/A/lib,那么你需要将该路径添加到系统的动态链接库搜索路径中。否则,系统和其他程序将无法找到这个库文件。

ldconfig 是一个用于动态链接库管理的命令,它的主要作用是搜索系统中的共享动态链接库,并将它们添加到缓存中,以供程序使用。ldconfig 会在以下路径中查找共享库:

  • 默认搜索路径:/lib, /lib64, /usr/lib/, /usr/lib64
  • 动态库配置文件:/etc/ld.so.conf 中列出的路径

如果你将新的库文件安装到非标准路径(如 /usr/local/A/lib),你需要通过以下方式更新搜索路径:

  1. 编辑 /etc/ld.so.conf 或添加一个新的 .conf 文件到 /etc/ld.so.conf.d/ 目录。
  2. 运行 ldconfig 命令,让系统知道这个新的路径,从而能够找到并使用该路径下的动态库。

具体命令如下:

1
2
3
4
5
6
7
8
9
10
echo "/usr/local/apr/lib" >> /etc/ld.so.conf
cat /etc/ld.so.conf
# include ld.so.conf.d/*.conf
# /usr/local/apr/lib

# 或者新建一个 .conf 文件
echo "/usr/local/apr/lib" > /etc/ld.so.conf.d/lamp.conf


ldconfig

编译 Apache步骤

回到刚刚的下载安装包的目录,再上一級找到 httpd 获取链接进行 wget

1
2
wget https://archive.apache.org/dist/httpd/httpd-2.4.37.tar.bz2
tar -xf httpd-2.4.37.tar.bz2; cd httpd-2.4.37

制作配置脚本:

1
2
3
4
5
6
7
8
9
10
./configure \
--enable-modules=all \
--enable-mods-shared=all \
--enable-so \
--enable-rewrite \
--with-pcre \
--enable-ssl \
--with-mpm=prefork \
--with-apr=/usr/local/apr/bin/apr-1-config \
--with-apr-util=/usr/local/apr/bin/apu-1-config

添加执行权限并执行脚本:

1
2
chmod +x apache-configure.sh
./apache-configure.sh

![image-20250214233341542](./LAMP 与阿里云服务器详解/image-20250214233341542.png)

直接成功结果如上,最后 make & make install 即可,最后安装到了 /usr/local/apache2 下。

修改配置文件

语言支持

我们修改 /usr/local/apache2/conf 里的 httpd.conf 的参数以获得中文语言支持,我们删除第 159 行以及 481 行的注释即可:

![image-20250215002204065](./LAMP 与阿里云服务器详解/image-20250215002204065.png)

![image-20250215002456908](./LAMP 与阿里云服务器详解/image-20250215002456908.png)

我们会发现如果想要使用一些功能,只需要在这里取消一些功能的对应注释即可~

PHP 支持

另外我们还需要开启 PHP 的插件,当有用户访问 PHP 程序时,Apache 自动转发给 PHP 去解析,168 和 169 行的意思是以 .php 结尾的文件都认为是 PHP 程序文件

![image-20250215004856276](./LAMP 与阿里云服务器详解/image-20250215004856276.png)

并且要设置当访问这台机器的时候,当什么都不添加时会访问磁盘上的 index.php 文件:

原本是这样的:

![image-20250215005511442](./LAMP 与阿里云服务器详解/image-20250215005511442.png)

要改成这样(谁在前面就先解析谁):

![image-20250215005537989](./LAMP 与阿里云服务器详解/image-20250215005537989.png)

这行参数的作用就是会让原本只是访问 8.134.207.88 自动变成访问 8.134.207.88/index.php

HTML 文件路径

关于网站默认的首页 HTML 文件存放的目录路径由以下参数控制:

![image-20250215010011089](./LAMP 与阿里云服务器详解/image-20250215010011089.png)

修改子配置文件

要修改该配置文件使得优先支持中文:

1
vim /usr/local/apache2/conf/extra/httpd-languages.conf

取消第 19 行的注释,将原本的 DefaultLanguage nl 修改为 DefaultLanguage zh-CN

以及调整第 79 行的优先级,将中文的优先级放在第一个:

1
LanguagePriority zh-CN en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv tr zh-TW

域名设置

可以在主配置文件的这里添加域名:

![image-20250215010744599](./LAMP 与阿里云服务器详解/image-20250215010744599.png)

5. 编译安装 PHP

编译与安装

这里比较简单,我们直接快速操作了:

1
2
3
4
wget https://museum.php.net/php7/php-7.2.17.tar.xz
tar -xf php-7.2.17.tar.xz
cd php-7.2.17
vim configure_php.sh

在文件中写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
./configure \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysqli \
--with-pdo-mysql \
--with-zlib \
--with-curl \
--enable-zip \
--with-gd \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--enable-opcache \
--enable-mbstring \
--enable-mbregex \
--enable-pcntl \
--enable-shmop \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-calendar \
--enable-bcmath

然后依次执行chmod +x configure_php.sh./configure_php.shmake && make install 即可。

![image-20250215014045762](./LAMP 与阿里云服务器详解/image-20250215014045762.png)

![image-20250215014117280](./LAMP 与阿里云服务器详解/image-20250215014117280.png)

检查 Apache是否支持PHP

进入 Apache 的网页根目录 /usr/local/apache2/htdocs,创建一个 PHP 文件,查看是否支持:

![image-20250215011611322](./LAMP 与阿里云服务器详解/image-20250215011611322.png)

启动 Apache:

1
2
[root@iZ7xv858yt7ltpn85a6qv8Z php-7.2.17]# service apache start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.20.53.217. Set the 'ServerName' directive globally to suppress this message

![image-20250215015006688](./LAMP 与阿里云服务器详解/image-20250215015006688.png)

查看对应的 IP 地址,访问正常:

![image-20250215015140320](./LAMP 与阿里云服务器详解/image-20250215015140320.png)

由于默认端口和默认文件都已经配置好了,就不需要再写端口和 index.php

6. WordPress

下载源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@iZ7xv858yt7ltpn85a6qv8Z source-code]# wget https://cn.wordpress.org/wordpress-4.7.3-zh_CN.tar.gz
[root@iZ7xv858yt7ltpn85a6qv8Z source-code]# mkdir wordpress
[root@iZ7xv858yt7ltpn85a6qv8Z source-code]# mv wordpress-4.7.3-zh_CN.tar.gz wordpress
[root@iZ7xv858yt7ltpn85a6qv8Z source-code]# cd wordpress/
[root@iZ7xv858yt7ltpn85a6qv8Z wordpress]# tar -zxf wordpress-4.7.3-zh_CN.tar.gz
[root@iZ7xv858yt7ltpn85a6qv8Z wordpress]# ls
wordpress wordpress-4.7.3-zh_CN.tar.gz
[root@iZ7xv858yt7ltpn85a6qv8Z wordpress]# cp -a wordpress/* ../www/test_wordpress_blog/
[root@iZ7xv858yt7ltpn85a6qv8Z wordpress]# chown -R daemon.daemon ../www/test_wordpress_blog/
[root@iZ7xv858yt7ltpn85a6qv8Z wordpress]# rm -rf /usr/local/apache2/htdocs/*
[root@iZ7xv858yt7ltpn85a6qv8Z wordpress]# mv ../www/test_wordpress_blog/* /usr/local/apache2/htdocs/
[root@iZ7xv858yt7ltpn85a6qv8Z wordpress]# ls /usr/local/apache2/htdocs/
index.php wp-activate.php wp-comments-post.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php
license.txt wp-admin wp-config-sample.php wp-includes wp-login.php wp-signup.php
readme.html wp-blog-header.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php

访问网站会有下面的内容:

![image-20250215020259972](./LAMP 与阿里云服务器详解/image-20250215020259972.png)

填写基本信息后发现我们还没有创建这个数据库:

![image-20250215020513590](./LAMP 与阿里云服务器详解/image-20250215020513590.png)

我们进入 MySQL 进行操作:

![image-20250215020803966](./LAMP 与阿里云服务器详解/image-20250215020803966.png)

注意我们需要回到前面修改我们前面创建的数据库名,使得数据库名与我们创建的能对得上:

![image-20250215020903213](./LAMP 与阿里云服务器详解/image-20250215020903213.png)

然后再执行一下傻瓜操作:

![image-20250215020921167](./LAMP 与阿里云服务器详解/image-20250215020921167.png)

然后执行完下面这一步就结束了:

![image-20250215021153620](./LAMP 与阿里云服务器详解/image-20250215021153620.png)

一个漂亮的博客管理页面就做好啦:

![image-20250215021254303](./LAMP 与阿里云服务器详解/image-20250215021254303.png)


六、debug日志

1. 新版本 MySQL 安装凉经

这里我们创建文件夹的方式都一样:

1
2
3
cd /usr/local
mkdir software-mysql
cd software-mysql

同样在华为提供的库内下载需要的 MySQL 版本,我们选择了较新版的 8.0.25:

![image-20250212171518515](./LAMP 与阿里云服务器详解/image-20250212171518515.png)

下载源码并解压缩:

1
2
3
wget https://repo.huaweicloud.com:8443/artifactory/mysql-local/Downloads/MySQL-8.0/mysql-8.0.25.tar.gz
tar -xzvf mysql-8.0.25.tar.gz
du -sh *

🧰 关于 cmake 版本

![image-20250212175149284](./LAMP 与阿里云服务器详解/image-20250212175149284.png)

在安装 MySQL 的时候我们需要使用 cmake 进行编译,首先我遇到了 cmake 的版本问题,我们通过升级 cmake 版本修正这个问题:

![image-20250212200732906](./LAMP 与阿里云服务器详解/image-20250212200732906.png)

修改指令并尝试运行该文件

🧰 gcc 路径

好的,不出意外地再次报错

![image-20250212200925468](./LAMP 与阿里云服务器详解/image-20250212200925468.png)

我们通过 cmak 命令中的 CMAKE_C_COMPILERCMAKE_CXX_COMPILER` 变量来手动指定编译器路径。例如,假设 gcc 和 g++ 安装在默认路径下,尝试如下命令:

1
2
3
4
5
6
7
8
9
10
11
12
cmake3 . \
-DCMAKE_C_COMPILER=/usr/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/g++ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql

依然不是很成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-8.0.25]# ./cmake.sh 
-- Running cmake version 3.17.5
-- CMP0073 OLD
-- CMAKE_MODULE_PATH is /usr/local/software-mysql/mysql-8.0.25/cmake
-- MySQL 8.0.25
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/g++
-- Check for working CXX compiler: /usr/bin/g++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Source directory /usr/local/software-mysql/mysql-8.0.25
-- Binary directory /usr/local/software-mysql/mysql-8.0.25
CMake Error at CMakeLists.txt:382 (MESSAGE):
Please do not build in-source. Out-of source builds are highly
recommended: you can have multiple builds for the same source, and there is
an easy way to do cleanup, simply remove the build directory (note that
'make clean' or 'make distclean' does *not* work)

You *can* force in-source build by invoking cmake with
-DFORCE_INSOURCE_BUILD=1


-- Configuring incomplete, errors occurred!

这条报错是在说 CMake 强烈建议不要在源代码目录内进行编译,因为这样会造成源代码目录的污染,无法轻松清理。理想的做法是 在源代码外的单独目录中进行构建。这个还比较好解决,如果我们非要在源代码目录中构建,可以通过使用 -DFORCE_INSOURCE_BUILD=1 强制进行构建,但这不是推荐的做法:

1
2
# 强制在源代码目录内构建
cmake3 . -DFORCE_INSOURCE_BUILD=1

推荐的做法是:

2. 在源代码目录之外创建一个新的目录进行构建

1
2
3
4
5
6
7
8
# 返回到 /usr/local/software-mysql
cd /usr/local/software-mysql

# 创建一个新的构建目录
mkdir mysql-build

# 进入构建目录
cd mysql-build

那我们使用后者吧:

在开始编译之前我们需要清理原来的 builds 文件:

1
2
rm -rf /usr/local/software-mysql/mysql-8.0.25/CMakeFiles
rm -rf /usr/local/software-mysql/mysql-8.0.25/CMakeCache.txt

然后我们修改 cmake.sh 命令:

1
2
3
4
5
6
7
8
9
10
11
12
cmake3 /usr/local/software-mysql/mysql-8.0.25 \
-DCMAKE_C_COMPILER=/usr/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/g++ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql

再运行它一次!我不信还会出错了!

然而。。。果然又有新的问题了。。。这次是 GCC 版本过低,MySQL 8.0.25 需要 GCC 5.3 或更高版本来进行编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-build]# ./cmake.sh 
-- Running cmake version 3.17.5
-- Found Git: /usr/bin/git (found version "1.8.3.1")
-- CMP0073 OLD
-- CMAKE_MODULE_PATH is /usr/local/software-mysql/mysql-8.0.25/cmake
-- MySQL 8.0.25
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/g++
-- Check for working CXX compiler: /usr/bin/g++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Source directory /usr/local/software-mysql/mysql-8.0.25
-- Binary directory /usr/local/software-mysql/mysql-build
-- CMAKE_GENERATOR: Unix Makefiles
CMake Error at cmake/os/Linux.cmake:80 (MESSAGE):
GCC 5.3 or newer is required (-dumpversion says 4.8.5)
Call Stack (most recent call first):
CMakeLists.txt:491 (INCLUDE)

🧰 关于 centos-release-scl 的一个小插曲(待解决)

我试图安装 centos-release-scl 进而安装新版本的 gcc,这个软件包提供了 Software Collections (SCL) 的支持。SCL 是一种在不影响系统默认软件版本的情况下,让用户安装和使用不同版本的软件包的机制。简单来说,它允许用户安装、使用与系统默认版本不同的软件版本,例如最新版本的 Python、GCC、Ruby、PHP 等,而不需要更改系统的默认版本。SCL 提供了以下优势:

  1. 你可以同时使用多个版本的相同软件,比如使用系统自带的老版本 Python,同时安装并使用新版本的 Python。
  2. 在不同的环境中切换版本变得更加灵活。
  3. 不会影响到系统自带的包,减少了与其他系统包的冲突风险。

安装命令很简单:

1
sudo yum install centos-release-scl -y

但安装完之后其他包的安装存在了问题,例如我原本准备执行这个命令安装 gcc

1
sudo yum install devtoolset-8-gcc* -y

然而报了如下的错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-build]# sudo yum install devtoolset-8-gcc* -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrorlist.centos.org?arch=x86_64&release=7&repo=sclo-rh error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"


One of the configured repositories failed (Unknown),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:

1. Contact the upstream for the repository and get them to fix the problem.

2. Reconfigure the baseurl/etc. for the repository, to point to a working
upstream. This is most often useful if you are using a newer
distribution release than is supported by the repository (and the
packages for the previous distribution release still work).

3. Run the command with the repository temporarily disabled
yum --disablerepo=<repoid> ...

4. Disable the repository permanently, so yum won't use it by default. Yum
will then just ignore the repository until you permanently enable it
again or use --enablerepo for temporary usage:

yum-config-manager --disable <repoid>
or
subscription-manager repos --disable=<repoid>

5. Configure the failing repository to be skipped, if it is unavailable.
Note that yum will try to contact the repo. when it runs most commands,
so will have to try and fail each time (and thus. yum will be be much
slower). If it is a very temporary problem though, this is often a nice
compromise:

yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true

Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64

显示软件源可以看到多了两条:

1
2
[root@iZ7xv858yt7ltpn85a6qv8Z ~]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.repo epel.repo epel.repo.rpmnew epel-testing.repo

CentOS-SCLo-scl.repo 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@iZ7xv858yt7ltpn85a6qv8Z ~]# cat /etc/yum.repos.d/CentOS-SCLo-scl.repo 
# CentOS-SCLo-sclo.repo
#
# Please see http://wiki.centos.org/SpecialInterestGroup/SCLo for more
# information

[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo
# baseurl=http://mirror.centos.org/centos/7/sclo/$basearch/sclo/
mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-sclo
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

[centos-sclo-sclo-testing]
name=CentOS-7 - SCLo sclo Testing
baseurl=http://buildlogs.centos.org/centos/7/sclo/$basearch/sclo/
gpgcheck=0
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

[centos-sclo-sclo-source]
name=CentOS-7 - SCLo sclo Sources
baseurl=http://vault.centos.org/centos/7/sclo/Source/sclo/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

[centos-sclo-sclo-debuginfo]
name=CentOS-7 - SCLo sclo Debuginfo
baseurl=http://debuginfo.centos.org/centos/7/sclo/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

我们只能先禁用他们:

1
2
3
4
5
6
7
# 禁用 centos-sclo-sclo 仓库
sudo yum-config-manager --disable centos-sclo-sclo
sudo yum-config-manager --disable centos-sclo-rh

# 清除缓存
sudo yum clean all
sudo yum makecache

这个限于目前的技术水平,暂时不知道是什么原因,我估计是梯子的问题,留待之后排查

🧰 继续解决前面的 gcc 版本问题

我们可以尝试直接源码编译

访问 GCC 的官方网站下载最新版本的源代码,并执行 configure 脚本以及编译步骤:

1
2
3
4
5
6
7
8
9
10
11
wget http://ftp.gnu.org/gnu/gcc/gcc-8.5.0/gcc-8.5.0.tar.gz
tar -xvzf gcc-8.5.0.tar.gz
cd gcc-8.5.0
# 安装依赖
sudo yum install -y gmp-devel mpfr-devel libmpc-devel
# 运行 configure 脚本
./configure --disable-multilib --enable-languages=c,c++

make -j$(nproc) # 使用所有 CPU 核心加速编译
# 通过 make -j 来增加并行任务数,make -j2 表示使用两个并行任务
sudo make install

这个编译过程特别耗时,对于 GCC 8.5.0 这种大型项目,单核 CPU 编译可能需要 6-12 小时,两核 CPU 的情况下,可能需要 3-6 小时 或更长时间。

编译完之后,我们还需要把这个 gcc 的路径加入到环境变量中,特别是 PATHLD_LIBRARY_PATH,首先我们查找路径:

  1. 找到新 GCC 的安装路径。通常,make install 会将 GCC 安装到 /usr/local/bin 中。

  2. 通过以下命令检查新 GCC 是否安装在 /usr/local/bin

    1
    ls /usr/local/bin/gcc

    如果文件存在,表示新的 GCC 已安装在该目录。

接下来在 ~/.bashrc 文件中添加新 GCC 的路径:

1
2
export PATH=/usr/local/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH

![image-20250213181357527](./LAMP 与阿里云服务器详解/image-20250213181357527.png)

然后退出并 source ~/.bashrc 即可,我们再次打印 gcc --version 会发现版本已经更新了:

1
2
3
4
5
6
7
[root@iZ7xv858yt7ltpn85a6qv8Z gcc-8.5.0]# vim ~/.bashrc
[root@iZ7xv858yt7ltpn85a6qv8Z gcc-8.5.0]# source ~/.bashrc
[root@iZ7xv858yt7ltpn85a6qv8Z gcc-8.5.0]# gcc --version
gcc (GCC) 8.5.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

🧰 Boost 依赖项

我们需要修改 cmake.sh 文件里的 gcc 的路径为最新安装的

1
2
3
4
5
6
7
8
9
10
11
12
cmake3 /usr/local/software-mysql/mysql-8.0.25  \
-DCMAKE_C_COMPILER=/usr/local/bin/gcc \
-DCMAKE_CXX_COMPILER=/usr/local/bin/g++ \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DMYSQL_TCP_PORT=3306 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql

然后清除目录下的 CMakeFiles 和 CMakeCache.txt:

1
2
3
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-build]# rm -rf CMakeFiles
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-build]# rm -rf CMakeCache.txt
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-build]# ./cmake.sh

现在出现了新的报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
[root@iZ7xv858yt7ltpn85a6qv8Z mysql-build]# ./cmake.sh 
-- Running cmake version 3.17.5
-- Found Git: /usr/bin/git (found version "1.8.3.1")
-- CMP0073 OLD
-- CMAKE_MODULE_PATH is /usr/local/software-mysql/mysql-8.0.25/cmake
-- MySQL 8.0.25
-- The C compiler identification is GNU 8.5.0
-- The CXX compiler identification is GNU 8.5.0
-- Check for working C compiler: /usr/local/bin/gcc
-- Check for working C compiler: /usr/local/bin/gcc - works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/local/bin/g++
-- Check for working CXX compiler: /usr/local/bin/g++ - works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Source directory /usr/local/software-mysql/mysql-8.0.25
-- Binary directory /usr/local/software-mysql/mysql-build
-- CMAKE_GENERATOR: Unix Makefiles
-- Looking for SHM_HUGETLB
-- Looking for SHM_HUGETLB - found
-- Looking for sys/types.h
-- Looking for sys/types.h - found
-- Looking for stdint.h
-- Looking for stdint.h - found
-- Looking for stddef.h
-- Looking for stddef.h - found
-- Check size of void *
-- Check size of void * - done
-- SIZEOF_VOIDP 8
-- Performing Test HAVE_C_FLOATING_POINT_FUSED_MADD
-- Performing Test HAVE_C_FLOATING_POINT_FUSED_MADD - Failed
-- Performing Test HAVE_CXX_FLOATING_POINT_FUSED_MADD
-- Performing Test HAVE_CXX_FLOATING_POINT_FUSED_MADD - Failed
-- Packaging as: mysql-8.0.25-Linux-x86_64
-- Performing Test C_LD_LLD_RESULT
-- Performing Test C_LD_LLD_RESULT - Failed
-- Performing Test CXX_LD_LLD_RESULT
-- Performing Test CXX_LD_LLD_RESULT - Failed
-- Performing Test C_LD_GOLD_RESULT
-- Performing Test C_LD_GOLD_RESULT - Success
-- Performing Test CXX_LD_GOLD_RESULT
-- Performing Test CXX_LD_GOLD_RESULT - Success
-- Looked for boost/version.hpp in and
-- BOOST_INCLUDE_DIR BOOST_INCLUDE_DIR-NOTFOUND
-- LOCAL_BOOST_DIR
-- LOCAL_BOOST_ZIP
-- Could not find (the correct version of) boost.
-- MySQL currently requires boost_1_73_0

CMake Error at cmake/boost.cmake:107 (MESSAGE):
You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>

This CMake script will look for boost in <directory>. If it is not there,
it will download and unpack it (in that directory) for you.

You can also download boost manually, from
https://dl.bintray.com/boostorg/release/1.73.0/source/boost_1_73_0.tar.gz

If you are inside a firewall, you may need to use an https proxy:

export https_proxy=http://example.com:80

Call Stack (most recent call first):
cmake/boost.cmake:276 (COULD_NOT_FIND_BOOST)
CMakeLists.txt:1147 (INCLUDE)


-- Configuring incomplete, errors occurred!
See also "/usr/local/software-mysql/mysql-build/CMakeFiles/CMakeOutput.log".
See also "/usr/local/software-mysql/mysql-build/CMakeFiles/CMakeError.log".

当前问题是 找不到 Boost 1.73.0 版本,这是 MySQL 8.0.25 的一个依赖项。

  1. 下载并安装 Boost 1.73.0

    1
    2
    3
    cd /usr/local/software-mysql/mysql-build
    wget https://archives.boost.io/release/1.73.0/source/boost_1_73_0.tar.gz
    tar -xvzf boost_1_73_0.tar.gz
  2. cmake.sh 文件最后添加一行:

    1
    -DWITH_BOOST=/usr/local/software-mysql/mysql-build/boost_1_73_0
  3. 然后执行 cmake.sh 文件即可:

    ![image-20250213191157461](./LAMP 与阿里云服务器详解/image-20250213191157461.png)

成功~

我们将所有 CPU 一起启动在后台安装,并将日志输出到 mysql_make_output.log

1
nohup make -j$(nproc) > mysql_make_output.log 2>&1 &

![image-20250213191603813](./LAMP 与阿里云服务器详解/image-20250213191603813.png)

胜利的曙光就在眼前~让我们拭目以待!!!

🧰 程序被系统终止(重新 make

不出意外的是,又出问题了 👿

![image-20250213204627873](./LAMP 与阿里云服务器详解/image-20250213204627873.png)

可能的原因如下:

1. 内存不足

编译 MySQL 这样的复杂程序时,特别是在使用 make -j$(nproc) 进行并行编译时,系统可能会耗尽内存。cc1plusg++ 编译器的一个关键部分,当系统的内存不足时,操作系统可能会终止该进程。

解决方案

  • 增加系统的物理内存。
  • 如果是虚拟机,考虑增加虚拟内存或增加物理内存。
  • 如果不能增加内存,可以尝试减少并行任务数,使用 make -j2 或者 make -j1 让编译过程使用较少的内存。

2. SWAP空间不足

当内存不足时,系统会使用交换空间(SWAP)。如果 SWAP 空间不足,也会导致编译失败。

解决方案

  • 检查当前的 SWAP 空间:

    1
    swapon -s
  • 如果 SWAP 空间不足,可以通过以下命令增加 SWAP:

    1
    2
    3
    4
    sudo dd if=/dev/zero of=/swapfile bs=1M count=4096  # 创建一个 4GB 的交换文件
    sudo chmod 600 /swapfile # 设置权限
    sudo mkswap /swapfile # 设置交换文件
    sudo swapon /swapfile # 启用交换文件

3. CPU 或系统资源被占满

由于并行编译使用了大量的 CPU 核心,系统可能因资源消耗过高导致进程被杀死。

解决方案

  • 降低 make 命令的并行度,减少 CPU 核心数的使用,尝试 make -j2 或 make -j1。

4. 硬盘空间不足

如果磁盘空间不足,编译过程中的临时文件和输出文件可能无法正确写入磁盘,导致编译中断。

解决方案

  • 检查磁盘空间:

    1
    df -h
  • 如果磁盘空间不足,删除一些不必要的文件或扩展磁盘空间。

5. 系统限制

Linux 系统有时会根据进程的资源使用情况(如内存、CPU 时间等)进行限制,可能会在某些情况下杀死进程。

解决方案

  • 检查 ulimit 设置,增加进程允许使用的内存或文件描述符数:

    1
    2
    3
    ulimit -a  # 查看所有限制
    ulimit -n # 查看文件描述符限制
    ulimit -u # 查看最大进程数限制

经过检查猜测大概率是内存不足的问题,现在我们需要使用 make clean 命令清理之前的编译结果,这会删除 make 过程中生成的所有中间文件和目标文件。

1
2
3
make clean
rm -rf CMakeCache.txt CMakeFiles
./cmake.sh

我们对交换空间、虚拟内存与 CPU 核数均做了优化:

  1. 按前面所说流程增加交换空间大小

    1
    2
    3
    4
    sudo dd if=/dev/zero of=/swapfile bs=1M count=4096  # 创建一个 4GB 的交换文件
    sudo chmod 600 /swapfile # 设置权限
    sudo mkswap /swapfile # 设置交换文件
    sudo swapon /swapfile # 启用交换文件
  2. 为了让交换空间在系统重启后自动生效,编辑 /etc/fstab 文件并添加以下内容:

    1
    /swapfile none swap sw 0 0
  3. 然后增加操作系统的虚拟内存限制,来避免进程因内存溢出而被杀死:

    1
    ulimit -v unlimited
  4. 最后再尝试使用单核 CPU 进行编译:

    1
    2
    3
    4
    ./cmake.sh
    nohup make -j1 > mysql_make_output.log 2>&1 &
    # 使用下面命令查看日志
    tail -f /usr/local/software-mysql/mysql-build/mysql_make_output.log

下面还是老样子,再次祈祷!

![image-20250214105213109](./LAMP 与阿里云服务器详解/image-20250214105213109.png)

经过了漫长的等待,终于迎来了胜利!

再把这个 bin 的路径保存到 ~/.bashrc 并激活即可:

![image-20250214121526166](./LAMP 与阿里云服务器详解/image-20250214121526166.png)

🧰 gcc 版本还是太低

看起来一切都很顺利,但在最后的初始化这一步还是凉了~

![image-20250214132359514](./LAMP 与阿里云服务器详解/image-20250214132359514.png)

运行以下命令来列出 libstdc++ 的版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@iZ7xv858yt7ltpn85a6qv8Z ~]# strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_DEBUG_MESSAGE_LENGTH
[root@iZ7xv858yt7ltpn85a6qv8Z ~]# strings /usr/lib64/libstdc++.so.6 | grep CXXABI
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_TM_1

还得重新安装 GCC 9 才能行得通,886了!下次安装前一定要提前看好适配的包是什么,要去官网先看一遍安装教程,不然又会凉 🥹 血的教训!一定要人家写了什么版本就安装什么版本!!

2. PHP 编译

如果 configure 的时候遇到报错:

1
configure: error: libxml2 not found. Please check your libxml2 installation.

可以执行以下命令补充安装再次 configure

1
sudo yum install libxml2 libxml2-devel -y

遇到报错:

1
checking for cURL 7.10.5 or greater... configure: error: cURL version 7.10.5 or later is required to compile php with cURL support

则升级 cURL 即可:

1
sudo yum install curl curl-devel -y

遇到报错:

1
2
3
checking whether to enable JIS-mapped Japanese font support in GD... no
If configure fails try --with-webp-dir=<DIR>
configure: error: jpeglib.h not found.

说明在配置 PHP 时,找不到 jpeglib.h 头文件,这是 JPEG 图像库的一部分,PHP 在编译时需要它来支持处理 JPEG 图像:

1
sudo yum install libjpeg-devel -y
  • 本文标题:LAMP 与阿里云服务器详解
  • 本文作者:Chen Kai
  • 创建时间:2025-02-16 00:00:00
  • 本文链接:https://www.chenk.top/LAMP 与阿里云服务器详解/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论