介绍
LAMP架构是一组开源软件,通常一起安装,用于使服务器能够托管用PHP编写的动态网站和Web应用程序。LAMP代表Linux操作系统和Apache Web服务器。网站数据存储在MySQL数据库中,动态内容由PHP处理。.
本指南将指导您在 Ubuntu 22.04 服务器上搭建 LAMP 环境。这些步骤同样适用于 Ubuntu 18.04 及更高版本。.
先决条件
要完成本教程,您需要一台运行 Ubuntu 的服务器,一个具有 sudo 权限的非 root 用户,以及一个已启用的防火墙。有关如何设置这些的说明,请从列表中选择您的发行版,并按照我们的初始服务器安装指南进行操作。.
步骤 1 – 安装 Apache 并更新防火墙
Apache Web 服务器是世界上最流行的 Web 服务器之一。它拥有完善的文档、活跃的用户社区,并且在 Web 发展的大部分历史时期都被广泛使用,使其成为网站托管的绝佳选择。.
首先更新软件包管理器缓存。如果这是您首次在本次会话中使用 sudo,系统会提示您输入用户密码,以验证您拥有使用 apt 管理系统软件包的相应权限:
sudo apt update然后使用以下命令启动 Apache:
sudo apt install apache2系统会要求您确认安装 Apache。请按 Y 键确认,然后按回车键。.
安装完成后,您需要配置防火墙设置以允许 HTTP 流量。Ubuntu 的默认防火墙配置工具名为 Uncomplicated Firewall (UFW)。它提供了多种应用程序配置文件供您使用。要列出所有可用的 UFW 应用程序配置文件,请运行以下命令:
sudo ufw app listOutput
Available applications:
Apache
Apache Full
Apache Secure
OpenSSH以下是这些类别分别的含义:
- Apache:此配置文件仅打开端口 80(普通、未加密的 Web 流量)。.
- Apache Full:此配置文件同时打开端口 80(普通、未加密的 Web 流量)和端口 443(TLS/SSL 加密流量)。.
- Apache Secure:此配置文件仅打开端口 443(TLS/SSL 加密流量)。.
目前最好只允许端口 80 上的连接,因为这是一个新的 Apache 安装,您还没有配置 TLS/SSL 证书来允许服务器上的 HTTPS 流量。.
要仅允许端口 80 上的流量,请使用 Apache 配置:
sudo ufw allow in "Apache"确认更改:
sudo ufw statusOutput
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache (v6) ALLOW Anywhere (v6)现在允许端口 80 上的流量通过防火墙。.
您可以立即快速检查一切是否按计划进行,方法是在 Web 浏览器中访问服务器的公共 IP 地址(如果您没有此信息,请参阅下一标题下方的注释以查找您的公共 IP 地址。此前,已说明过):
http://your_server_ipUbuntu 的默认 Apache 网页仅用于信息参考和测试目的。以下是 Ubuntu 22.04 的默认 Apache 网页示例:
如果您能看到此页面,则说明您的网络服务器已正确安装并通过防火墙访问。.
如何查找服务器的公网 IP 地址
如果您不知道服务器的公网 IP 地址,可以通过几种方法找到它。通常,这就是您通过 SSH 连接到服务器时使用的地址。.
有几种不同的方法可以通过命令行完成此操作。首先,您可以使用 iproute2 工具通过输入以下命令来获取您的 IP 地址:
ip addr show ens3 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'这将返回两到三行信息。它们都是有效的地址,但您的计算机可能只能使用其中一个,所以请逐一尝试。.
另一种方法是使用 curl 工具联系外部服务器,告诉它它如何看待你的服务器。具体做法是向特定服务器查询你的 IP 地址:
curl http://icanhazip.com无论你选择哪种方法,请在浏览器中输入你的 IP 地址,以检查你的服务器是否正在运行。.
步骤 2 – 安装 MySQL
现在您已经拥有了网站服务器,接下来需要安装数据库系统,以便存储和管理网站数据。MySQL 是 PHP 环境中常用的数据库管理系统。.
再次使用 apt 命令获取并安装此软件:
sudo apt install mysql-server出现提示时,输入 Y 确认安装,然后 进入 确认。.
安装完成后,建议运行 MySQL 自带的安全脚本。该脚本会移除一些不安全的默认设置,并加强对数据库系统的访问。.
运行以下命令启动交互式脚本:
sudo mysql_secure_installation这个问题问你是否愿意 验证密码插件 配置。.
要继续而不激活,请回答 Y、是或任何其他内容。.
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No:如果您回答«是»,系统会要求您选择密码验证级别。请注意,如果您选择最高级别 2,则在尝试设置不包含数字、大小写字母和特殊字符的密码时,系统会报错。
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1无论您是否选择启用“验证密码插件”,服务器接下来都会要求您为 MySQL root 用户选择并确认密码。请注意,这与系统 root 用户不同。数据库 root 用户是拥有数据库系统完整权限的管理用户。尽管 MySQL root 用户的默认身份验证方法不涉及密码,但即使设置了密码,您也应该在此处定义一个强密码,作为额外的安全措施。.
如果您启用了密码验证,系统会显示您刚刚输入的根密码的强度,并询问您是否要继续使用该密码。如果您对当前密码满意,请在提示符处输入“Y”表示“是”。
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y对于其余问题,请按 Y 键,并在每个提示符处按 Enter 键。这将删除一些匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便 MySQL 立即应用您所做的更改。.
完成后,请输入以下命令测试是否可以登录 MySQL 控制台:
sudo mysql此命令会以数据库管理员用户 root 的身份连接到 MySQL 服务器,这是通过运行此命令时使用 sudo 参数推断出来的。以下是一个示例输出:
Output
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)
Copyright (c) 2000, 2022, 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>要退出 MySQL 控制台,请键入:
exit请注意,即使您在运行 `mysql_secure_installation` 脚本时设置了密码,也不需要提供密码即可以 root 用户身份连接。这是因为 MySQL 管理员用户的默认身份验证方法是 `unix_socket` 而不是密码。虽然这看似存在安全隐患,但实际上却能提高数据库服务器的安全性,因为只有拥有 `sudo` 权限的系统用户才能以 MySQL root 用户身份登录,并且他们必须通过控制台或以相同权限运行的程序进行连接。实际上,这意味着您无法使用数据库管理员 root 用户从 PHP 应用程序进行连接。为 MySQL root 帐户设置密码可以作为一种安全措施,以防默认身份验证方法从 `unix_socket` 更改为密码。.
为了提高安全性,最好为每个数据库设置权限较小的专用用户帐户,尤其是在计划在服务器上托管多个数据库的情况下。.
您的 MySQL 服务器现已安装并完成安全设置。接下来,您将安装 PHP,这是 LAMP 架构中的最后一个组件。.
步骤 3 – 安装 PHP
您已安装 Apache 用于提供内容服务,并安装了 MySQL 用于存储和管理数据。PHP 是我们设置的一部分,它负责处理代码,以便向最终用户显示动态内容。除了 php 包之外,您还需要 php-mysql,这是一个 PHP 模块,它允许 PHP 与基于 MySQL 的数据库进行通信。您还需要 libapache2-mod-php 来使 Apache 能够处理 PHP 文件。核心 PHP 包作为依赖项会自动安装。.
要安装这些软件包,请运行以下命令:
sudo apt install php libapache2-mod-php php-mysql安装完成后,运行以下命令来验证您的 PHP 版本:
php -vOutput
PHP 8.1.2 (cli) (built: Mar 4 2022 18:13:46) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.2, Copyright (c) Zend Technologies
with Zend OPcache v8.1.2, Copyright (c), by Zend Technologies更改 Apache 目录(可选)
在某些情况下,您可能需要更改 Apache 在请求目录时提供文件的方式。目前,如果用户向服务器请求目录,Apache 首先会查找名为 index.html 的文件。我们希望指示 Web 服务器优先处理 PHP 文件,以便 Apache 首先查找 index.php 文件。如果不这样做,位于应用程序文档根目录下的 index.html 文件将始终优先于 index.php 文件。.
要进行此更改,请使用您选择的文本编辑器打开 dir.conf 配置文件。这里,我们将使用 nano 编辑器:
sudo nano /etc/apache2/mods-enabled/dir.conf
它看起来会是这样的:
<IfModule mod_dir.c>
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm
</IfModule>将 PHP 索引文件(如上所述)移动到 DirectoryIndex 规范之后的第一个位置,如下所示:
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>完成后,按 CTRL+X 保存并关闭文件。输入 Y 确认保存,然后按 ENTER 键确认文件保存位置。.
之后,重启 Apache Web 服务器以使更改生效。您可以使用以下命令执行此操作:
sudo systemctl restart apache2您还可以使用 systemctl 检查 apache2 服务的状态:
sudo systemctl status apache2Sample Output
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Drop-In: /lib/systemd/system/apache2.service.d
└─apache2-systemd.conf
Active: active (running) since Thu 2021-07-15 09:22:59 UTC; 1h 3min ago
Main PID: 3719 (apache2)
Tasks: 55 (limit: 2361)
CGroup: /system.slice/apache2.service
├─3719 /usr/sbin/apache2 -k start
├─3721 /usr/sbin/apache2 -k start
└─3722 /usr/sbin/apache2 -k start
Jul 15 09:22:59 ubuntu1804 systemd[1]: Starting The Apache HTTP Server...
Jul 15 09:22:59 ubuntu1804 apachectl[3694]: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' di
Jul 15 09:22:59 ubuntu1804 systemd[1]: Started The Apache HTTP Server.为了摆脱这种困境, 问 按 。.
安装 PHP 扩展(可选)
要扩展 PHP 的功能,您可以安装一些额外的模块。要查看可用的 PHP 模块和库,请将 apt 搜索结果输入到 less 中,less 是一个分页工具,可以让您滚动浏览其他命令的输出:
apt search php- | less使用方向键上下移动,按 Q 键退出。.
结果列出了所有可选组件,并附有每个组件的简要说明:
bandwidthd-pgsql/bionic 2.0.1+cvs20090917-10ubuntu1 amd64
Tracks usage of TCP/IP and builds html files with graphs
bluefish/bionic 2.2.10-1 amd64
advanced Gtk+ text editor for web and software development
cacti/bionic 1.1.38+ds1-1 all
web interface for graphing of monitoring systems
ganglia-webfrontend/bionic 3.6.1-3 all
cluster monitoring toolkit - web front-end
golang-github-unknwon-cae-dev/bionic 0.0~git20160715.0.c6aac99-4 all
PHP-like Compression and Archive Extensions in Go
haserl/bionic 0.9.35-2 amd64
CGI scripting program for embedded environments
kdevelop-php-docs/bionic 5.2.1-1ubuntu2 all
transitional package for kdevelop-php
kdevelop-php-docs-l10n/bionic 5.2.1-1ubuntu2 all
transitional package for kdevelop-php-l10n
…要了解每个模块的具体功能,您可以上网搜索相关信息。此外,您还可以通过输入以下命令查看详细的软件包描述:
apt show package_name将会有大量输出,其中有一个名为“描述”的字段,用于进一步解释模块的功能。.
例如,要了解 php-cli 模块的功能,您可以输入以下命令:
apt show php-cli除了其他大量信息外,您还会发现类似这样的内容:
Output
…
Description: command-line interpreter for the PHP scripting language (default)
This package provides the /usr/bin/php command interpreter, useful for
testing PHP scripts from a shell or performing general shell scripting tasks.
.
PHP (recursive acronym for PHP: Hypertext Preprocessor) is a widely-used
open source general-purpose scripting language that is especially suited
for web development and can be embedded into HTML.
.
This package is a dependency package, which depends on Ubuntu's default
PHP version (currently 7.2).
…如果经过研究后,你决定要安装某个软件包,你可以使用 apt install 命令来安装,就像安装其他任何软件一样。.
如果您确定需要使用 php-cli,可以输入:
sudo apt install php-cli如果要安装多个模块,可以列出每个模块,模块之间用空格分隔,然后执行 apt install 命令,如下所示:
sudo apt install package1 package2 ...至此,您的 LAMP 环境已安装并配置完毕。在进行任何其他操作之前,我们建议您设置一个 Apache 虚拟主机,以便存储您的服务器配置信息。.
至此,您的 LAMP 堆栈已完全运行,但在使用 PHP 脚本测试您的设置之前,最好设置一个合适的 Apache 虚拟主机来存放您的网站文件和文件夹。.
第四步 – 为您的网站创建虚拟主机
使用 Apache Web 服务器时,您可以创建虚拟主机(类似于 Nginx 中的服务器块)来封装配置细节,并从单个服务器托管多个域名。在本指南中,我们将设置一个名为 your_domain 的域名,但您应该将其替换为您自己的域名。.
Ubuntu 上的 Apache 默认启用了一个虚拟主机,该虚拟主机配置为从 `/var/www/html` 目录提供文档。虽然这对于单个站点来说运行良好,但如果您托管多个站点,则会变得很麻烦。我们不修改 `/var/www/html`,而是在 `/var/www` 中为您的域名站点创建一个目录结构,并将 `/var/www/html` 保留为默认目录,除非客户端请求。匹配任何其他站点
按如下方式创建 your_domain 目录:
sudo mkdir /var/www/your_domain接下来,使用环境变量 $USER 指定目录的所有权,该变量将指向系统上的当前用户:
sudo chown -R $USER:$USER /var/www/your_domain接下来,使用您喜欢的命令行编辑器在 Apache sites-available 目录中打开一个新的配置文件。这里,我们将使用 nano 编辑器:
sudo nano /etc/apache2/sites-available/your_domain.conf这将创建一个新的空文件。添加以下基本配置,并填入您的域名:
<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
ServerAdmin webmaster@localhost
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>完成后,保存并关闭文件。如果您使用的是 nano 编辑器,请按 CTRL+X,然后按 Y,最后按 ENTER 键。.
通过此 VirtualHost 配置,我们告诉 Apache 使用 /var/www/your_domain 作为网站根目录来提供 your_domain 的服务。如果您想在不使用域名的情况下测试 Apache,可以通过在每个选项行的开头添加井号 (#) 来删除或注释掉 ServerName 和 ServerAlias 选项。.
现在,使用 a2ensite 激活新的虚拟主机:
sudo a2ensite your_domain您可能需要禁用 Apache 安装的默认网站。如果您未使用自定义域名,则必须执行此操作,因为在这种情况下,Apache 会覆盖您的默认虚拟主机设置。要禁用默认的 Apache 网站,请键入:
sudo a2dissite 000-default
为确保您的配置文件中没有语法错误,请运行以下命令:
sudo apache2ctl configtest最后,重新加载 Apache 服务器以使这些更改生效:
sudo systemctl reload apache2您的新网站现已上线,但网站根目录 /var/www/your_domain 仍然为空。请在该位置创建一个 index.html 文件,以测试虚拟主机是否正常工作:
nano /var/www/your_domain/index.html请将以下内容放入此文件中:
<html>
<head>
<title>your_domain website</title>
</head>
<body>
<h1>Hello World!</h1>
<p>This is the landing page of <strong>your_domain</strong>.</p>
</body>
</html>保存并关闭文件,然后在浏览器中访问服务器的域名或 IP 地址:
http://server_domain_or_IP您的网页应该反映您刚刚编辑的文件的内容:
您可以将此文件保留为应用程序的临时首页,直到您创建 index.php 文件来替换它。创建 index.php 文件后,请记住从文档根目录中删除或重命名 index.html 文件,因为默认情况下 index.html 文件的优先级高于 index.php 文件。.
关于 Apache 中 DirectoryIndex 的说明
在 Apache 的默认 DirectoryIndex 设置下,名为 index.html 的文件始终优先于 index.php 文件。这对于在 PHP 应用程序中设置维护页面非常有用,可以通过创建一个包含访客提示信息的临时 index.html 文件来实现。由于此页面优先于 index.php 页面,因此它会成为应用程序的首页。维护完成后,index.html 文件会被重命名或从文档根目录中删除,从而恢复应用程序的正常页面。.
如果要更改此行为,需要编辑 /etc/apache2/mods-enabled/dir.conf 文件,并在 DirectoryIndex 指令中更改 index.php 文件的索引顺序:
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 测试脚本来验证 Apache 是否能够处理对 PHP 文件的请求。.
在您的自定义网站根文件夹中创建一个名为 info.php 的新文件:
nano /var/www/your_domain/info.php这将打开一个空白文件。请将以下文本(有效的 PHP 代码)添加到该文件中:
<?php
phpinfo();完成后,保存并关闭文件。.
要测试此脚本,请打开您的网络浏览器,访问服务器的域名或 IP 地址,后跟脚本名称,在本例中为 info.php:
http://server_domain_or_IP/info.php以下是一个默认的 PHP 网页示例:
此页面提供关于您的服务器的 PHP 信息。它有助于调试并确保您的设置正确生效。.
如果您在浏览器中看到此页面,则说明您的 PHP 安装运行正常。.
通过该页面查看了有关 PHP 服务器的信息后,最好删除您创建的文件,因为它包含有关您的 PHP 环境和 Ubuntu 服务器的敏感信息。为此,请使用 rm 命令:
sudo rm /var/www/your_domain/info.php如果您需要再次访问这些信息,可以随时重新创建此页面。.
步骤 6 – 从 PHP 测试数据库连接(可选)
如果您想测试 PHP 是否能够连接到 MySQL 并执行数据库查询,可以创建一个包含测试数据的测试表,并从 PHP 脚本查询其内容。在此之前,您需要创建一个测试数据库和一个已正确配置以访问该数据库的 MySQL 用户。.
创建一个名为 example_database 的数据库和一个名为 example_user 的用户。您可以将这些名称替换为其他值。.
首先,使用 root 账户连接到 MySQL 控制台:
sudo mysql要创建新数据库,请在 MySQL 控制台中运行以下命令:
CREATE DATABASE example_database;现在创建一个新用户,并授予该用户对您刚刚创建的自定义数据库的完整权限。.
以下命令创建一个名为 example_user 的新用户,并使用 caching_sha2_password 方法进行身份验证。我们已将此用户的密码定义为 password,但您应该将其替换为您选择的安全密码。.
CREATE USER 'example_user'@'%' IDENTIFIED BY 'password';现在授予该用户对 example_database 数据库的权限:
GRANT ALL ON example_database.* TO 'example_user'@'%';
这将赋予用户 example_user 对数据库 example_database 的完全权限,同时阻止该用户在您的服务器上创建或修改其他数据库。.
现在退出 MySQL shell:
exit请再次登录 MySQL 控制台,这次使用自定义用户凭据,测试新用户是否拥有相应的权限:
mysql -u example_user -p请注意此命令中的 -p 标志,它会要求您选择创建 example_user 用户时使用的密码。登录 MySQL 控制台后,请验证您是否拥有对 example_database 数据库的访问权限:
SHOW DATABASES;这将输出以下结果:
Output
+--------------------+
| Database |
+--------------------+
| example_database |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)然后创建一个名为 todo_list 的测试表。在 MySQL 控制台中,运行以下语句:
CREATE TABLE example_database.todo_list (
item_id INT AUTO_INCREMENT,
content VARCHAR(255),
PRIMARY KEY(item_id)
);向测试表中插入几行数据。使用不同的值重复以下命令几次,以填充测试表:
INSERT INTO example_database.todo_list (content) VALUES ("My first important item");要验证数据是否已成功保存到表中,请运行:
SELECT * FROM example_database.todo_list;输出结果如下:
Output
+---------+--------------------------+
| item_id | content |
+---------+--------------------------+
| 1 | My first important item |
| 2 | My second important item |
| 3 | My third important item |
| 4 | and this one more thing |
+---------+--------------------------+
4 rows in set (0.000 sec)确认测试表中的数据有效后,退出 MySQL 控制台:
exit现在您可以创建连接到 MySQL 并查询内容的 PHP 脚本。使用您喜欢的编辑器,在自定义网站的根目录中创建一个新的 PHP 文件:
nano /var/www/your_domain/todo_list.php以下 PHP 脚本连接到 MySQL 数据库,搜索 todo_list 表的内容,并将结果以列表形式显示。如果数据库连接出现问题,它会抛出异常。.
将此内容添加到您的 todo_list.php 脚本中,请记住将 example_user 替换为您的密码:
<?php
$user = "example_user";
$password = "password";
$database = "example_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();
}编辑完成后,请保存并关闭文件。.
您现在可以通过在浏览器中访问您网站配置的域名或公共 IP 地址,并在其后加上 /todo_list.php 来访问此页面:
http://your_domain_or_IP/todo_list.php此网页应向访问者显示您在测试表格中包含的内容:
这意味着您的 PHP 环境已准备好连接并与 MySQL 服务器进行交互。.
结果
在本指南中,您已经创建了一个灵活的基础,可以使用 Apache 作为 Web 服务器和 MySQL 作为数据库系统,向您的访问者交付 PHP 网站和应用程序。.
下一步,您应该立即确保与 Web 服务器的连接安全,方法是使用 HTTPS 提供服务。为此,您可以在 Ubuntu 22.04 / 20.04 / 18.04 上使用 Let's Encrypt,通过免费的 TLS/SSL 证书保护您的网站。.













