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