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

2018-11-15 15:32:59 浏览数 (1)

介绍

Symfony是一个开源PHP框架,具有优雅的结构和声誉,无论其大小如何,都是一个适合启动任何项目的框架。作为一组可重用的组件,其灵活性,体系结构和高性能使其成为构建高度复杂的企业应用程序的首选。

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

先决条件

要完成本教程,您需要:

  • 一个Ubuntu 18.04服务器,。包括一个具有sudo访问权限和防火墙的非root用户。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 根据如何在Ubuntu 18.04上安装和使用Composer的步骤1和2 安装Composer。
  • 通过以下如何在Ubuntu 18.04上安装Git安装Git。

步骤1 - 为应用程序创建用户和数据库

通过遵循先决条件中的说明,您现在可以获得应用程序安装所需的所有基本服务器依赖性。由于每个动态Web应用程序都需要数据库,因此您将在本节中创建用户并为应用程序正确配置数据库。

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

代码语言:javascript复制
 mysql -u root -p

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

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

代码语言:javascript复制
CREATE DATABASE blog;

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

代码语言:javascript复制
Query OK, 1 row affected (0.00 sec)

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

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

代码语言:javascript复制
CREATE USER  'blog-admin'@'localhost' IDENTIFIED BY 'password';

您将看到以下输出:

代码语言:javascript复制
Query OK, 0 rows affected (0.00 sec)

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

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

代码语言:javascript复制
GRANT ALL PRIVILEGES ON blog.* TO 'blog-admin'@'localhost';

您将看到以下输出:

代码语言:javascript复制
Query OK, 0 rows affected (0.00 sec)

博客管理员现在对里面的所有表中的所有特权博客数据库。要重新加载授权表并应用更改,您需要使用flush语句执行flush-privilege操作:

代码语言:javascript复制
FLUSH PRIVILEGES;

您将看到以下输出:

代码语言:javascript复制
Query OK, 0 rows affected (0.00 sec)

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

代码语言:javascript复制
quit;

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

代码语言:javascript复制
mysql -u blog-admin -p

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

代码语言:javascript复制
SHOW DATABASES;

您将在输出中看到该blog表:

代码语言:javascript复制
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| blog               |
 -------------------- 
2 rows in set (0.00 sec)

最后,退出MySQL客户端:

代码语言:javascript复制
quit;

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

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

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

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

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

代码语言:javascript复制
sudo mkdir -p /var/www/symfony-blog

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

代码语言:javascript复制
 sudo chown sammy:sammy /var/www/symfony-blog

用你的具有sudo权限的非root用户名替换sammy

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

代码语言:javascript复制
cd /var/www
git clone https://github.com/yemiwebby/symfony-blog.git symfony-blog

您将看到以下输出:

代码语言:javascript复制
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文件:

代码语言:javascript复制
cd symfony-blog
sudo nano .env

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

代码语言:javascript复制
APP_ENV=prod
APP_DEBUG=0

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

保存文件并退出编辑器。

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

代码语言:javascript复制
sudo apt install php7.2-xml

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

代码语言:javascript复制
cd /var/www/symfony-blog
composer install

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

第4步 - 设置数据库凭据

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

再次打开.env文件:

代码语言:javascript复制
sudo nano .env

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

代码语言:javascript复制
...
DATABASE_URL=mysql://blog-admin:password@localhost:3306/blog

Symfony框架使用名为Doctrine的第三方库与数据库进行通信。Doctrine为您提供了有用的工具,使您可以轻松灵活地与数据库进行交互。

您现在可以使用Doctrine使用克隆的Github应用程序中的表来更新数据库。运行此命令来执行此操作:

代码语言:javascript复制
php bin/console doctrine:schema:update --force

您将看到以下输出:

代码语言:javascript复制
Updating database schema...
    4 queries were executed
[OK] Database schema updated successfully!  

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

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

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

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

代码语言:javascript复制
php bin/console doctrine:fixtures:load

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

代码语言:javascript复制
Careful, database will be purged. Do you want to continue y/N ? y
  > purging database
  > loading AppDataFixturesORMFixtures  

在下一节中,您将清除并预热缓存。

第6步 - 清理和预热您的缓存

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

代码语言:javascript复制
php bin/console cache:clear

您将看到以下输出:

代码语言:javascript复制
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服务器,而不是编辑默认的服务器块。

使用以下命令打开新服务器块:

代码语言:javascript复制
sudo nano /etc/nginx/sites-available/blog

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

代码语言:javascript复制
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;
    }
}

首先,我们为端口80指定了Nginx的默认指令listen,然后设置服务器名称以匹配服务器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.com将其从sites-enabled目录中删除,以免与此新文件冲突。

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

代码语言:javascript复制
sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/

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

代码语言:javascript复制
sudo nginx -t

如果有错误,此命令将向控制台输出错误。一旦没有错误,运行此命令重新加载Nginx:

代码语言:javascript复制
 sudo systemctl reload nginx

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

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

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

结论

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

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

更多Ubuntu教程请前往腾讯云 社区学习更多知识。


参考文献:《How to Deploy a Symfony 4 Application to Production with LEMP on Ubuntu 18.04》

0 人点赞