如何在Ubuntu18.04上安装Linux、Apache、MySQL、PHP(LAMP)堆栈

来自菜鸟教程
跳转至:导航、​搜索

介绍

“LAMP”堆栈是一组开源软件,通常安装在一起以使服务器能够托管动态网站和 Web 应用程序。 这个术语实际上是一个首字母缩略词,代表 Linux 操作系统,带有 Apache Web 服务器。 站点数据存储在 MySQL 数据库中,动态内容由 PHP 处理。

在本指南中,我们将在 Ubuntu 18.04 服务器上安装 LAMP 堆栈。

先决条件

为了完成本教程,您需要有一个 Ubuntu 18.04 服务器,该服务器具有非 root sudo 启用的用户帐户和基本的防火墙配置。 要进行设置,您可以按照我们的 Ubuntu 18.04 初始服务器设置指南进行操作。

第 1 步 — 安装 Apache 并更新防火墙

Apache Web 服务器是一种流行的开源 Web 服务器,可以与 PHP 一起使用来托管动态网站。 它有据可查,并且在网络的大部分历史中都被广泛使用。

首先,确保您的 apt 缓存更新为:

sudo apt update

如果这是您第一次在此会话中使用 sudo,系统会提示您提供常规用户的密码以验证您的权限。

更新缓存后,您可以使用以下命令安装 Apache:

sudo apt install apache2

输入此命令后,apt 会告诉您它计划安装哪些软件包以及它们将占用多少额外的磁盘空间。 按 Y 并点击 ENTER 确认,安装将继续。

调整防火墙以允许 Web 流量

接下来,假设您已遵循初始服务器设置说明并启用了 UFW 防火墙,请确保您的防火墙允许 HTTP 和 HTTPS 流量。 您可以检查 UFW 是否具有 Apache 的应用程序配置文件,如下所示:

sudo ufw app list
OutputAvailable applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

如果您查看 Apache Full 配置文件详细信息,您会看到它启用了到端口 80443 的流量:

sudo ufw app info "Apache Full"
OutputProfile: Apache Full
Title: Web Server (HTTP,HTTPS)
Description: Apache v2 is the next generation of the omnipresent Apache web
server.

Ports:
  80,443/tcp

要允许此服务器的传入 HTTP 和 HTTPS 流量,请运行:

sudo ufw allow "Apache Full"

您可以立即进行抽查,通过在 Web 浏览器中访问服务器的公共 IP 地址来验证一切是否按计划进行(如果您没有此信息,请参阅下一个标题下的注释以了解您的公共 IP 地址是什么)已经):

http://your_server_ip

您将看到默认的 Ubuntu 18.04 Apache 网页,该网页用于提供信息和测试目的。 它应该看起来像这样:

如果您看到此页面,则您的 Web 服务器现在已正确安装并可通过防火墙访问。

如何查找服务器的公共 IP 地址

如果您不知道服务器的公共 IP 地址是什么,可以通过多种方式找到它。 通常,这是您用于通过 SSH 连接到服务器的地址。

有几种不同的方法可以从命令行执行此操作。 首先,您可以使用 iproute2 工具通过键入以下内容来获取您的 IP 地址:

ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's/\/.*$//'

这会给你两三行回来。 它们都是正确的地址,但您的计算机可能只能使用其中一个,因此请随意尝试每个。

另一种方法是使用 curl 实用程序联系外部方,告诉您 it 如何查看您的服务器。 这是通过询问特定服务器您的 IP 地址是什么来完成的:

sudo apt install curl
curl http://icanhazip.com

无论您使用哪种方法获取 IP 地址,都可以在 Web 浏览器的地址栏中键入它以查看默认的 Apache 页面。

第 2 步 — 安装 MySQL

现在您的 Web 服务器已启动并运行,是时候安装 MySQL 了。 MySQL 是一个数据库管理系统。 基本上,它将组织并提供对您的站点可以存储信息的数据库的访问。

同样,使用 apt 获取并安装此软件:

sudo apt install mysql-server

注意:在这种情况下,您不必在命令之前运行sudo apt update。 这是因为您最近在上面的命令中运行它来安装 Apache。 您计算机上的软件包索引应该已经是最新的。


该命令也将向您显示将要安装的软件包的列表,以及它们将占用的磁盘空间量。 输入 Y 继续。

安装完成后,运行一个预装 MySQL 的简单安全脚本,该脚本将删除一些危险的默认设置并锁定对数据库系统的访问。 通过运行启动交互式脚本:

sudo mysql_secure_installation

这将询问您是否要配置 VALIDATE PASSWORD PLUGIN

注意: 启用此功能是一种判断。 如果启用,与指定条件不匹配的密码将被 MySQL 拒绝并出现错误。 如果您将弱密码与自动配置 MySQL 用户凭据的软件(例如 phpMyAdmin 的 Ubuntu 软件包)结合使用,这将导致问题。 禁用验证是安全的,但您应该始终为数据库凭据使用强而唯一的密码。


回答 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

无论您是否选择设置 VALIDATE PASSWORD PLUGIN,您的服务器接下来都会要求您选择并确认 MySQL root 用户的密码。 不要与 系统根 混淆。 数据库根 用户是对数据库系统具有完全权限的管理用户。 即使 MySQL root 用户的默认身份验证方法不使用密码,即使设置了,您也应该在此处定义一个强密码作为额外的安全措施。 我们一会儿再谈这个。

如果您启用了密码验证,您将看到您刚刚输入的根密码的密码强度,并且您的服务器会询问您是否要更改该密码。 如果您对当前密码感到满意,请在提示符处输入 N 表示“否”:

Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n

对于其余的问题,请按 Y 并在每个提示处按 ENTER 键。 这将删除一些匿名用户和测试数据库,禁用远程 root 登录,并加载这些新规则,以便 MySQL 立即尊重您所做的更改。

完成后,通过键入以下命令测试您是否能够登录到 MySQL 控制台:

sudo mysql

这将以管理数据库用户 root 的身份连接到 MySQL 服务器,这是通过在运行此命令时使用 sudo 推断出来的。 你应该看到这样的输出:

OutputWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.34-0ubuntu0.18.04.1 (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> 

要退出 MySQL 控制台,请键入:

exit

请注意,即使您在运行 mysql_secure_installation 脚本时定义了密码,您也无需提供以 root 用户身份连接的密码。 这是因为管理 MySQL 用户的默认身份验证方法是 unix_socket 而不是 password。 尽管这起初看起来像是一个安全问题,但它使数据库服务器更加安全,因为唯一允许以 root MySQL 用户身份登录的用户是从控制台连接的具有 sudo 权限的系统用户或通过以相同权限运行的应用程序。 实际上,这意味着您将无法使用管理数据库 root 用户从您的 PHP 应用程序进行连接。 为 root MySQL 帐户设置密码可以起到保护作用,以防默认身份验证方法从 unix_socket 更改为 password

为了提高安全性,最好为每个数据库设置具有较少扩展权限的专用用户帐户,特别是如果您计划在您的服务器上托管多个数据库。 有关如何创建 MySQL 用户和配置数据库访问权限的详细说明,请参阅我们的 如何在 MySQL 上创建新用户和授予权限的指南。

您的 MySQL 服务器现已安装并受到保护。 接下来,我们将安装 PHP,这是 LAMP 堆栈中的最后一个组件。

第 3 步 — 安装 PHP

PHP 是您设置的组件,它将处理代码以显示动态内容。 它可以运行脚本,连接到您的 MySQL 数据库以获取信息,并将处理后的内容交给您的 Web 服务器,以便将结果显示给您的访问者。

再次利用 apt 系统安装 PHP。 除了 php 包之外,您还需要 libapache2-mod-php 将 PHP 集成到 Apache 中,以及 php-mysql 包以允许 PHP 连接到 MySQL 数据库。 运行以下命令来安装所有三个包及其依赖项:

sudo apt install php libapache2-mod-php php-mysql

这应该安装 PHP 没有任何问题。 我们稍后会对此进行测试。

更改 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

它看起来像这样:

/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 规范之后的第一个位置,如下所示:

/etc/apache2/mods-enabled/dir.conf

<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 apache2
Sample 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.

Q 退出此状态输出。

安装 PHP 扩展(可选)

要扩展 PHP 的功能,您可以选择安装一些附加模块。 要查看 PHP 模块和库的可用选项,请将 apt search 的结果通过管道传送到 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

将会有很多输出,其中一个名为 Description 的字段将对模块提供的功能进行更长的解释。

例如,要了解 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 虚拟主机,您可以在其中存储服务器的配置详细信息。

第 4 步 — 设置虚拟主机(推荐)

使用 Apache Web 服务器时,您可以使用 虚拟主机 (类似于 Nginx 中的服务器块)来封装配置细节并从单个服务器托管多个域。 我们将设置一个名为 your_domain 的域,但您应该将 替换为您自己的域名 。 要了解有关使用 DigitalOcean 设置域名的更多信息,请参阅我们的 DigitalOcean DNS 简介

Ubuntu 18.04 上的 Apache 默认启用一个服务器块,配置为从 /var/www/html 目录提供文档。 虽然这适用于单个站点,但如果您托管多个站点,它可能会变得笨拙。 代替修改 /var/www/html,让我们在 /var/www 中为 your_domain 站点创建一个目录结构,将 /var/www/html 保留为默认目录,如果客户端请求不匹配任何其他站点。

your_domain 创建目录,如下所示:

sudo mkdir /var/www/your_domain

接下来,使用 $USER 环境变量分配目录的所有权,该环境变量引用当前登录的用户:

sudo chown -R $USER:$USER /var/www/your_domain

如果您没有修改它的 umask 值,您的 Web 根目录的权限应该是正确的,但您可以通过键入以下内容来确保:

sudo chmod -R 755 /var/www/your_domain

接下来,使用 nano 或您喜欢的编辑器创建示例 index.html 页面:

nano /var/www/your_domain/index.html

在里面,添加以下示例 HTML:

/var/www/your_domain/index.html

<html>
    <head>
        <title>Welcome to Your_domain!</title>
    </head>
    <body>
        <h1>Success!  The your_domain server block is working!</h1>
    </body>
</html>

完成后保存并关闭文件。

为了让 Apache 提供此内容,有必要使用正确的指令创建一个虚拟主机文件。 与其直接修改位于/etc/apache2/sites-available/000-default.conf的默认配置文件,不如在/etc/apache2/sites-available/your_domain.conf新建一个:

sudo nano /etc/apache2/sites-available/your_domain.conf

粘贴以下配置块,与默认配置类似,但针对我们的新目录和域名进行了更新:

/etc/apache2/sites-available/your_domain.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName your_domain
    ServerAlias www.your_domain
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

请注意,我们已将 DocumentRoot 更新为我们的新目录,并将 ServerAdmin 更新为 your_domain 站点管理员可以访问的电子邮件。 我们还添加了两个指令:ServerName,它建立应该与此虚拟主机定义匹配的基本域,以及 ServerAlias,它定义应该匹配的更多名称,就好像它们是基本域一样姓名。

完成后保存并关闭文件。

让我们使用 a2ensite 工具启用文件:

sudo a2ensite your_domain.conf

禁用 000-default.conf 中定义的默认站点:

sudo a2dissite 000-default.conf

接下来,让我们测试一下配置错误:

sudo apache2ctl configtest

您应该看到以下输出:

OutputSyntax OK

重新启动 Apache 以实现您的更改:

sudo systemctl restart apache2

Apache 现在应该为您的域名提供服务。 您可以通过导航到 http://your_domain 进行测试,您应该会看到如下内容:

这样,您的虚拟主机就完全设置好了。 不过,在进行更多更改或部署应用程序之前,主动测试您的 PHP 配置以防有任何问题需要解决会很有帮助。

第 5 步 — 在您的 Web 服务器上测试 PHP 处理

为了测试您的系统是否针对 PHP 进行了正确配置,请创建一个名为 info.php 的 PHP 脚本。 为了让 Apache 找到该文件并正确提供它,它必须保存到您的 Web 根目录。

通过运行以下步骤在您在上一步中创建的 Web 根目录创建文件:

sudo nano /var/www/your_domain/info.php

这将打开一个空白文件。 在文件中添加以下文本,这是有效的 PHP 代码:

/var/www/your_domain/info.php

<?php
phpinfo();

完成后,保存并关闭文件。

现在您可以测试您的 Web 服务器是否能够正确显示此 PHP 脚本生成的内容。 要试用此功能,请在您的网络浏览器中访问此页面。 您将再次需要服务器的公共 IP 地址或域名。

您将要访问的地址是:

http://your_domain/info.php

你来到的页面应该是这样的:

此页面从 PHP 的角度提供了有关您的服务器的一些基本信息。 它对于调试和确保正确应用您的设置很有用。

如果您可以在浏览器中看到此页面,那么您的 PHP 正在按预期工作。

您可能希望在此测试之后删除此文件,因为它实际上可能会将有关您的服务器的信息提供给未经授权的用户。 为此,请运行以下命令:

sudo rm /var/www/your_domain/info.php

如果您以后需要再次访问该信息,您可以随时重新创建此页面。

结论

现在您已经安装了 LAMP 堆栈,接下来您有很多选择。 您已经安装了一个平台,该平台允许您在服务器上安装大多数类型的网站和 Web 软件。

作为紧接着的下一步,您应该确保通过 HTTPS 提供与您的 Web 服务器的连接是安全的。 按照我们关于 如何使用 Let's Encrypt 保护 Apache 的指南,使用免费的 TLS/SSL 证书保护您的网站。

其他一些流行的选择是: