Linux 安装 Apache, MySQL, PHP 搭建 Web 服务器

一、安装前准备

首先下载安装文件

1. 下载安装包

下载以下 7 个压缩包

  • Apache依赖包:apr-1.7.0.tar.gz、apr-util-1.6.1.tar.gz、pcre-8.45.tar.gz
  • Apache主程序:httpd-2.4.52.tar.gz
  • MySQL数据库:mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz (⚠️注意:一定要下这种 linux-glibc 的通用二进制包,千万不要下 .rpm 包,小白用RPM包离线安装绝对会报错)
  • PHP依赖包:libxml2-2.9.14.tar.gz
  • PHP主程序:php-7.4.33.tar.gz

下载地址

https://resource.migshare.cn/static/202606/001/lamp_packages.zip

下载完后,拷贝到服务器上。

注意:接下来过程中如遇到错误提示,如系统未安装工具或权限等问题,请根据实际情况处理解决,最简单的方式就是把报错交给AI,按AI提供方案解决。

2. 在服务器上解压并建目录

  • 把 lamp_packages.zip 放到服务器的 /opt 目录下。
  • 登录服务器,执行以下命令,创建目录并解压:

创建统一存放目录

sudo mkdir -p /lamp_install

把压缩包解压到该目录

sudo unzip /opt/lamp_packages.zip -d /lamp_install

进入目录

cd /lamp_install

二、安装 Apache(网页服务器)

Apache 必须按顺序安装它的 3 个依赖,最后再装自己。

1. 安装 apr

sudo tar -zxvf apr-1.7.0.tar.gz

编译安装

cd apr-1.7.0
sudo ./configure --prefix=/usr/local/apr

出现下面的提示不用担心,直接忽略就行

make && sudo make install

2. 安装 apr-util

cd ..
sudo tar -zxvf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1

编译安装

sudo ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && sudo make install

安装如果遇到下图错误,表示在编译过程中,系统尝试在当前目录(/lamp_install/apr-util-1.6.1)下创建或写入一个名为 .make.dirs 的隐藏文件时,被拒绝了。

不要着急按错误提示进行处理即可。

解决步骤

第一步:检查并修复源码目录权限

请执行以下命令,将 /lamp_install 目录的所有权修改为当前用户 xhf,这样您就有权限在里面进行编译操作了:

sudo chown -R xhf:xhf /lamp_install

第二步:清理之前的编译残留

由于之前的 make 失败,可能会留下一些残缺的临时文件。强烈建议先清理一下:

make clean

第三步:重新编译与安装

权限修复并清理完毕后,重新执行标准的编译安装命令:

make && sudo make install

这样上面报错问题就解决了。

如果报下面图问题,说明您的 Linux 系统中缺少了 Expat 库的开发包。

apr-util 内置了对 XML 解析的支持,在编译其 XML 模块时需要依赖 Expat 库的头文件(即 expat.h)。如果没有安装这个开发包,编译器就会找不到该文件并中断编译。

解决步骤

请根据您的 Linux 发行版,使用包管理器安装对应的开发包:

如果是 CentOS / RHEL 系统:

sudo yum install expat-devel -y

如果是 Ubuntu / Debian 系统:

sudo apt-get install libexpat1-dev -y

重新编译安装

安装完依赖包后,由于之前编译中断,建议先清理一下缓存,然后重新执行编译和安装命令:

make clean
make && sudo make install

成功截图

3. 安装 pcre

cd ..
sudo tar -zxvf pcre-8.45.tar.gz
cd pcre-8.45

编译安装,编译安装如果遇到权限问题参考上面解决步骤即可。

sudo ./configure --prefix=/usr/local/pcre
make && sudo make install

成功截图

4. 安装 Apache 本体

cd ..
sudo tar -zxvf httpd-2.4.52.tar.gz
cd httpd-2.4.52

编译安装,编译安装如果遇到权限问题参考上面解决步骤即可。

sudo ./configure --prefix=/usr/local/httpd --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre
make && sudo make install

如果遇到下图问题,说明在编译 Apache (httpd) 时,链接器找不到 Expat 库(XML 解析库)的实现。

根本原因:
您在之前编译 apr-util 时,可能使用了 –with-expat=builtin(内置副本),或者系统当时没有安装 Expat 的开发包,导致生成的 libaprutil-1.so 动态链接库中缺失了 XML 相关的底层依赖。当 Apache 尝试链接这个库时,就会报找不到符号的错误。

解决步骤

要彻底解决这个问题,需要重新编译安装 apr-util,让它正确链接到系统的 Expat 库,然后再重新编译 Apache。

第一步:安装系统级 Expat 开发包

如果您之前没有安装,请先执行以下命令安装:

CentOS / RHEL 系统:

sudo yum install expat-devel -y

Ubuntu / Debian 系统:

sudo apt-get install libexpat1-dev -y

如果出现截图中的问题,说明系统里是有 Expat 库的,但 APR-Util 在编译时没有正确链接到它。这通常是因为 APR-Util 的 configure 脚本没能自动检测到库的位置,或者缓存了错误的配置。

请按照以下步骤强制重新编译 APR-Util:

第一步:清理并重新配置 APR-Util

进入你的 APR-Util 源码目录(根据你的截图应该是 /lamp_install/apr-util-1.6.1),执行以下命令:

cd /lamp_install/apr-util-1.6.1

清理之前的编译残留(非常重要)

make clean

重新配置–with-expat=/usr 是关键参数,强制指定使用系统的 expat

sudo ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-expat=/usr

成功截图

执行安装

make && sudo make install

如下图显示,说明 APR-Util 已经重新编译并安装成功了

接下来的操作步骤

请在终端中依次执行以下命令:

进入 Apache 源码目录

cd /lamp_install/httpd-2.4.52

清理旧的编译文件(非常重要)

为了避免旧的错误缓存干扰,必须执行 clean:

make clean

重新配置 Apache

你需要再次告诉 Apache 去哪里找刚才修好的 APR 和 APR-Util。请确保路径与你之前安装的一致(通常是 /usr/local/apr 和 /usr/local/apr-util):

sudo ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

再次编译如果出现下图问题,意味着系统里缺少 PCRE 库的开发文件

使用系统包管理器安装

我使用的是 Ubuntu/Debian 系(根据之前的 apt-get 命令判断),直接用系统包管理器安装是最稳妥的,它会自动处理依赖和路径问题。

安装旧版 PCRE (8.x) 开发包

sudo apt-get install libpcre3-dev -y

成功截图

回到 Apache 源码目录并清理旧缓存

cd /lamp_install/httpd-2.4.52
make clean

重新执行 Apache 的 configure 命令,关键参数:–with-pcre

sudo ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

成功截图

sudo make && sudo make install

验证安装是否成功

安装完成后,你可以运行以下命令查看 Apache 的版本信息

/usr/local/httpd/bin/apachectl -v

启动 Apache 服务

由于你是源码编译安装的,我们使用 apachectl 脚本来管理它:

sudo /usr/local/httpd/bin/apachectl start

验证是否启动成功,如果看到 “It works!” 的默认欢迎页面,就说明 Apache 已经完美运行了

curl http://localhost

三、安装 MySQL(数据库)

MySQL 我们用的是免编译的二进制包,不需要 make,但需要手动初始化。

1. 创建专属用户和目录

sudo groupadd mysql
sudo useradd -r -g mysql mysql
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /data/mysql

2. 解压并移动

sudo tar -zxvf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz
sudo mv mysql-5.7.39-linux-glibc2.12-x86_64 /usr/local/mysql

3. 初始化数据库

sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

如遇到下图问题,说明您的 Linux 系统中缺少了 libaio(Linux 异步 I/O 库)。

MySQL 在启动或初始化时,强依赖 libaio.so.1 这个共享库来进行高效的磁盘操作。如果系统中没有安装该库,mysqld 进程就会直接报错退出。

解决步骤

请根据您的 Linux 发行版,使用包管理器安装对应的依赖库:

如果是 CentOS / RHEL 系统:

sudo yum install libaio -y

如果是 Ubuntu / Debian 系统:

sudo apt-get update
sudo apt-get install libaio-dev -y
sudo ln -sf /usr/lib/x86_64-linux-gnu/libaio.so.1t64.0.2 /usr/lib/x86_64-linux-gnu/libaio.so.1
sudo ldconfig

重新初始化 MySQL

sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

成功截图

临时密码:sTT,bmro26Z*

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

作用:将 MySQL 安装包自带的服务控制脚本(mysql.server)复制到 Linux 系统的初始化脚本目录(/etc/init.d/)下,并重命名为 mysqld。

目的:/etc/init.d/ 是 Linux 系统集中管理系统服务的目录。把脚本放在这里,就可以像管理系统自带服务一样来管理 MySQL。

启动数据库

sudo systemctl status mysqld.service 

如果启动报下图错误,说明MySQL 正在尝试把错误日志写到 /usr/local/mysql/data/ 目录下,但是这个目录在您的系统中根本不存在!
因为目录不存在,mysqld_safe 脚本无法创建日志文件,导致启动流程直接中断崩溃。

结合您之前的操作,您初始化数据库时指定的数据目录是 /data/mysql,但 MySQL 默认还在寻找 /usr/local/mysql/data。

解决步骤

我们需要通过配置文件,彻底把 MySQL 的所有路径都指向您实际的 /data/mysql 目录。

第一步:创建缺失的目录并赋予权限(保底操作)
为了防止后续还有零散文件需要写入,我们先把这个默认目录也建出来:

sudo mkdir -p /usr/local/mysql/data 
sudo chown -R mysql:mysql /usr/local/mysql/data

第二步:修改 MySQL 配置文件(核心修复)
打开配置文件:

sudo vim /etc/my.cnf

在 [mysqld] 配置段下,明确指定数据目录和日志路径,确保 MySQL 不再乱找默认路径:

[mysqld]
user=mysql
datadir=/data/mysql
log-error=/data/mysql/myserver.err
pid-file=/data/mysql/myserver.pid
socket=/data/mysql/mysql.sock

[client]
socket=/data/mysql/mysql.sock

(保存并退出:按 Esc,输入 :wq 回车)

第三步:修改 systemd 服务文件(修复 PID 报错)
日志最后一行提示 Can’t open PID file /run/mysqld/mysqld.pid,说明 systemd 还在找默认的 PID 路径。我们需要修改服务文件:

sudo vim /etc/systemd/system/mysqld.service

在 [Service] 段下,修改或添加 PID 文件路径,使其与配置文件一致:

[Service]
Type=simple
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld_safe --user=mysql
PIDFile=/data/mysql/myserver.pid

完整的配置如下图

(保存并退出)

第四步:重载配置并启动

sudo systemctl daemon-reload
sudo systemctl start mysqld

第五步:验证启动状态

sudo systemctl status mysqld

启动成功

修改密码

sudo /usr/local/mysql/bin/mysql -u root -p

如果报下图错误,是因为 MySQL 客户端程序依赖 libncurses.so.5 这个动态链接库文件,但当前的 Ubuntu 24.04 系统中没有安装这个特定版本的库。

由于 MySQL 5.7 等较旧版本对旧版库有硬编码依赖,而新版 Ubuntu 已经升级了该库,因此我们需要通过创建软链接的方式来“欺骗” MySQL,让它使用新版库文件。

解决步骤

第一步:查找系统中现有的高版本库文件

首先,我们需要确认系统中实际存在的 libncurses 版本(通常是 .so.6 版本)。请执行:

find / -name 'libncurses.so*'

通常输出会包含类似 /usr/lib/x86_64-linux-gnu/libncurses.so.6 的路径。

第二步:创建软链接

假设上一步找到的文件路径是 /usr/lib/x86_64-linux-gnu/libncurses.so.6,我们将其链接为 MySQL 需要的 .so.5 版本:

sudo ln -s /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64-linux-gnu/libncurses.so.5

第三步:刷新动态链接器缓存

sudo ldconfig

第四步:重新测试登录

sudo /usr/local/mysql/bin/mysql -u root -p

重要预警:可能出现的“连环报错”

在解决 libncurses.so.5 的问题后,当您再次执行登录命令时,极有可能会紧接着报出另一个极其相似的错误:
libtinfo.so.5: cannot open shared object file: No such file or directory

这是因为 libncurses 和 libtinfo 是一对依赖库,它们同时缺失了旧版本。如果您遇到了这个新报错,请使用完全相同的逻辑解决:

查找现有版本

find / -name 'libtinfo.so*'

创建软链接

sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5

刷新缓存

sudo ldconfig

再次登录 MySQL

sudo /usr/local/mysql/bin/mysql -u root -p

回车后,输入你刚才记下的临时密码(输入时屏幕不会显示,正常的)

登录进去后,执行以下 SQL 语句把密码改成 123456(你可以自己定):

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
exit;

第五步:安装 PHP

1. 安装 libxml2 依赖

sudo tar -zxvf libxml2-v2.9.14.tar.gz
cd libxml2-v2.9.14

编译安装

sudo ./autogen.sh --prefix=/usr/local/libxml2

如果出现截图报错,系统提示您缺少编译 libxml2 所必需的三个核心工具:autoconf、automake 和 libtool。

根据您提供的网页链接,这些都是 GNU 组织开发的标准开源工具。

解决方案:一键安装依赖

既然您使用的是基于 Debian/Ubuntu 的系统(从之前的 apt 命令推断),您可以使用以下命令一次性安装这三个工具以及 pkg-config(编译库时通常也需要它):

sudo apt update
sudo apt install autoconf automake libtool pkg-config

再次执行编译安装

sudo ./autogen.sh --prefix=/usr/local/libxml2
sudo make -j$(nproc) && sudo make install

成功截图

2. 安装 PHP 本体

cd ..
sudo tar -zxvf php-7.4.33.tar.gz
cd php-7.4.33

编译安装

sudo ./configure --prefix=/usr/local/php --with-apxs2=/lamp_install/httpd-2.4.52/support/apxs --with-mysqli=/usr/local/mysql/bin/mysql_config --with-libxml-dir=/usr/local/libxml2

如果遇到截图中错误, 标识当前用户没有执行权限。

解决方案

你只需要给 apxs 文件添加执行权限即可。请依次执行以下命令:

赋予执行权限

chmod +x /lamp_install/httpd-2.4.52/support/apxs

检查输出中是否包含 x(例如 -rwxr-xr-x),包含说明生效了

重新运行 PHP 的 configure 命令 进行编译

sudo ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/httpd/bin/apxs --with-mysqli=/usr/local/mysql/bin/mysql_config  --with-libxml-dir=/usr/local/libxml2

如果遇到下图问题,说明 PHP 的 configure 脚本在通过 pkg-config 工具寻找 libxml2 库时,没有找到对应的 .pc 描述文件

虽然之前可能编译安装了 libxml2,但系统默认的 pkg-config 并不知道它被安装到了 /usr/local/libxml2 这个非标准路径下。

我们需要手动告诉系统去哪里找它。请按照以下步骤操作:

解决方案:设置 PKG_CONFIG_PATH 环境变量

先确认你的 libxml2 描述文件在哪里

执行以下命令查找 libxml-2.0.pc 文件的位置:

find /usr/local/libxml2 -name "libxml-2.0.pc"

设置环境变量并重新配置 PHP

将找到的 pkgconfig 目录路径追加到 PKG_CONFIG_PATH 中

PKG_CONFIG_PATH="/usr/local/libxml2/lib/pkgconfig:$PKG_CONFIG_PATH" \
sudo -E ./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-libxml-dir=/usr/local/libxml2

安装

make && sudo make install

如果出现下图报错,不用担心,仍然是权限问题

解决方案:给当前用户赋予源码目录的所有权

我们需要把整个 PHP 源码目录的所有权交还给当前的普通用户。请依次执行以下命令:

修复源码目录权限

sudo chown -R xhf:xhf /lamp_install/php-7.4.33

重新执行编译和安装,这个过程需要耐心等待

make && sudo make install

成功截图

生成配置文件

配置 php.ini 文件

sudo cp /lamp_install/php-7.4.33/php.ini-development /usr/local/php/lib/php.ini

重启 Apache 让配置生效

sudo /usr/local/httpd/bin/apachectl restart

终极验证:测试 PHP 是否正常工作

创建一个 PHP 测试文件:

sudo nano /usr/local/httpd/htdocs/info.php

在文件中写入以下代码

<?php
phpinfo();
?>

保存并退出(Ctrl+O 回车保存,Ctrl+X 退出)。

命令行访问

curl http://localhost/info.php

如果出现下图的问题,不要担心我们继续解决下

快速修复步骤:

清理旧的编译缓存

cd /lamp_install/php-7.4.33
sudo make clean

重新配置(去掉 apxs2,加上 fpm 和 opcache)

PKG_CONFIG_PATH="/usr/local/libxml2/lib/pkgconfig:$PKG_CONFIG_PATH" \
sudo -E ./configure \
--prefix=/usr/local/php \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--with-libxml-dir=/usr/local/libxml2 \
--enable-fpm \
--with-fpm-user=nobody \
--with-fpm-group=nogroup \
--enable-opcache

(注:这里去掉了 –with-apxs2,加上了 –enable-fpm 和 –enable-opcache)

编译并安装

sudo make && sudo make install

配置并启动 PHP-FPM

复制配置文件

sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf 
sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf

启动 PHP-FPM

sudo /usr/local/php/sbin/php-fpm

让 Apache 代理请求给 PHP-FPM

打开 Apache 配置文件:

sudo nano /usr/local/httpd/conf/httpd.conf

找到并取消以下两行的注释(启用代理模块):

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

在文件末尾添加一行,将所有 .php 请求转发给 FPM:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/usr/local/httpd/htdocs/$1

按 Ctrl + O,然后按 回车键 保存。

按 Ctrl + X 退出编辑器。

在命令行执行以下命令,重启 Apache 让配置生效:

sudo /usr/local/httpd/bin/apachectl restart

再次验证

curl http://localhost/info.php

输出html代码说明成功了

到此我们也就完成了linux安装LAMP的全部过程,坑很多遇到问题不要急,踩坑也是一种提升过程。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注