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

Symfony是一个开源PHP框架,适用于任何项目,无论其大小。本教程将向您展示如何在Ubuntu 18.04上使用LEMP将Symfony应用程序部署到生产环境。

作者选择了公共利益公司的软件作为Write for DOnations计划的一部分接受捐赠。

介绍

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;

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

Query OK, 1 row affected (0.00 sec)

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

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

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

您将看到以下输出:

Query OK, 0 rows affected (0.00 sec)

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

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

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

您将看到以下输出:

Query OK, 0 rows affected (0.00 sec)

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

FLUSH PRIVILEGES;

您将看到以下输出:

Query OK, 0 rows affected (0.00 sec)

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

quit;

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

mysql -u blog-admin -p

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

SHOW DATABASES;

您将在输出中看到blog表:

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

最后,退出MySQL客户端:

quit;

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

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

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

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

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

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

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

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

用你的sudo非root用户名替换sammy

现在,您可以更改为父目录并在GitHub上克隆应用程序:

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

您将看到以下输出:

Cloning 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创建.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

您将看到以下输出:

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

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

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

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

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

php bin/console doctrine:fixtures:load

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

Careful, 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

您将看到以下输出:

Clearing 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

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

在/ etc / nginx的/网站可用/博客

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处理。

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

注意:如果您在Ubuntu 18.04上的必备文章如何安装Linux,Nginx,MySQL,PHP(LEMP)中创建了example.com文件,请使用sudo rm /etc/nginx/sites-enabled/ example.comsites-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

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

Symfony博客应用程序的Alt屏幕截图

结论

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

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