{
"title": "CentOS 7.9 实战:从零编译搭建 LAMP 服务(Apache + MySQL + PHP)",
"content": "
在 Web 开发与运维中,LAMP(Linux + Apache + MySQL + PHP)是最经典且稳定的技术栈之一。本文基于 CentOS 7.9 系统,带你从环境检查、源码编译到服务联调,完整部署一套生产级 LAMP 环境。无论你是刚入门的开发者,还是希望深入理解底层原理的工程师,这篇文章都能为你提供清晰的实操指南。
\n\n1. 环境准备与前期检查
\n在动手安装之前,务必确认系统的防火墙、SELinux 状态以及网络配置,避免后续服务启动异常。
\n- \n
- 禁用 SELinux:确保 SELinux 处于关闭状态,否则 Apache 或 MySQL 可能因权限限制无法正常读取文件。 \n
sestatus\n输出结果:
SELinux status: disabled\n![]()
- \n
- 关闭防火墙:验证 firewalld 服务是否已停止,并检查 iptables 规则默认为 ACCEPT。 \n
systemctl status firewalld\n输出结果:
● 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)\n
iptables -vnL\nChain INPUT (policy ACCEPT 36 packets, 2244 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 23 packets, 3108 bytes)
pkts bytes target prot opt in out source destination\n
- \n
- 网络与端口检查:获取 IPv4 地址,并确认 80、443、3306 端口未被占用。若已有相关进程,需先停止并禁用开机自启。 \n
ip -4 a\n输出结果:
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens33: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.2.20/24 brd 192.168.2.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever \n
ss -taulanp | grep -E "80|443|3306"\n输出结果:
tcp ESTAB 0 36 192.168.2.20:22 192.168.2.1:63581 users:(("sshd",pid=8090,fd=3))\n![]()
systemctl stop [服务名]
systemctl disable [服务名]\n- \n
- 系统资源评估:查看 CPU 架构与核心数、内存使用情况(GB/MB)、磁盘空间与挂载点,确保满足编译需求。 \n
lscpu\n
free -g
free -m\n
df -Th\n
- \n
- 创建软件包目录:在 /opt/lamp 下存放所有源码包,并安装基础开发工具链(如 gcc、make 等)。 \n
mkdir -pv /opt/lamp\n
ls -lhrt /opt/lamp\n
yum -y install gcc gcc-c++ make openssl-devel\n
⚠️ 若安装 oniguruma 等特定依赖,需手动下载 RPM 包并执行 rpm -ivh oniguruma-*.rpm。
2. 编译安装 Apache(httpd)
\nApache 是 LAMP 的基石,我们采用源码编译方式以获得最大灵活性。
\n- \n
- 安装依赖:apr(Apache 可移植运行库)和 pcre(正则表达式库)是编译 Apache 的前置条件。 \n
yum -y install apr apr-util apr-util-devel pcre pcre-devel\n- \n
- 解压与配置:进入源码目录,运行 configure 脚本,指定安装路径、启用模块(如 rewrite、ssl)和 MPM 模式。 \n
cd /opt/lamp
tar xvfz httpd-2.4.28.tar.gz -C /usr/src/\ncd /usr/src/httpd-2.4.28/\n./configure --prefix=/usr/local/apache2 \
--enable-so \
--enable-rewrite \
--enable-ssl \
--with-ssl=/usr/local/ssl \
--with-mpm=prefork ; echo $?\n- \n
- 编译安装:使用
-j $(nproc)并行编译加快速度,并通过echo $?验证安装结果。 \n
make -j $(nproc) && make install ; echo $?\n- \n
- 验证:检查
/usr/local/apache2目录下的文件结构,确认 Apache 已正确安装。 \n
/usr/local/apache2/bin/apachectl -v\n
接着安装 OpenSSL,为 HTTPS 通信提供支持。解压后配置 shared 选项生成动态链接库,编译并验证。
\ncd /opt/lamp
tar xvfz openssl-1.0.2m.tar.gz -C /usr/src/\ncd /usr/src/openssl-1.0.2m/\n./config --prefix=/usr/local/ssl --shared ; echo $?\nmake && make install ; echo $?\nll /usr/local/ssl/
ll /usr/local/ssl/bin/
ll /usr/local/ssl/lib/\n
3. 配置 Apache 为系统服务
\n为了便于管理,将 Apache 的控制脚本注册为 systemd 服务,实现开机自启与快捷启停。
\n- \n
- 复制脚本到 /etc/init.d/httpd,并添加必要的注释(运行级别、启动顺序等)。 \n
cp -av /usr/local/apache2/bin/apachectl /etc/init.d/httpd\n![]()
vim /etc/init.d/httpd\n#!/bin/sh
#chkconfig:35 85 21
#description:apache!\n
- \n
- 使用 chkconfig 添加服务,检查自启动状态,然后启动 httpd 服务。 \n
chkconfig --add httpd\n![]()
chkconfig --list httpd\n
systemctl start httpd.service\n![]()
✅ Apache 编译安装后的关键路径如下:
# 安装目录
/usr/local/apache2/
# 配置文件路径
/usr/local/apache2/conf/httpd.conf
# 启动命令路径
/usr/local/apache2/bin/apachectl
# 默认网站根目录
/usr/local/apache2/htdocs\n\n4. 二进制安装 MySQL 5.7
\nMySQL 采用二进制包安装,省去编译时间,适合生产环境快速部署。
\n- \n
- 解压二进制包到 /usr/src,然后移动至 /usr/local/mysql。 \n
cd /opt/lamp\ntar xvfz mysql-5.7.32-el7-x86_64.tar.gz -C /usr/src/\n![]()
ll /usr/src/
ll /usr/src/mysql-5.7.32-el7-x86_64/\nmv -v /usr/src/mysql-5.7.32-el7-x86_64/ /usr/local/mysql\n
- \n
- 创建数据目录(/data/mysql),添加 mysql 用户并授权。 \n
mkdir -pv /data/mysql\nuseradd -r -s /sbin/nologin -d /usr/local/mysql/ mysql\n![]()
id mysql
grep mysql /etc/passwd\n
chown -R mysql:mysql /usr/local/mysql
chown -R mysql. /data/mysql\n
ll -d /data/mysql/\n
- \n
- 初始化数据库:进入 /usr/local/mysql 目录,执行初始化命令并记录临时密码。 \n
cd /usr/local/mysql/\n./bin/mysqld --initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/data/mysql; echo $?\n[root@localhost mysql]# ./bin/mysqld --initialize \
> --user=mysql \
> --basedir=/usr/local/mysql \
> --datadir=/data/mysql; echo $?
2026-05-20T02:14:33.870075Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2026-05-20T02:14:34.083565Z 0 [Warning] InnoDB: New log files created, LSN=45790
2026-05-20T02:14:34.144525Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2026-05-20T02:14:34.179393Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: a4c4fff5-53f1-11f1-b1a1-000c29576985.
2026-05-20T02:14:34.180982Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2026-05-20T02:14:34.670572Z 0 [Warning] CA certificate ca.pem is self signed.
2026-05-20T02:14:34.752076Z 1 [Note] A temporary password is generated for root@localhost: gwsysh)hQ0++ # MySQL初始密码为gwsysh)hQ0++
0\n
- \n
- 配置 my.cnf:将配置文件复制到 /etc,并编辑 /etc/my.cnf 添加 basedir 和 datadir 参数。 \n
\cp -av /opt/lamp/my.cnf /etc/\ncd /usr/local/mysql/support-files/
cp -av mysql.server /etc/init.d/mysql\n
vim /etc/rc.d/init.d/mysql\n46 basedir=/usr/local/mysql
47 datadir=/data/mysql\n
chmod 755 /etc/init.d/mysql # 赋予启动脚本执行权限
chkconfig --add mysql # 将 MySQL 服务添加到系统服务管理列表中
chkconfig --level 345 mysql on # 设置 MySQL 在指定的运行级别下开机自动启动
systemctl start mysql # 启动MySQL\n
- \n
- 修改密码:使用临时密码登录,执行 ALTER USER 语句重置密码。 \n
/usr/local/mysql/bin/mysql -uroot -p'临时密码'\n
set password=password('root'); --把当前登录用户的密码,修改为 root
flush privileges; --强制让 MySQL 重新加载权限表\n

/usr/local/mysql/bin/mysql -uroot -proot\n⚠️ 若初始化时报错 缺失,需安装 libaio 依赖。启动失败时请查看错误日志。libaio.so.1
5. 编译安装 PHP 与集成配置
\nPHP 是 LAMP 中处理动态脚本的核心。我们同样采用源码编译,并集成 Apache 与 MySQL 支持。
\n- \n
- 安装依赖:使用 yum 安装基础依赖,再手动安装 oniguruma 等特殊包。 \n
yum install -y systemd-devel libxml2-devel sqlite-devel libcurl-devel libpng-devel\n
cd /opt/lamp\nrpm -ivh oniguruma-6.8.2-1.el7.x86_64.rpm
rpm -ivh oniguruma-devel-6.8.2-1.el7.x86_64.rpm\n
- \n
- 配置环境变量:创建 pkgconfig 目录,并编辑 profile 文件添加 PHP 相关路径。 \n
mkdir -pv /usr/local/lib/pkgconfig/ # pkgconfig文件夹需要手动创
ln -sv /usr/local/ssl/lib/pkgconfig/*.pc /usr/local/lib/pkgconfig/ # 创建OPENSSL链接\n
vim ~/.bash_profile\nPKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH\n
source ~/.bash_profile # 编辑添加后,让其立即生效
pkg-config --list-all # 查看 库、模块 管理列表\n![]()

- \n
- 编译 PHP:下载 bzip2 解压工具,解压 PHP 源码,配置编译选项(如 --with-apxs2、--with-mysqli),然后编译安装。 \n
yum -y install bzip2\n
tar xvfj php-7.4.16.tar.bz2 -C /usr/src/\n![]()
cd /usr/src/php-7.4.16/\n./configure --prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-mysqlnd \
--with-pdo-mysql \
--with-mysqli \
--with-openssl-dir=/usr/local/ssl \
--with-openssl \
--enable-gd \
--with-zlib-dir \
--with-curl \
--with-pear \
--enable-inline-optimization \
--enable-soap \
--enable-sockets \
--enable-mbstring \
--enable-fpm \
--with-fpm-user=mysql \
--with-fpm-group=mysql \
--with-fpm-systemd \
--with-apxs2=/usr/local/apache2/bin/apxs ; echo $?\n![]()
time make -j `nproc` && make install ; echo $?\n
- \n
- 创建测试页面:在 Apache 文档根目录创建 index.php 和 info.php,验证 PHP 是否正常工作。 \n
cat > /usr/local/apache2/htdocs/index.php<<'EOF'
EOF
cat /usr/local/apache2/htdocs/index.php\n

cat > /usr/local/apache2/htdocs/info.php<<'EOF'
EOF
cat /usr/local/apache2/htdocs/info.php\n

- \n
- 集成 Apache 与 PHP:复制 php.ini 配置文件,编辑 httpd.conf 添加 PHP 处理模块,并设置 index.php 为默认首页。 \n
cd /usr/src/php-7.4.16/
cp -av php.ini-production /usr/local/php/etc/php.ini\n
vim /usr/local/apache2/conf/httpd.conf\nAddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps\n
vim /usr/local/apache2/conf/httpd.conf\n
DirectoryIndex index.html index.php
\n
ServerRoot "/usr/local/apache2"
Listen 80
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule php7_module modules/libphp7.so
User daemon
Group daemon
ServerAdmin you@example.com
AllowOverride none
Require all denied
DocumentRoot "/usr/local/apache2/htdocs"
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
DirectoryIndex index.html index.php
Require all denied
ErrorLog "logs/error_log"
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
CustomLog "logs/access_log" common
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
AllowOverride None
Options None
Require all granted
RequestHeader unset Proxy early
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Include conf/extra/proxy-html.conf
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
\n

- \n
- 重启 Apache 并测试数据库连接:创建 test.php 文件,使用 mysqli 连接 MySQL,若输出“Congratulations!”则表示集成成功。 \n
systemctl stop httpd.service
systemctl start httpd.service
systemctl restart httpd.service\n访问192.168.2.20/index.php
访问192.168.2.20/info.php\n
vim /usr/local/apache2/htdocs/linkdb.php\n\n
systemctl restart httpd.service\n
[AFFILIATE_SLOT_1]
\n\n6. 安装 phpMyAdmin 与 OpenSSL 扩展
\nphpMyAdmin 是管理 MySQL 的常用 Web 工具,安装它需要 PHP 的 OpenSSL 扩展支持。
\n- \n
- 下载部署:解压 phpMyAdmin 包到 Apache 网站目录,并重命名。 \n
yum -y install unzip\n
cd /opt/lamp\nunzip phpMyAdmin-5.1.0-all-languages.zip
mv -v phpMyAdmin-5.1.0-all-languages /usr/local/apache2/htdocs/phpMyAdmin\n
ls -lhrt /usr/local/apache2/htdocs/phpMyAdmin\n
- \n
- 编译 OpenSSL 扩展:进入 PHP 源码的 openssl 目录,使用 phpize 生成配置并编译安装。 \n
yum -y install autoconf\ncd /usr/src/php-7.4.16/ext/openssl/
mv -v config0.m4 config.m4\n
/usr/local/php/bin/phpize; echo $?\n
./configure --with-openssl \
--with-php-config=/usr/local/php/bin/php-config ; echo $?\n
make -j `nproc` && make install ; echo $?\n
ls -lhrt /usr/local/php/lib/php/extensions/no-debug-non-zts-20190902/\n
- \n
- 配置 PHP 加载扩展:编辑 php.ini 添加
extension=openssl.so,然后重启 Apache 使配置生效。 \n
vim /usr/local/php/etc/php.ini\nextension=openssl.so</
浙公网安备 33010602011771号