如何在Ubuntu18.04上使用LEMP将Symfony4应用程序部署到生产环境

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

作为 Write for DOnations 计划的一部分,作者选择了 Public Interest Inc 中的 软件来接收捐赠。

介绍

Symfony 是一个开源的 PHP 框架,具有优雅的结构,并且以适合启动任何项目的框架而闻名,无论其规模大小。 作为一组可重用的组件,它的灵活性、架构和高性能使其成为构建高度复杂的企业应用程序的首选。

在本教程中,您将在 Ubuntu 18.04 上使用 LEMP 堆栈(Nginx、MySQL 和 PHP)将现有的标准 Symfony 4 应用程序部署到生产环境,这将帮助您开始配置服务器和框架结构。 Nginx 是一种流行的开源、高性能 HTTP 服务器,具有包括反向代理支持在内的附加功能。 它拥有良好的声誉,并拥有一些互联网上最大和最高流量的网站。 如果您选择部署自己的 Symfony 应用程序,您可能需要根据应用程序的现有结构实施额外的步骤。

先决条件

要完成本教程,您需要:

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

按照先决条件中的说明,您现在拥有应用程序安装所需的所有基本服务器依赖项。 由于每个动态 Web 应用程序都需要一个数据库,因此您将在本节中创建一个用户并为该应用程序正确配置一个数据库。

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

 mysql -u root -p

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

接下来,使用以下命令创建应用程序数据库:

CREATE DATABASE blog;

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

OutputQuery OK, 1 row affected (0.00 sec)

您已成功创建应用程序数据库。 您现在可以创建一个 MySQL 用户并授予他们对新创建的数据库的访问权限。

执行以下命令创建 MySQL 用户和密码。 如果您愿意,可以将用户名和密码更改为更安全的内容:

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

您将看到以下输出:

OutputQuery OK, 0 rows affected (0.00 sec)

目前用户blog-admin没有应用数据库的权限。 事实上,即使 blog-admin 尝试使用他们的密码登录,他们也无法访问 MySQL shell。

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

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

您将看到以下输出:

OutputQuery OK, 0 rows affected (0.00 sec)

blog-admin 现在拥有 blog 数据库中所有表的所有权限。 要重新加载授权表并应用更改,您需要使用 flush 语句执行刷新特权操作:

FLUSH PRIVILEGES;

您将看到以下输出:

OutputQuery OK, 0 rows affected (0.00 sec)

您已完成创建新用户并授予权限。 要测试您是否正常,请退出 MySQL 客户端:

quit;

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

mysql -u blog-admin -p

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

SHOW DATABASES;

您将在输出中看到 blog 表:

Output+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog               |
+--------------------+
2 rows in set (0.00 sec)

最后,退出 MySQL 客户端:

quit;

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

第 2 步 — 设置演示应用程序

为了使本教程简单,您将部署一个使用 Symfony 构建的博客应用程序。 此应用程序将允许经过身份验证的用户创建博客文章并将其存储在数据库中。 此外,应用程序用户可以查看与作者关联的所有帖子和详细信息。

您将在本教程中部署的博客应用程序的源代码是 on GitHub。 您将使用 Git 从 GitHub 拉取应用程序的源代码并将其保存在新目录中。

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

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

为了使用非 root 用户帐户处理项目文件,您需要通过运行以下命令更改文件夹所有者和组:

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

sammy 替换为您的 sudo 非 root 用户名。

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

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

您将看到以下输出:

OutputCloning into 'symfony-blog'...
remote: Counting objects: 180, done.
remote: Compressing objects: 100% (122/122), done.
remote: Total 180 (delta 57), reused 164 (delta 41), pack-reused 0
Receiving objects: 100% (180/180), 167.01 KiB | 11.13 MiB/s, done.
Resolving deltas: 100% (57/57), done.

演示应用程序现已设置。 在下一步中,您将配置环境变量并安装项目所需的依赖项。

第 3 步 — 为应用程序配置环境变量

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

默认情况下,Symfony 应用程序在开发模式下运行,这为调试提供了非常详细的日志。 这不适用于您在本教程中所做的事情,也不适用于生产环境,因为它会减慢速度并创建非常大的日志文件。

Symfony 需要知道您正在生产环境中运行应用程序。 您可以通过创建包含变量声明的 .env 文件或直接创建环境变量来进行设置。 由于您还可以使用 .env 文件为此应用程序配置数据库凭据,因此这样做更有意义。 将您的工作目录更改为克隆项目并使用以下命令创建 .env 文件:

cd symfony-blog
sudo nano .env

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

.env

APP_ENV=prod
APP_DEBUG=0

APP_ENV 是一个环境变量,指定应用程序处于生产状态,而 APP_DEBUG 是一个环境变量,指定应用程序是否应在调试模式下运行。 您现在已将其设置为 false。

保存文件并退出编辑器。

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

sudo apt install php7.2-xml

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

cd /var/www/symfony-blog
composer install

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

第 4 步 — 设置数据库凭证

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

再次打开.env文件:

sudo nano .env

将以下内容添加到文件中,这将使您可以轻松地与数据库正确连接和交互。 您可以在 .env 文件中的 APP_DEBUG=0 行之后添加它:

.env

...
DATABASE_URL=mysql://blog-admin:password@localhost:3306/blog

Symfony 框架使用名为 Doctrine 的第三方库与数据库进行通信。 Doctrine 为您提供了有用的工具,使与数据库的交互变得简单灵活。

您现在可以使用 Doctrine 使用克隆的 Github 应用程序中的表来更新您的数据库。 运行这个命令来做到这一点:

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

您将看到以下输出:

OutputUpdating database schema...
    4 queries were executed
[OK] Database schema updated successfully!  

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

第 5 步 — 使用 Doctrine-Fixtures 填充数据库

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

运行以下命令,将包含 author 和示例 post 详细信息的测试数据自动加载到为博客创建的数据库表中:

php bin/console doctrine:fixtures:load

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

OutputCareful, database will be purged. Do you want to continue y/N ? y
  > purging database
  > loading App\DataFixtures\ORM\Fixtures  

在下一部分中,您将清除和预热缓存。

第 6 步 — 清理和预热缓存

为了确保您的应用程序在用户发出请求时加载得更快,最好在部署期间预热缓存。 预热缓存会生成页面并存储它们以便稍后更快地响应,而不是构建全新的页面。 幸运的是,Symfony 有一个清除缓存的命令,它也会触发预热。 为此目的运行以下命令:

php bin/console cache:clear

您将看到以下输出:

OutputClearing the cache for the prod environment with debug false
[OK] Cache for the "prod" environment (debug=false) was successfully cleared.

稍后您将完成设置。 剩下的就是配置 Web 服务器。 您将在下一节中执行此操作。

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

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

打开一个新的服务器块:

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

将以下内容添加到新的服务器块配置文件中。 确保将服务器块中的 your_server_ip 替换为您的服务器 IP 地址:

/etc/nginx/sites-available/博客

server {
    listen 80;
    listen [::]:80;

    server_name blog your_server_ip;
    root /var/www/symfony-blog/public;
    index index.php;
    client_max_body_size 100m;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php {
        try_files $uri /index.php =404;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index index.php;
        include fastcgi_params;
      }

    location ~ /\.(?:ht|git|svn) {
        deny all;
    }
}

首先,我们为 Nginx 指定了 listen 指令,默认情况下在端口 80 上,然后设置服务器名称以匹配对服务器 IP 地址的请求。 接下来,我们使用 root 指令来指定项目的文档根目录。 symfony-blog 应用程序存储在 /var/www/symfony-blog 中,但为了符合最佳实践,我们将 Web 根目录设置为 /var/www/symfony-blog/public,因为只有 /public 子目录应该公开到互联网。 最后,我们配置了 location 指令来处理 PHP 处理。

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

注意: 如果您在先决条件文章 How To Install Linux, Nginx, MySQL, PHP (LEMP stack) on Ubuntu 18.04 中创建了文件 example.com,请将其从 sites-enabled 中删除] 目录与 sudo rm /etc/nginx/sites-enabled/example.com 所以它不会与这个新文件冲突。


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

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

通过运行以下命令检查新配置文件中是否存在任何语法错误:

sudo nginx -t

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

 sudo systemctl reload nginx

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

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

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

结论

Symfony 是一个功能丰富的 PHP 框架,它的架构让使用它构建软件的开发人员可以享受 Web 开发的乐趣。 Symfony 是一个功能丰富的 Web 开发框架,它为开发人员提供强大的工具来构建 Web 应用程序。 由于其灵活性,它通常被认为是企业应用程序的不错选择。 部署典型 Symfony 应用程序的步骤会有所不同——取决于应用程序的设置、复杂性和要求。

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