如何在 Ubuntu 18.04 上使用 LEMP 将 Symfony 4 应用程序部署到生产环境中

作者选择了 Software in the Public Interest Inc作为 Write for Donations计划的一部分获得捐款。

介绍

Symfony是一个开源的PHP框架,具有优雅的结构和声誉,适合启动任何项目,无论其规模如何。

在此教程中, 您将在 Ubuntu 18. 04 上用 LEMP 堆栈( Nginx, MySQL, 和 PHP) 部署一个已有的标准 Symfony 4 应用程序来生产, 这将帮助您开始配置服务器和框架的结构 。 Nginx是一个受欢迎的开源高性能的HTTP服务器,具有包括倒置代理支持在内的额外功能. 它拥有良好的声誉,并拥有互联网上一些最大和最高的交通网站。 如果您选择部署自己的 Symfony 应用程序, 您可能不得不根据应用程序的现有结构执行额外步骤 .

前提条件

要完成本教程,您将需要:

第1步:为应用程序创建用户和数据库

通过遵循前提条件中的指示,您现在拥有应用程序安装所需的所有基本服务器依赖性,因为每个动态 Web 应用程序都需要一个数据库,您将在本节中创建用户并正确配置应用程序的数据库。

要为我们的应用程序和与之相关的用户创建 MySQL 数据库,您需要使用 MySQL 根帐户访问 MySQL 客户端:

1mysql -u root -p

输入相应的密码,该密码应该与运行 mysql_secure_installation 时使用的密码相同。

接下来,创建应用程序数据库:

1CREATE DATABASE blog;

您将在控制台中看到以下输出:

1[secondary_label Output]
2Query OK, 1 row affected (0.00 sec)

您已经成功创建了应用程序数据库,您现在可以创建一个MySQL用户,并允许他们访问新创建的数据库。

使用以下命令创建 MySQL 用户名和密码. 如果您想要,您可以更改用户名和密码为更安全的东西:

1CREATE USER  'blog-admin'@'localhost' IDENTIFIED BY 'password';

您将看到以下结果:

1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)

目前,用户 blog-admin 没有对应用程序数据库的正确权限,事实上,即使 ** blog-admin** 试图使用他们的密码登录,他们也无法访问 MySQL 壳。

在访问或在数据库上执行特定操作之前,用户需要正确的权限. 使用以下命令允许用户完全访问 blog-admin 数据库:

1GRANT ALL PRIVILEGES ON blog.* TO 'blog-admin'@'localhost';

您将看到以下结果:

1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)

blog-admin 现在在 ** blog** 数据库中的所有表中都有所有权限. 要重新加载授权表并应用更改,您需要使用 flush 语句执行一个 flush-privilege 操作:

1FLUSH PRIVILEGES;

您将看到以下结果:

1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)

您已经完成了创建新用户并授予权限. 要测试您是否在轨道上,请退出 MySQL 客户端:

1quit;

然后再次登录,使用您刚刚创建的MySQL用户的凭证,并在提示时输入密码:

1mysql -u blog-admin -p

检查用户是否可以访问数据库:

1SHOW DATABASES;

您将在输出中看到博客表:

1[secondary_label Output]
2+--------------------+
3| Database           |
4+--------------------+
5| information_schema |
6| blog               |
7+--------------------+
82 rows in set (0.00 sec)

最后,退出 MySQL 客户端:

1quit;

您成功创建了一个数据库,为演示应用程序创建了一个用户,并授予新创建的用户正确的访问权限,现在您已经准备好设置演示应用程序。

步骤2 - 设置演示应用程序

要保持本教程简单,您将部署一个与Symfony构建的博客应用程序. 该应用程序将允许身份验证的用户创建博客帖子并将其存储在数据库中。

您将在本教程中部署的博客应用程序的源代码是 GitHub

首先,创建一个将作为应用程序的根目录的目录,因此,从控制台运行以下命令,创建一个名为symfony-blog的新目录:

1sudo mkdir -p /var/www/symfony-blog

若要使用非根用户帐户处理项目文件,您需要通过运行以下方式更改文件夹所有者和组:

1sudo chown sammy:sammy /var/www/symfony-blog

用你的 sudo 非 root 用户名取代 sammy

现在,你可以切换到家长目录并在GitHub上克隆应用程序:

1cd /var/www
2git clone https://github.com/yemiwebby/symfony-blog.git symfony-blog

您将看到以下输出:

1[secondary_label Output]
2Cloning into 'symfony-blog'...
3remote: Counting objects: 180, done.
4remote: Compressing objects: 100% (122/122), done.
5remote: Total 180 (delta 57), reused 164 (delta 41), pack-reused 0
6Receiving objects: 100% (180/180), 167.01 KiB | 11.13 MiB/s, done.
7Resolving deltas: 100% (57/57), done.

下一步,您将配置环境变量并安装项目所需的依赖性。

步骤 3 — 配置应用程序的环境变量

要完全设置应用程序,您需要安装项目依赖并正确配置应用程序参数。

默认情况下,Symfony应用程序在开发模式中运行,这为调试目的提供了非常详细的日志,这不适用于您在本教程中所做的事情,并且对于生产环境来说不是很好的做法,因为它可以减慢事情并创建非常大的日志文件。

Symfony 需要知道你是在生产环境中运行应用程序. 您可以通过创建包含变量声明的 .env 文件来设置此功能,或者直接创建环境变量。

1cd symfony-blog
2sudo nano .env

将下列行添加到文件中,以配置生产应用程序环境:

1[label .env]
2APP_ENV=prod
3APP_DEBUG=0

'APP_ENV' 是一个环境变量,指定应用程序处于生产状态,而 'APP_DEBUG' 是一个环境变量,指定应用程序是否应该在调试模式中运行。

保存文件并离开编辑器。

接下来,安装一个Symfony应用程序用于处理XML的PHP扩展:

1sudo apt install php7.2-xml

接下来,您需要安装项目依赖,运行composer install:

1cd /var/www/symfony-blog
2composer install

您已成功配置环境变量并安装了项目所需的依赖性,接下来,您将设置数据库凭据。

步骤4:设置数据库凭证

为了从您之前创建的应用程序数据库中获取数据,您需要在Symfony应用程序内部设置和配置所需的数据库凭证。

再次打开.dll 文件:

1sudo nano .env

将下列内容添加到文件中,这将使您能够轻松连接并与数据库进行正确的交互,您可以将其添加到 .env 文件中的 APP_DEBUG=0 行后:

1[label .env]
2...
3DATABASE_URL=mysql://blog-admin:password@localhost:3306/blog

Symfony 框架使用名为 Doctrine的第三方库来与数据库进行通信。

现在你可以使用Doctrine来更新你的数据库,使用从克隆的Github应用程序的表。

1php bin/console doctrine:schema:update --force

您将看到以下输出:

1[secondary_label Output]
2Updating database schema...
3    4 queries were executed
4[OK] Database schema updated successfully!

设置所需的凭据并更新数据库架构后,您现在可以轻松与数据库进行交互。为了在下一节中启动应用程序,您将加载一组虚假数据到数据库中。

步骤5 — 使用教义定位来普及您的数据库

目前,新创建的表是空的. 您将使用 doctrine-fixtures填充它。 使用 Doctrine-Fixtures 不是 Symfony 应用程序的先决条件,它只是用于为您的应用程序提供愚蠢的数据。

运行以下命令,自动将包含一个 作者 和一个样本 ** 帖子的详细信息的测试数据加载到为博客创建的数据库表中:

1php bin/console doctrine:fixtures:load

您将收到有关数据库被清除的警告,您可以继续输入Y:

1[secondary_label Output]
2Careful, database will be purged. Do you want to continue y/N ? y
3  > purging database
4  > loading App\DataFixtures\ORM\Fixtures

在下一节中,你将清理和加热你的缓存。

第6步:清理和加热您的缓存

为了确保您的应用程序在用户提出请求时加载更快,在部署过程中加热缓存是很好的做法。加热缓存会生成页面并将其存储到更快的响应中,而不是构建全新的页面。

1php bin/console cache:clear

您将看到以下结果:

1[secondary_label Output]
2Clearing the cache for the prod environment with debug false
3[OK] Cache for the "prod" environment (debug=false) was successfully cleared.

您将完成设置在一点点上. 剩下的只是配置 Web 服务器. 您将在下一节中这样做。

第7步:配置 Web 服务器并运行应用程序

到目前为止,您已经安装了 Nginx 来服务您的页面和 MySQL 来存储和管理您的数据,您现在将通过创建一个新的应用程序服务器块来配置 Web 服务器,而不是编辑默认服务器。

打开一个新的服务器块:

1sudo nano /etc/nginx/sites-available/blog

将下列内容添加到新服务器封锁配置文件中,确保您将服务器封锁中的your_server_ip代替为您的服务器 IP 地址:

 1[label /etc/nginx/sites-available/blog]
 2
 3server {
 4    listen 80;
 5    listen [::]:80;
 6
 7    server_name blog your_server_ip;
 8    root /var/www/symfony-blog/public;
 9    index index.php;
10    client_max_body_size 100m;
11
12    location / {
13        try_files $uri $uri/ /index.php$is_args$args;
14    }
15
16    location ~ \.php {
17        try_files $uri /index.php =404;
18        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
19        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
20        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
21        fastcgi_split_path_info ^(.+\.php)(/.+)$;
22        fastcgi_index index.php;
23        include fastcgi_params;
24      }
25
26    location ~ /\.(?:ht|git|svn) {
27        deny all;
28    }
29}

首先,我们为Nginx指定了`Listen'指示,这是在 " 80 " 端口默认的,然后设置服务器名称,以匹配对服务器IP地址的请求。 接下来,我们使用 " 根 " 指示来指定项目的文件根。 " symfony-blog " 应用程序被储存在 " /var/www/symfony-blog " 中,但为了遵守最佳做法,我们把网络根设为 " /var/www/symfony-blog/public " ,因为只有 " /public " 子目录才应上因特网。 最后,我们配置了定位指令来处理PHP处理.

添加内容后,保存文件并退出编辑器。

注意:如果您在 Ubuntu 18.04 上如何安装 Linux, Nginx, MySQL, PHP (LEMP 堆栈) 的前提文章中创建了文件 example.com,请将其从 sites-enabled 目录中删除 sudo rm /etc/nginx/sites-enabled/example.com 以免与此新文件发生冲突。

要启用新创建的服务器块,我们需要从位于 /etc/nginx/sites-available 目录中的新服务器块配置文件创建一个符号链接到 /etc/nginx/sites-enabled 以使用以下命令:

1sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/

通过运行检查新的配置文件,查找任何语法错误:

1sudo nginx -t

此命令将打印错误到控制台,如果有任何错误。一旦没有错误,运行此命令来重新加载 Nginx:

1sudo systemctl reload nginx

您刚刚完成了成功部署 Symfony 4 应用程序所需的最后一步. 您通过创建服务器块来配置 Web 服务器,并正确设置 Web 根,以使 Web 应用程序可访问。

最后,您现在可以运行并测试该应用程序. 在您最喜欢的浏览器中访问 http://your_server_ip:

下面的图像是Symfony博客应用程序的屏幕截图,您应该在您的服务器的IP地址中看到:

Alt screenshot of the Symfony blog application

结论

Symfony 是一个功能丰富的 PHP 框架,其架构使使用其构建软件的开发人员乐趣。Symfony 是一个功能丰富的 Web 开发框架,为开发人员提供强大的工具来构建 Web 应用程序。

在本教程中,您手动部署了Symfony 4应用程序在运行LEMP的Ubuntu 18.04服务器上进行生产,现在您可以将这些知识应用于部署自己的Symfony应用程序。

Published At
Categories with 技术
comments powered by Disqus