介绍
Symfony 是一个以 PHP 编写的开源 Web 框架,适合构建任何规模的项目,它提供了基于可重复使用的组件的精心设计的结构,您可以建立自己的 PHP 应用程序。
本教程将涵盖在Ubuntu 14.04服务器上手动部署基本Symfony应用程序所需的步骤,我们将看到如何正确配置服务器,考虑安全性和性能措施,以完成准备生产的安装。
如果您正在寻找 Symfony 的介绍教程,您可以阅读 如何在 Ubuntu 14.04 上安装并开始使用 Symfony。
前提条件
对于这个教程,你将需要:
重要的是要記住,部署是一個非常廣泛的主題,因為每個應用程序將有自己的特定需求。 為了保持事情簡單,我們將使用一個以 Symfony 建造的樣本應用程式。 您可以在 GitHub找到其來源代碼。
第1步:安装服务器依赖
在此步骤中,我们将安装服务器依赖。
首先,更新包管理器的缓存。
1sudo apt-get update
我们需要)。
1sudo apt-get install git php5-cli php5-curl acl
最后,我们需要‘composer’来下载应用程序依赖性。 要在整个系统上安装‘composer’,运行:
1sudo curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
你现在应该准备好去。
第2步:配置MySQL
我们开始准备制作你的MySQL 下一步, 您需要 root MySQL 账户的密码 。 确保安全设置 MySQL(详见LIMP和[LEMP](https://andsky.com/tech/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 step-two-%E2%80%94-install-mysql-to-manage-site-data)教程 第2步).
如果你正在使用我们的一个单击(LAMP / LEMP),你会发现MySQL根密码在当你登录到你的服务器时打印的当天的文本消息中。
设置默认链接和卡片
Symfony 建议将数据库的图形和字符串设置为utf8
。大多数数据库将默认使用拉丁式字符串,这会导致在提取数据库中以前存储的数据时产生意想不到的结果,例如奇怪的字符和不可读的文本。
使用您最喜欢的命令行编辑器打开文件 `/etc/mysql/my.cnf。
1sudo nano /etc/mysql/my.cnf
现在,找到 [mysqld] 块,在基本设置
中添加collation-server
和character-set-server
选项。
1[label /etc/mysql/my.cnf]
2[mysqld]
3#
4# * Basic Settings
5#
6collation-server = utf8mb4_general_ci # Replaces utf8_general_ci
7character-set-server = utf8mb4 # Replaces utf8
8user = mysql
9pid-file = /var/run/mysqld/mysqld.pid
10socket = /var/run/mysqld/mysqld.sock
11
12. . .
保存和退出:重新启动MySQL,以便更改生效。
1sudo service mysql restart
创建应用程序的用户和数据库
现在我们需要为我们的应用程序创建一个MySQL数据库和用户。
首先,使用MySQL root 帐户访问MySQL客户端。
1mysql -u root -p
您将被要求提供密码,这应该是您在运行mysql_secure_installation
时使用的密码。
现在,创建应用数据库。
1CREATE DATABASE todo;
1[secondary_label Output]
2Query OK, 1 row affected (0.00 sec)
下一步是创建一个MySQL用户,并为他们提供访问我们新创建的数据库。
1CREATE USER 'todo-user'@'localhost' IDENTIFIED BY 'todo-password';
1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)
这将创建一个名为 todo-user 的用户,其密码是** todo-password** . 重要的是要注意,这些是应该更改的简单示例值,您应该为您的MySQL用户使用更复杂的密码以提高安全性。
我们仍然需要授予该用户在我们的应用程序数据库上正确的权限。
1GRANT ALL PRIVILEGES ON todo.* TO 'todo-user'@'localhost';
1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)
这将授予所有用户在所有
数据库中的所有表中的所有权限。
1FLUSH PRIVILEGES;
1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)
要测试一切是否按预期运行,请退出MySQL客户端。
1quit;
现在再次登录,这次使用您刚刚创建的新 MySQL 用户和密码. 在本示例中,我们使用用户名 todo-user ,并使用密码** todo-password** 。
1mysql -u todo-user -p
您可以检查该用户可以访问哪些数据库:
1SHOW DATABASES;
输出应该是这样的:
1[secondary_label Output]
2+--------------------+
3| Database |
4+--------------------+
5| information_schema |
6| todo |
7+--------------------+
82 rows in set (0.00 sec)
这意味着新用户成功创建了正确的权限,您只应该看到两个数据库:‘information_schema’和‘todo’。
您现在可以退出 MySQL 客户端。
1quit;
步骤 3 – 检查应用程序代码
部署是一个广泛的主题,因为大多数应用程序的独特性,即使我们只考虑Symfony项目,这是很难概括的,因为每个用例可能需要非常具体的部署步骤,例如迁移数据库或运行额外的设置命令。
为了简化教程流程,我们将使用与Symfony构建的基本演示应用程序. 您也可以使用自己的Symfony应用程序,但请记住,您可能需要根据您的应用程序需求执行额外步骤。
我们的应用程序是一个简单的任务列表,允许您添加和删除项目,并改变每个项目的状态。 任务项目存储在MySQL数据库中。 源代码可在 GitHub找到。
我們將使用 Git來檢查應用程式的代碼。下一步是選擇一個位置,將作為我們的應用程式根目錄。後來,我們將相應地設定網頁伺服器。 對於本教程,我們將使用 /var/www/todo-symfony
,所以現在創建該目錄。
1sudo mkdir -p /var/www/todo-symfony
在克隆库之前,让我们更改文件夹的所有者和组,以便我们可以使用我们的常规用户帐户与项目文件一起工作。
1sudo chown sammy:sammy /var/www/todo-symfony
现在,移动到家长目录并克隆应用程序。
1cd /var/www
2git clone https://github.com/php-demos/todo-symfony.git todo-symfony
1[secondary_label Output]
2Cloning into 'todo-symfony'...
3remote: Counting objects: 76, done.
4remote: Compressing objects: 100% (61/61), done.
5remote: Total 76 (delta 6), reused 76 (delta 6), pack-reused 0
6Unpacking objects: 100% (76/76), done.
7Checking connectivity... done.
步骤4 – 修复文件夹权限
应用程序文件现在位于 " /var/www/todo-symfony " ,这是由我们的_system 用户拥有的目录(在本教程中,我们使用sammy 作为例子)。 然而,web服务器用户(通常为** www-data** )也需要访问这些文件. 否则,网络服务器将无法为应用程序服务. 除此之外,还有两个目录需要特别许可安排:app/cache'和
app/logs'。 这些目录应由系统用户和网络服务器用户编写.
我们将使用ACL(访问控制列表)来配置这些特殊权限.ACL允许对文件和目录更精细的访问权限,这就是我们需要设置正确的权限,同时避免过于允许的安排。
首先,我们需要允许用户 www-data 访问应用程序文件夹中的文件. 给该用户在整个目录中一个 read + execute 权限(rX)。
1sudo setfacl -R -m u:www-data:rX todo-symfony
接下来,我们需要为),以便让 Web 服务器只能在这些目录中写入。
1sudo setfacl -R -m u:www-data:rwX todo-symfony/app/cache todo-symfony/app/logs
最后,我们将定义,在app/cache
和app/logs
文件夹中创建的所有新文件都遵循我们刚刚定义的相同的权限方案,为网页服务器用户提供阅读、写入和执行权限。
1sudo setfacl -dR -m u:www-data:rwX todo-symfony/app/cache todo-symfony/app/logs
如果您想检查特定目录中当前存在哪些权限,则可以使用getfacl。
1getfacl todo-symfony/app/cache
你应该得到类似于此的输出:
1[secondary_label Output]
2# file: todo-symfony/app/cache
3# owner: sammy
4# group: sammy
5user::rwx
6user:www-data:rwx
7group::rwx
8mask::rwx
9other::r-x
10default:user::rwx
11default:user:www-data:rwx
12default:group::rwx
13default:mask::rwx
14default:other::r-x
从这个输出中,你可以看到,即使app/cache
目录是用户 sammy 的所有权,但对于用户** www-data** 还有额外的权限。
步骤5:设置应用程序
我们现在有应用程序文件,但我们仍然需要安装项目依赖并配置应用程序参数。
Symfony 是为了在不同的环境中工作得很好而构建的。 默认情况下,它会使用开发设置,这会影响其处理缓存和错误的方式。 开发环境有更广泛的和详细的日志,更少的缓存内容,错误以显著的方式显示来简化调试。
为了调整生产应用程序,我们需要定义一个环境变量,该变量告诉Symfony我们在生产环境中运行该应用程序。
1export SYMFONY_ENV=prod
接下来,我们需要安装项目依赖程序,进入应用程序文件夹并运行composer install
。
1cd todo-symfony
2composer install --no-dev --optimize-autoloader
在安装过程结束时,您应该被要求提供一些信息,这些信息将填充到 parameters.yml
文件中。 此文件包含应用程序的重要信息,如数据库连接设置。 您可以按 ENTER
来接受所有这些数据库的默认值,除了数据库名称、用户名和密码。 对于这些,请使用您在 [步骤 2](# step-2-%E2%80%94-configure-mysql)中创建的值。
1[secondary_label Output]
2Creating the "app/config/parameters.yml" file
3Some parameters are missing. Please provide them.
4database_host (127.0.0.1):
5database_port (null):
6database_name (symfony): todo
7database_user (root): todo-user
8database_password (null): todo-password
9. . .
安装完成后,我们可以使用doctrine:schema:validate
控制台命令检查数据库连接。
1php app/console doctrine:schema:validate
1[secondary_label Output]
2[Mapping] OK - The mapping files are correct.
3[Database] FAIL - The database schema is not in sync with the current mapping file.
OK 行意味着数据库连接正在运作. FAIL 行预计是因为我们还没有创建数据库方案,所以让我们做下一步:
1php app/console doctrine:schema:create
1[secondary_label Output]
2ATTENTION: This operation should not be executed in a production environment.
3
4Creating database schema...
5Database schema created successfully!
这将根据从应用实体中获得的元数据信息,在配置的数据库中创建所有应用程序表。
<$>[注意]在迁移现有应用程序时,您应该避免直接使用 doctrine:schema:create
和 doctrine:schema:update
命令,并执行 database migration 代替。在我们的情况下,迁移是不必要的,因为该应用程序应该安装一个干净的,空的数据库。
现在你应该清理缓存。
1php app/console cache:clear --env=prod --no-debug
1[secondary_label Output]
2Clearing the cache for the prod environment with debug false
最后,创建应用资产。
1php app/console assetic:dump --env=prod --no-debug
1[secondary_label Output]
2Dumping all prod assets.
3Debug mode is off.
4
514:02:39 [file+] /var/www/todo-symfony/app/../web/css/app.css
614:02:39 [dir+] /var/www/todo-symfony/app/../web/js
714:02:39 [file+] /var/www/todo-symfony/app/../web/js/app.js
第6步:设置Web服务器
这将涉及两步:在php.ini中设置),以便为我们的应用提供服务。
我们将看到如何在LEMP和LAMP环境中实现这些步骤。
Nginx + PHP-FPM 的配置步骤
让我们先编辑默认的php.ini文件来定义服务器的时区,这是运行Symfony应用程序的要求,通常在新鲜的服务器安装中被评论。
打开文件 /etc/php5/fpm/php.ini
。
1sudo nano /etc/php5/fpm/php.ini
搜索包含 date.timezone
的行. 通过在行开始时删除 ;
标记来消除指令,并为您的应用程序添加适当的时区。 在本示例中,我们将使用 Europe/Amsterdam
,但您可以选择任何 支持的时区。
1[label modified /etc/php5/fpm/php.ini]
2[Date]
3; Defines the default timezone used by the date functions
4; http://php.net/date.timezone
5date.timezone = Europe/Amsterdam
保存文件并退出. 若要应用更改,请重新启动 PHP。
1sudo service php5-fpm restart
接下来,我们需要将默认网站配置文件替换为用于服务Symfony应用程序的定制文件,首先创建当前默认网站配置的备份。
1cd /etc/nginx/sites-available
2sudo mv default default-bkp
创建一个新的文件来取代旧的文件。
1sudo nano /etc/nginx/sites-available/default
将下列内容粘贴到文件中. 不要忘记更换server_name
值以反映您的服务器域名或 IP 地址。
1[label /etc/nginx/sites-available/default]
2server {
3 server_name example.com www.example.com your_server_ip;
4 root /var/www/todo-symfony/web;
5
6 location / {
7 # try to serve file directly, fallback to app.php
8 try_files $uri /app.php$is_args$args;
9 }
10
11 location ~ ^/app\.php(/|$) {
12 fastcgi_pass unix:/var/run/php5-fpm.sock;
13 fastcgi_split_path_info ^(.+\.php)(/.*)$;
14 include fastcgi_params;
15 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
16 # Prevents URIs that include the front controller. This will 404:
17 # http://domain.tld/app.php/some-path
18 # Remove the internal directive to allow URIs like this
19 internal;
20 }
21
22 error_log /var/log/nginx/symfony_error.log;
23 access_log /var/log/nginx/symfony_access.log;
24}
保存文件并退出. 若要应用更改,请重新启动 Nginx。
1sudo service nginx restart
Apache + PHP5 Web 服务器的配置步骤
让我们先编辑默认的php.ini文件来定义服务器的时区,这是运行Symfony应用程序的要求,通常在新鲜的服务器安装中被评论。
打开文件 /etc/php5/apache2/php.ini
:
1sudo nano /etc/php5/apache2/php.ini
搜索包含 date.timezone
的行. 通过在行开始时删除 ;
标记来消除指令,并为您的应用程序添加适当的时区。 在本示例中,我们将使用 Europe/Amsterdam
,但您可以选择任何 支持的时区。
1[label modified /etc/php5/fpm/php.ini]
2[Date]
3; Defines the default timezone used by the date functions
4; http://php.net/date.timezone
5date.timezone = Europe/Amsterdam
现在我们需要替换默认网站配置文件以自定义文件,用于服务Symfony应用程序。
1cd /etc/apache2/sites-available
2sudo mv 000-default.conf default-bkp.conf
创建一个新的文件来取代旧的文件。
1sudo nano /etc/apache2/sites-available/000-default.conf
将下列内容插入文件中。
1[label /etc/apache2/sites-available/000-default.conf]
2
3<VirtualHost *:80>
4
5 DocumentRoot /var/www/todo-symfony/web
6 <Directory /var/www/todo-symfony/web>
7 AllowOverride None
8 Order Allow,Deny
9 Allow from All
10
11 <IfModule mod_rewrite.c>
12 Options -MultiViews
13 RewriteEngine On
14 RewriteCond %{REQUEST_FILENAME} !-f
15 RewriteRule ^(.*)$ app.php [QSA,L]
16 </IfModule>
17 </Directory>
18
19 # uncomment the following lines if you install assets as symlinks
20 # or run into problems when compiling LESS/Sass/CoffeScript assets
21 # <Directory /var/www/project>
22 # Options FollowSymlinks
23 # </Directory>
24
25 ErrorLog /var/log/apache2/symfony_error.log
26 CustomLog /var/log/apache2/symfony_access.log combined
27</VirtualHost>
如果您正在使用域名访问您的服务器,而不是仅仅是IP地址,您可以随意定义ServerName
和ServerAlias
值,如下所示。
1[label /etc/apache2/sites-available/000-default.conf]
2
3<VirtualHost *:80>
4 ServerName example.com
5 ServerAlias www.example.com
6
7 DocumentRoot /var/www/todo-symfony/web
8. . .
我们还需要为 Apache 启用mod_rewrite
。
1sudo a2enmod rewrite
若要应用所有更改,请重新启动 Apache。
1sudo service apache2 restart
步骤7 - 访问应用程序
您的伺服器應該準備好為 Symfony 演示應用程式服務。在您的瀏覽器中訪問「http://your_server_ip」,您應該看到這樣的頁面:
您可以使用该表单创建新任务并测试应用程序的功能。
结论
部署任何应用程序到生产需要特别注意细节,例如创建一个专用数据库用户与有限的访问和设置适当的目录权限在应用程序文件夹. 这些步骤是必要的,以增加服务器和应用程序的安全性在生产环境。