如何在Ubuntu18.04上使用LAMP设置CakePHP应用程序
作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。
介绍
CakePHP 是一个流行且功能丰富的 PHP Web 框架。 它解决了 Web 开发中的许多常见问题,例如与数据库交互、屏蔽 SQL 注入和生成视图代码。 它遵循 model-view-controller (MVC) 模式,将应用程序的各个部分解耦,有效地允许开发人员并行处理应用程序的不同部分。 它还提供内置的安全性和身份验证。 创建一个基本的数据库应用程序是一个无缝的过程,这使得 CakePHP 对原型设计很有用。 但是,您也可以使用 CakePHP 创建完全开发的 Web 应用程序以进行部署。
在本教程中,您将部署一个示例 CakePHP Web 应用程序到生产环境。 为此,您将设置一个示例数据库和用户,配置 Apache,将您的应用程序连接到数据库,并关闭调试模式。 您还将使用 CakePHP 的 bake
命令自动生成文章模型。
先决条件
在开始本教程之前,您需要:
- 运行 Ubuntu 18.04 的服务器,具有 root 访问权限和 sudo 非 root 帐户,您可以按照 this initial server setup guide 进行设置。
- 根据 How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04 安装的 LAMP 堆栈。 在撰写本文时,PHP 7.2 是最新版本。
- Composer(一个 PHP 包管理器)安装在你的服务器上。 有关如何执行此操作的指南,请访问 如何在 Ubuntu 18.04 上安装和使用 Composer。 您只需完成该教程中的前两个步骤。
- Apache 使用 Let's Encrypt 保护。 要完成此先决条件,您首先需要按照 如何在 Ubuntu 18.04 上安装 Apache 的第 5 步设置虚拟主机。 然后,您可以按照 How To Secure Apache with Let's Encrypt on Ubuntu 18.04 来使用 Let's Encrypt 保护 Apache。 询问时,启用强制 HTTPS 重定向。
- 完全注册的域名。 本教程将自始至终使用
example.com
。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。 - 为您的服务器设置了以下两个 DNS 记录。 您可以关注这个介绍到DigitalOcean DNS,详细了解如何添加它们。 带有 example.com 的 A 记录指向您的服务器的公共 IP 地址。 www.example.com 的 A 记录指向您服务器的公共 IP 地址。
第 1 步 — 安装依赖项
为了准备您的应用程序,您将首先安装 CakePHP 需要的 PHP 扩展。
首先更新包管理器缓存:
sudo apt update
CakePHP 需要 mbstring
、intl
和 simplexml
PHP 扩展,它们增加了对多字节字符串、国际化和 XML 处理的支持。 您已安装 mbstring
作为 Composer 必备教程的一部分。 您可以使用一个命令安装剩余的库:
sudo apt install php7.2-intl php7.2-xml -y
请记住,上面的版本号(7.2)会随着 PHP 的新版本而改变。
您安装了 CakePHP 所需的依赖项。 您现在已准备好配置 MySQL 数据库以供生产使用。
第 2 步 — 设置 MySQL 数据库
现在,您将创建一个 MySQL 数据库来存储有关您的博客文章的信息。 您还将创建一个数据库用户,您的应用程序将使用该用户访问数据库。 您将修改数据库权限以实现这种控制分离。 因此,即使使用数据库凭据,不良行为者也无法在系统上引发问题,这是生产环境中重要的安全预防措施。
启动你的 MySQL shell:
sudo mysql -u root -p
询问时,输入您在初始 LAMP 安装期间设置的密码。
接下来,创建一个数据库:
CREATE DATABASE cakephp_blog;
您将看到类似于以下内容的输出:
OutputQuery OK, 1 row affected (0.00 sec)
您的 CakePHP 应用程序将使用这个新数据库来读取和存储生产数据。
然后,指示 MySQL 对新的 cakephp_blog
数据库进行操作:
USE cakephp_blog;
您将看到类似于以下内容的输出:
OutputDatabase changed
现在,您将在 cakephp_blog
数据库中为您的博客文章创建一个表模式。 运行以下命令进行设置:
CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL );
您已经创建了一个包含五个字段的架构来描述博客文章:
id
:文章的唯一标识,设置为主键。title
:是文章的标题,声明为最多包含 50 个字符的文本字段。body
:是文章的文本,声明为TEXT
字段。created
:是记录创建的日期和时间。modified
:记录修改的日期和时间。
输出将类似于:
OutputQuery OK, 0 rows affected (0.01 sec)
您已经创建了一个用于在 cakephp_blog
数据库中存储文章的表。 接下来,通过运行以下命令使用示例文章填充它:
INSERT INTO articles (title, body, created) VALUES ('Sample title', 'This is the article body.', NOW());
您添加了一个示例文章,其中包含一些标题和正文文本的示例数据。
您将看到以下输出:
OutputQuery OK, 0 rows affected (0.01 sec)
为了将 CakePHP 应用程序连接到数据库,您需要创建一个新的数据库用户并限制其权限:
GRANT ALL PRIVILEGES ON cakephp_blog.* TO 'cake_user'@'localhost' IDENTIFIED BY 'password';
此命令授予数据库中所有表的所有权限。
请记住将 password
替换为您选择的强密码。
要使用所做的更改更新数据库,请运行以下命令重新加载:
FLUSH PRIVILEGES;
您刚刚创建了一个新的数据库用户 cake_user
并仅授予用户对 cakephp_blog
数据库的权限,从而加强了安全性。
输入 exit
退出 MySQL 终端。
您已经使用模式创建了一个新数据库,使用示例数据填充它,并创建了一个适当的数据库用户。 在下一步中,您将设置 CakePHP 应用程序本身。
第 3 步 - 创建博客应用程序
在本节中,您将使用 Composer 安装一个示例 CakePHP 应用程序。 使用 Composer 是有利的,因为它允许您从命令行安装 CakePHP,它会自动设置某些文件权限和配置文件。
首先,导航到 Apache Web 服务器文件夹:
cd /var/www/example.com/html
Apache 使用此目录来存储对外界可见的文件。 root
用户拥有该目录,因此您的非 root 用户 sammy
无法向其中写入任何内容。 要更正此问题,您将通过运行以下命令更改文件系统权限:
sudo chown -R sammy .
您现在将通过 Composer 创建一个新的 CakePHP 应用程序:
composer create-project --prefer-dist cakephp/app cake-blog
在这里,您调用了 composer
并指示它使用 create-project
创建一个新项目。 --prefer-dist cakephp/app
告诉 composer
使用 CakePHP 作为模板,并以 cake-blog
作为新应用程序的名称。
请记住,此命令可能需要一些时间才能完成。
当 Composer 要求您设置文件夹权限时,请回答 y
。
在本节中,您使用 Composer 创建了一个新的 CakePHP 项目。 在下一步中,您将配置 Apache 以指向新应用程序,这将使其在您的浏览器中可见。
第 4 步 — 配置 Apache 以指向您的应用程序
现在,您将为新的 CakePHP 应用程序配置 Apache,并启用 .htaccess
覆盖,这是 CakePHP 的要求。 这需要编辑 Apache 配置文件。
要进行实际路由,您必须指示 Apache 使用 .htaccess
文件。 这些配置文件将位于应用程序的子目录中(如果需要),然后 Apache 使用这些文件来更改应用程序请求部分的全局配置。 在其他任务中,它们将包含 URL 重写规则,您现在将对其进行调整。
首先使用文本编辑器打开 Apache 全局配置文件 (apache2.conf
):
sudo nano /etc/apache2/apache2.conf
找到以下代码块:
/etc/apache2/apache2.conf
... <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> ...
将 AllowOverride
从 None
更改为 All
,如下所示:
/etc/apache2/apache2.conf
... <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ...
保存并关闭文件。
接下来,您将指示 Apache 指向 CakePHP 安装中的 webroot
目录。 Apache 将其配置文件存储在 Ubuntu 18.04 的 /etc/apache2/sites-available
中。 这些文件控制 Apache 如何处理 Web 请求。
在 Let's Encrypt 必备教程中,您启用了 HTTPS 重定向; 因此只允许 HTTPS 流量。 因此,您只需编辑配置 HTTPS 流量的 example.com-le-ssl.conf
文件。
首先打开【X16X】【X20X】配置文件:
sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf
您只需要更改一行,即设置 DocumentRoot
并告诉 Apache 从何处向浏览器提供内容的行。 在文件中找到以下行:
/etc/apache2/sites-available/example.com-le-ssl.conf
DocumentRoot /var/www/example.com/html
通过添加以下突出显示的内容,编辑此行以指向 CakePHP 安装:
/etc/apache2/sites-available/example.com-le-ssl.conf
DocumentRoot /var/www/example.com/html/cake-blog/webroot
保存文件并退出编辑器。
之后,重新启动 Apache 以反映新配置:
sudo systemctl restart apache2
现在您可以在浏览器中访问https://your_domain/
。
您将看到默认的 CakePHP 成功页面。 您会注意到有一个块指示您的应用程序无法连接到数据库。 在下一步中,您将通过将应用程序连接到数据库来解决此问题。
您现在已启用 .htaccess
覆盖,并将 Apache 指向正确的 webroot
目录。
第 5 步 — 将您的应用程序连接到数据库
在本节中,您将把数据库连接到您的应用程序,以便您的博客可以访问这些文章。 您将编辑 CakePHP 的默认 config/app.php
文件以设置与数据库的连接。
导航到应用程序文件夹:
cd /var/www/example.com/html/cake-blog
通过运行以下命令打开 config/app.php
文件:
sudo nano config/app.php
找到 Datasources
块(如下所示):
/var/www/example.com/html/cake-blog/config/app.php
... 'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost', ... //'port' => 'non_standard_port_number', 'username' => 'cake_user', 'password' => 'password', 'database' => 'cakephp_blog', ...
对于 'username'
将 my_app
替换为您的数据库用户的用户名(本教程使用:cake_user
),将 secret
替换为您的数据库用户的密码,第二个 my_app
与数据库名称(本教程中的 cakephp_blog
)。
保存并关闭文件。
在浏览器中刷新应用并观察 Database 部分下的成功消息。 如果显示错误,请根据上述步骤仔细检查您的配置文件。
在这一步中,您已将 CakePHP 应用程序连接到 MySQL 数据库。 在下一步中,您将生成模型、视图和控制器文件,这些文件将构成与文章交互的用户界面。
第 6 步 - 创建文章用户界面
在本节中,您将通过运行生成文章模型的 CakePHP bake
命令创建一个即用型文章界面。 在 CakePHP 中,烘焙以基本状态生成所有必需的模型、视图和控制器,为进一步开发做好准备。 每个数据库应用程序都必须允许创建、读取、更新和删除 (CRUD) 操作,这使得 CakePHP 的 bake
功能对于自动生成这些操作的代码非常有用。 在几分钟之内,您就获得了应用程序的完整原型,准备好输入、存储和编辑数据。
模型、视图和控制器属于 MVC 模式。 他们的角色是:
- 模型代表数据结构。
- 视图以用户友好的方式呈现数据。
- 控制器根据用户请求进行操作,并充当视图和模型之间的中介。
CakePHP 将其 CLI 可执行文件存储在 bin/cake
下。 虽然它主要用于烘焙,但它提供了许多其他命令,例如用于清除各种缓存的命令。
bake
命令将检查您的数据库,并根据它找到的表定义生成模型。 通过运行以下命令开始:
./bin/cake bake all
通过传递 all
命令,您可以指示 CakePHP 一次生成模型、控制器和视图。
您的输出将如下所示:
OutputBake All --------------------------------------------------------------- Possible model names based on your database: - articles Run `cake bake all [name]` to generate skeleton files.
它已从您的数据库中正确检测到 articles
定义,并提供为该模型生成文件。
通过运行烘烤它:
./bin/cake bake all articles
您的输出将如下所示:
OutputBake All --------------------------------------------------------------- One moment while associations are detected. Baking table class for Articles... Creating file /var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php Wrote `/var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php` Deleted `/var/www/example.com/html/cake-blog/src/Model/Table/empty` Baking entity class for Article... Creating file /var/www/example.com/html/cake-blog/src/Model/Entity/Article.php Wrote `/var/www/example.com/html/cake-blog/src/Model/Entity/Article.php` Deleted `/var/www/example.com/html/cake-blog/src/Model/Entity/empty` Baking test fixture for Articles... Creating file /var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php Wrote `/var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php` Deleted `/var/www/example.com/html/cake-blog/tests/Fixture/empty` Bake is detecting possible fixtures... Baking test case for App\Model\Table\ArticlesTable ... Creating file /var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php Wrote `/var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php` Baking controller class for Articles... Creating file /var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php Wrote `/var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php` Bake is detecting possible fixtures... ... Baking `add` view template file... Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp` Baking `edit` view template file... Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp` Bake All complete.
在输出中,您将看到 CakePHP 已经记录了为 articles
数据库创建功能样板所采取的所有步骤。
现在,在浏览器中导航到以下内容:
https://your_domain/articles
您将看到当前在数据库中的文章列表,其中包括标题为 Sample Title 的一行。 bake
命令创建了这个界面,允许您创建、删除和编辑文章。 因此,它为进一步发展提供了坚实的起点。 您可以通过单击侧边栏中的 New Article 链接尝试添加新文章。
在本节中,您使用 CakePHP 的 bake
命令生成了模型、视图和控制器文件。 您现在可以创建、删除、查看和编辑您的文章,所有更改都会立即保存到数据库中。
在下一步中,您将禁用调试模式。
第 7 步 — 在 CakePHP 中禁用调试模式
在本节中,您将禁用 CakePHP 中的调试模式。 这一点至关重要,因为在调试模式下,应用程序会显示详细的调试信息,这是一个安全风险。 完成应用程序的开发后,您将完成此步骤。
使用您喜欢的编辑器打开 config/app.php
文件:
sudo nano config/app.php
在文件的开头附近会有一行用于 'debug'
模式。 打开文件时'debug'
模式将设置为true
。 根据以下内容将其更改为 false
:
配置/app.php
... 'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN), ...
关闭调试模式后,位于 src/Templates/Pages/home.ctp
下的主页将显示错误。
注意:如果您没有更改默认路由或替换home.ctp
的内容,您的应用程序主页现在会显示错误。 这是因为默认主页在开发过程中用作状态仪表板,但在禁用调试模式时不起作用。
您已禁用调试模式。 从现在开始发生的任何错误和异常以及它们的堆栈跟踪都不会显示给最终用户,从而加强了应用程序的安全性。
但是,禁用调试模式后,您的 home.ctp
将显示错误。 如果您仅出于本教程的目的完成了此步骤,您现在可以将您的主页重定向到文章列表界面,同时保持调试模式处于禁用状态。 您将通过编辑 home.ctp
的内容来实现此目的。
打开home.ctp
进行编辑:
sudo nano src/Template/Pages/home.ctp
将其内容替换为以下内容:
src/模板/页面/home.ctp
<meta http-equiv="refresh" content="0; url=./Articles" /> <p><a href="./Articles">Click here if you are not redirected</a></p>
此 HTML 重定向到 Articles
控制器。 如果自动重定向失败,还有一个链接供用户关注。
在此步骤中,您出于安全目的禁用了调试模式,并通过将用户重定向到 Articles
控制器提供的博客文章列表界面来修复主页的错误。
结论
现在,您已经在 Ubuntu 18.04 的 LAMP 堆栈上成功设置了 CakePHP 应用程序。 使用 CakePHP,您可以创建一个包含任意数量表的数据库,并且它会为数据生成一个实时 Web 编辑器。
CakePHP 食谱 提供了有关 CakePHP 各个方面的详细文档。 您的应用程序的下一步可能包括实现用户身份验证,以便每个用户都可以制作自己的文章。