如何搭建 PHP 开发环境(Apache+PHP+MySQL)配置安装教程
PHP 开发环境的安装包括 Apache、MySQL 及 PHP,这是一台可以托管 PHP 网站服务器的基本配置。后续卡拉云教程还会为大家讲解构建在 PHP 上面的 MySQL 管理软件 phpMyAdmin 等。都需要首先搭建 PHP 开发环境。
本文是卡拉云系列教程,我们会详细讲解如何在 Ubuntu 服务器上安装 Apache、MySQL 及 PHP。最终实现通过浏览器访问服务器中的 PHP 页面,这个 PHP 页面会把 MySQL 数据库中的数据展示在网页上。
先决条件
在跟随本教程学习前,请准备好一台 Linux 服务器,我们将在这台服务器上,一起完成 PHP 环境搭建及部署网站。
第一步:安装 Apache ,更新防火墙配置
Apache Web 是全球最受欢迎的 Web Server 之一,另一个可与之抗衡的是 Nginx Web Server(点击查看《如何在 Ubuntu 上安装 Nginx 服务 – 实现多站点、多域名托管》)。本教程将手把手带领大家安装 Apache
登录你的 Linux 服务器,更新 apt
列表
sudo apt update
然后执行安装 apache 命令开始安装。
sudo apt install apache2
系统会询问你是否安装,选择 Y
,然后回车确认开始安装 Apache
安装完成后,调整服务器防火墙,允许 HTTP 访问。我们先看看 ufw 有哪些配置文件:
sudo ufw app list
你会看到这样的输出:
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH
以下是每个配置文件的含义:
- Apache:这个配置文件仅打开 80 端口。
- Apache Full:这个配置文件打开 80 端口和 443 端口(TLS/SSL)。
- Apache Secure:这个配置文件仅打开 443 端口(TLS/SSL)。
为了教程简便,我们先打开 80 端口,允许服务器与外界通过 HTTP 协议通讯:
sudo ufw allow in "Apache"
我们来看一下防火墙的状态
sudo ufw status
如果状态显示为:inactive
,说明防火墙的规则并没有启用,可用以下代码启用:
sudo ufw enable
这时,你已经可以通过你的浏览器对你的服务器进行访问了。
http://your_server_ip
下图为 Ubuntu Apache 默认页面,如果你的服务器可以正常访问,可以看到这个画面。
看到此画面说明 Apache 及服务器防火墙都设置正确了。本教程案例在虚拟机上的 Ubuntu 20.04 上搭建,所以浏览器中的地址为内网 IP 地址。
如何查找服务器的公网 IP 地址
如果你不知道自己服务器的 IP 地址,可通过以下代码找到服务器的公网 IP。
curl http://icanhazip.com
至此,Apache 就安装完成了,接着我们来安装 MySQL 数据库。

连接数据库后需要开发后台系统?
第 2 步:安装 MySQL
上一步我们已经安装并运行了 Web Server ,接着我们来安装 MySQL 数据库,数据库可用来存放网站内的数据。MySQL 是 PHP 开发环境中最常用的数据库。
直接 apt
安装 MySQL
sudo apt install mysql-server
选择 Y
开始安装。
安装完成后,建议您运行 MySQL 预安装的安全脚本。此脚本将删除一些不安全的默认设置并锁定对数据库系统的访问。通过运行以下命令启动交互式脚本:
MySQL 安装完成后,我们来运行内置的安全脚本,开始配置 MySQL:
sudo mysql_secure_installation
安全脚本会询问你一系列关于 MySQL 安全配置的问题:
这里询问我们是否配置VALIDATE PASSWORD PLUGIN
插件。
这个插件是 MySQL 5.6 之后有的,它可用于提高 RDS MySQL 数据库实例的安全性。此插件通过使用数据库实例的数据库参数组中的参数,来实施密码策略。也就是说,会审核你的密码强度是否符合配置中设定的密码强度。
这里选择 Y
继续。
密码强度插件把密码分为 3 个强度等级,如果选择最强,当用户修改或新增用户密码时,设置的弱密码,服务器会报错并不通过密码修改。
这里我设置了「大写字母+小写字母+数字+符号」的密码,密码强度显示为 100
接着我们继续回答安全脚本的问题:
其余问题,都可以选择 Y
,主要是删除匿名用户、测试数据库、禁用远程 root 登录等规则。
完成后,我们就可以登录 MySQL Server 控制台了:
sudo mysql
登录成功后,显示以下内容:
[email protected]:~$ sudo mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.26-0ubuntu0.20.04.2 (Ubuntu)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
好,我们输入 exit
退出 MySQL
exit
特别提示:我们刚刚明明设置的 root 的密码,为什么这里登录 MySQL 没有让我们输入 root 用户的密码呢?这是因为我们正在使用 unix_socket
不是 password
登录方式。在 MySQL 8.0 中,新增了一种插件认证方式caching_sha2_authentication
,这个我们会在本教程后面提到。
第 3 步:安装 PHP
到这里,我们已经安好了 Apache 用于 Web Server ,然后有安装好了 MySQL 用来存储和管理应用的数据。接着,我们来安装 PHP ,它用于处理 PHP 代码,向用户显示动态内容。除了 PHP 之外,我们还要 安装 php-mysql
,它可以让 PHP 与 MySQL 数据库通讯。然后我们还要启用libapache2-mod-php
来处理 PHP 文件。
要安装这些软件包,请运行:
sudo apt install php libapache2-mod-php php-mysql
[email protected]:~$ sudo apt install php libapache2-mod-php php-mysql
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
libapache2-mod-php7.4 php-common php7.4 php7.4-cli php7.4-common php7.4-json php7.4-mysql
php7.4-opcache php7.4-readline
Suggested packages:
php-pear
The following NEW packages will be installed:
libapache2-mod-php libapache2-mod-php7.4 php php-common php-mysql php7.4 php7.4-cli php7.4-common
php7.4-json php7.4-mysql php7.4-opcache php7.4-readline
0 upgraded, 12 newly installed, 0 to remove and 209 not upgraded.
Need to get 4143 kB of archives.
After this operation, 18.5 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
按 Y
开始安装。
安装完成后,我们可以通过以下命令查看 PHP 版本
php -v
[email protected]:~$ php -v
PHP 7.4.3 (cli) (built: Aug 13 2021 05:39:12) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
至此,整个 PHP 开发环境就已经全部配置好了,接着我们来搭建一个简单的网站,让网页调取数据库中的数据,通过 Apache 显示在浏览器中。
第 4 步 – 为你的网站创建虚拟主机
使用 Apache Web Server 时,我们可以创建虚拟主机(类似于 Nginx 中的服务器块)来在单个服务器中托管多个域。在本教程中,我们使用 kalacloud.com
作为范例,你可以将下文中所有kalacloud.com
改为你自己的域名。
Ubuntu 上的 Apache 默认启用了一个服务器块,目录指向/var/www/html
,这个默认配置适合单站点,如果要在服务器上托管多站点,多域名的话,可以按以下配置进行设置。
为kalacloud.com
域名创建目录,多站点托管,可以每个网站建一个对应的目录:
sudo mkdir /var/www/kalacloud.com
接下来,使用$USER
环境变量分配目录的所有权:
sudo chown -R $USER:$USER /var/www/kalacloud.com
然后,使用编辑器,在这里为刚刚我们新建的目录配置一个配置文件“
sudo nano /etc/apache2/sites-available/kalacloud.com.conf
然后,复制粘贴以下配置,这个块的配置与默认块的配置相似,但针对我们的新目录和域名进行了更新:
<VirtualHost *:8**0**>
ServerName kalacloud.com
ServerAlias www.kalacloud.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/kalacloud.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
CTRL+X
保存退出编辑器。
VirtualHost
配置文件告诉 Apache Server 我们使用[kalacloud.com](/)
作为 Web 的根目录,如果你暂时不想将域名指向服务器,可以先按照教程的文档写,后续也可以用服务器 IP 进行访问。
现在我们可以使用a2ensite
来启用新的虚拟主机:
sudo a2ensite kalacloud.com
[email protected]:~$ sudo a2ensite kalacloud.com
Enabling site kalacloud.com.
To activate the new configuration, you need to run:
systemctl reload apache2
[email protected]:~$
使用 a2dissite
禁用 Apache 的默认网站:
sudo a2dissite 000-default
[email protected]:~$ sudo a2dissite 000-default
Site 000-default disabled.
To activate the new configuration, you need to run:
systemctl reload apache2
[email protected]:~$
要确保我们刚刚填写的配置文件不包含语法错误:
sudo apache2ctl configtest
[email protected]:~$ sudo apache2ctl configtest
Syntax OK
最后,重新加载 Apache 以使这些更改生效:
sudo systemctl reload apache2
我们的刚刚配置的新网站已经激活,但网站根目录还没有东西,我们要在这个这里创建一个可访问的网页,以便我们可以测试我们刚刚配置的虚拟主机是否可用:
sudo nano /var/www/kalacloud.com/index.html
在此文件中包含以下内容:
<html>
<head>
<title>KalaCloud.com</title>
</head>
<body>
<h2>Welcom to kalacloud.com!</h2>
<p><strong><a href="https://kalacloud.com/?utm_source=cool">kalacloud</a></strong> is so cool. </p>
</body>
</html>
现在我们可以通过指向服务器的域名或这服务器自己的 IP 地址进行访问
http://server_domain_or_IP/index.html
你会看到一个这样的页面:
如果你看到此页面,则表示你的 Apache 虚拟主机已经正确配置并已经启用。
Apache DirectoryIndex
的设置
在 Apache 中 DirectoryIndex
用于配置根目录下优先访问哪个文件的设置。我们可以根据自己的需求,对它进行调整。默认情况下 *.html
优先于 *.php
的文件先被访问。当根目录下没有*.html
再访问 *.php
文件。
接下来,我们来一起修改,让 *.php
优先于 *.html
首先访问。
编辑/etc/apache2/mods-enabled/dir.conf
文件,在DirectoryIndex
里,将index.php
提前到 index.html
之前。
sudo nano /etc/apache2/mods-enabled/dir.conf
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
保存并关闭文件后,您需要重新加载 Apache 以使更改生效:
sudo systemctl reload apache2
在下一步中,我们将创建一个 PHP 脚本,测试 PHP 是否在你的服务器上正确安装和配置。
第 5 步:在 Web 服务器上测试 PHP
我们在上一步自定义了托管网站的根目录,现在我们在这个根目录里创建一个 PHP 文件:
sudo nano /var/www/kalacloud.com/info.php
在这个空白文件中添加以下文本:
**<?php** phpinfo();
保存并关闭文件。
接下来,我们使用浏览器打开这个 info.php
文件:
http://server_domain_or_IP/info.php
你会看到一个类似这样的页面:
这个页面是关于你服务器的关键信息,这些信息对前期调试服务器很有帮助。如果你可以在浏览器中看到此页面,那么说明 PHP 已经正常运行。
好,现在我们要把这个文件删掉,这些信息非常敏感,我们不能把这个页面放在服务器上,这会造成严重的安全隐患,使用 rm
命令删除这个文件:
sudo rm /var/www/kalacloud.com/info.php
第 6 步:搭建一个可以访问数据库的 PHP 页面
接着我们一起来搭建一个可以直接访问数据库的 PHP 页面,这个页面可调用数据库中的数据,再将这些数据显示在浏览器中的网页里。
在本示例中,我们先创建一个数据库kalacloud_database
,再创建一个用户名 kalacloud
。
你可以根据自己的需求,修改这两个名字。
首先,使用 root 帐户连接到 MySQL 控制台:
sudo mysql
在 mysql> 下,创建数据库:
CREATE DATABASE kalacloud_database;
返回值:
mysql> CREATE DATABASE kalacloud_database;
Query OK, 1 row affected (0.02 sec)
mysql>
接着,我们创建一个新用户,然后授权数据库权限给它。
我们创建一个 kalacloud
用户,然后使用mysql_native_password
作为它的验证方式,给它设置一个密码。还记得本教程最开始,你初始化 MySQL 数据库时,选择的密码强度选项吗?我们需要给这个用户名一个强密码:
CREATE USER 'kalacloud'@'%' IDENTIFIED WITH mysql_native_password BY '6Ysce*j7';
现在我们需要授予此用户对kalacloud_database
数据库的权限:
GRANT ALL ON kalacloud_database.* TO 'kalacloud'@'%';
我们只赋予kalacloud
用户对kalacloud_database
数据库的完全权限,它不能访问数据库中的其他库,以保证数据库安全。
mysql> CREATE USER 'kalacloud'@'%' IDENTIFIED WITH mysql_native_password BY '6Ysce*j7';
Query OK, 0 rows affected (0.04 sec)
mysql> GRANT ALL ON kalacloud_database.* TO 'kalacloud'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql>
现在退出 MySQL:
exit
你可以通过再次登录 MySQL 来测试新用户是否具有适当的权限:
mysql -u kalacloud -p
-p
是要求使用密码登录。我们可以输入刚刚创建kalacloud
时,你设置的密码。
SHOW DATABASES;
确认kalacloud
确实可以访问kalacloud_database
数据库:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| kalacloud_database |
+--------------------+
2 rows in set (0.02 sec)
接下来,我们将创建一个名为 todo_list 的测试表:
CREATE TABLE kalacloud_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);
返回值:
mysql> CREATE TABLE kalacloud_database.todo_list (
-> item_id INT AUTO_INCREMENT,
-> content VARCHAR(255),
-> PRIMARY KEY(item_id)
-> );
Query OK, 0 rows affected (0.03 sec)
在测试表中插入几行内容。一会我们要通过 PHP 调用这些数据展示在网页上:
INSERT INTO
kalacloud_database.todo_list (content)
VALUES
("Visit the Kalacloud.com WebSite"),
("Learn to use kalacloud"),
("Build internal tools with kalacloud"),
("and this one more thing");
确认数据已成功保存到表中:
SELECT * FROM kalacloud_database.todo_list;
返回值:
确认测试数据已经存入表中,然后我们退出 MySQL:
exit
现在,我们来创建一个 PHP 文件,用于把数据库中的数据展示在网页上:
sudo nano /var/www/kalacloud.com/todo_list.php
以下 PHP 脚本连接到 MySQL 数据库并查询 todo_list 表中的代码。如果数据库连接有问题,就会返回异常。一般都是密码写错了,请大家仔细检查。
将以下内容复制到todo_list.php
文件中:
**<?php** $user = "kalacloud";
$password = "6Ysce*j7";
$database = "kalacloud_database";
$table = "todo_list";
try {
$db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
echo "<h2>TODO</h2><ol>";
foreach($db->query("SELECT content FROM $table") as $row) {
echo "<li>" . $row['content'] . "</li>";
}
echo "</ol>";
} catch (PDOException $e) {
print "Error!: " . $e->getMessage() . "<br/>";
die();
}
保存退出 nano
编辑器。
您现在可以通过访问为您的网站配置的域名或公共 IP 地址,然后在您的 Web 浏览器中访问此页面:
现在,我们在浏览器中访问服务器 IP 或域名,后面加上/todo_list.php
地址:
http://your_domain_or_IP/todo_list.php
你应该会看到一个这样的页面,内容是刚刚我们添加到数据库中的数据:
如果你看到上面的内容,说明我们 PHP 已经顺利读取数据库中的内容。
总结
至此,我们已经完成在 Linux 上配置 PHP 开发环境的工作,已经顺利运行起 Apache、MySQL、PHP 三个组建。在这套环境中,我们已经可进行 PHP 的基础开发工作。也欢迎大家跟随卡拉云教程继续学习。