Ubuntu14.04でSymfonyアプリケーションを本番環境にデプロイする方法
序章
SymfonyはPHPで書かれたオープンソースのWebフレームワークであり、あらゆるサイズのプロジェクトを構築するのに適しています。 再利用可能なコンポーネントに基づいて適切に設計された構造を提供し、その上に独自のPHPアプリケーションを構築できます。
このチュートリアルでは、Ubuntu14.04サーバーに基本的なSymfonyアプリケーションを手動でデプロイするために必要な手順について説明します。 本番環境に対応したセットアップを実行するために、セキュリティとパフォーマンスの対策を考慮してサーバーを適切に構成する方法を説明します。
Symfonyの入門チュートリアルをお探しの場合は、 Ubuntu14.04にSymfonyをインストールして使用を開始する方法をお読みください。
前提条件
このチュートリアルでは、次のものが必要になります。
各アプリケーションには固有のニーズがあるため、展開は非常に広範な主題であることに留意することが重要です。 物事を単純にするために、Symfonyで構築されたサンプルのto-doアプリケーションを使用します。 ソースコードはGitHubにあります。
ステップ1—サーバーの依存関係をインストールする
このステップでは、サーバーの依存関係をインストールします。
パッケージマネージャーのキャッシュを更新することから始めます。
- sudo apt-get update
アプリケーションファイルをチェックアウトするためのgit
、アプリケーションのインストール時に適切なディレクトリ権限を設定するためのacl
、および2つのPHP拡張機能(php5-cli
)が必要です。コマンドラインと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のセットアップを本番環境に向けて準備することから始めましょう。 次のステップでは、 rootMySQLアカウントのパスワードが必要になります。 MySQLが安全にセットアップされていることを確認してください(LAMPおよびLEMPチュートリアルのステップ2で詳しく説明されています)。
ワンクリック(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-user という名前のユーザーが作成され、パスワードはtodo-passwordになります。 これらは変更が必要な単純なサンプル値であり、セキュリティを向上させるためにMySQLユーザーにはより複雑なパスワードを使用する必要があることに注意することが重要です。
このユーザーに、アプリケーションデータベースに対する適切なアクセス許可を付与する必要があります。 これは次の方法で実行できます。
- GRANT ALL PRIVILEGES ON todo.* TO 'todo-user'@'localhost';
OutputQuery OK, 0 rows affected (0.00 sec)
これにより、todo-userユーザーにtodo
データベース内のすべてのテーブルに対するすべての特権が付与されます。 変更を適用するには、次のコマンドを実行します。
- FLUSH PRIVILEGES;
OutputQuery OK, 0 rows affected (0.00 sec)
すべてが期待どおりに機能しているかどうかをテストするには、MySQLクライアントを終了します。
- quit;
今度は、作成したばかりの新しいMySQLユーザーとパスワードを使用して再度ログインします。 この例では、ユーザー名todo-userとパスワードtodo-passwordを使用しています。
- mysql -u todo-user -p
このユーザーがアクセスできるデータベースを確認するには、次のコマンドを使用します。
- SHOW DATABASES;
出力は次のようになります。
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| todo |
+--------------------+
2 rows in set (0.00 sec)
これは、新しいユーザーが適切な権限で正常に作成されたことを意味します。 information_schema
とtodo
の2つのデータベースのみが表示されます。
これで、MySQLクライアントを終了できます。
- quit;
ステップ3—アプリケーションコードをチェックアウトする
Symfonyプロジェクトのみを検討している場合でも、ほとんどのアプリケーションの固有の性質により、デプロイメントは広範なテーマです。 各ユースケースでは、データベースの移行や追加のセットアップコマンドの実行など、非常に具体的な展開手順が必要になる可能性があるため、一般化するのは困難です。
チュートリアルの流れを単純化するために、Symfonyで構築された基本的なデモアプリケーションを使用します。 独自のSymfonyアプリケーションを使用することもできますが、アプリケーションのニーズによっては追加の手順を実行する必要がある場合があることに注意してください。
私たちのアプリケーションは、アイテムを追加および削除したり、各アイテムのステータスを変更したりできるシンプルなToDoリストです。 やること項目はMySQLデータベースに保存されます。 ソースコードはGitHubで入手できます。
Gitを使用してアプリケーションコードをチェックアウトします。 次のステップは、アプリケーションのルートディレクトリとして機能する場所を選択することです。 後で、それに応じてWebサーバーを構成します。 このチュートリアルでは、/var/www/todo-symfony
を使用するので、ここでそのディレクトリを作成します。
- sudo mkdir -p /var/www/todo-symfony
リポジトリのクローンを作成する前に、フォルダの所有者とグループを変更して、通常のユーザーアカウントを使用してプロジェクトファイルを操作できるようにします。 sammyをsudoの非rootユーザー名に置き換えます。
- 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 を使用しています)。 ただし、 Webサーバーユーザー(通常は www-data )もこれらのファイルにアクセスする必要があります。 そうしないと、Webサーバーはアプリケーションを提供できなくなります。 それとは別に、特別なアクセス許可の配置が必要な2つのディレクトリがあります。app/cache
とapp/logs
です。 これらのディレクトリは、システムユーザーとWebサーバーユーザーの両方が書き込み可能である必要があります。
これらの特別なアクセス許可を構成するには、ACL(アクセス制御リスト)を使用します。 ACLを使用すると、ファイルとディレクトリに対するよりきめ細かいアクセス権が有効になります。これは、許容度の高い配置を避けながら、適切なアクセス許可を設定するために必要なものです。
まず、ユーザーwww-dataがアプリケーションフォルダー内のファイルにアクセスできるようにする必要があります。 このユーザーに、ディレクトリ全体で読み取り+実行権限(rX)を付与します。
- sudo setfacl -R -m u:www-data:rX todo-symfony
次に、cache
フォルダーとlogs
フォルダーに特別なアクセス許可を設定する必要があります。 読み取り+書き込み+実行権限(rwX)をユーザー www-data に付与して、Webサーバーがこれらのディレクトリにのみ書き込みできるようにします。
- 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
がユーザーsammy によって所有されている場合でも、ユーザーwww-dataに対する追加のアクセス許可のセットがあることがわかります。 デフォルトのディレクティブは、このディレクトリ内に作成された新しいファイルが持つ権限を示します。
ステップ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サーバーを構成するだけです。 これには2つのステップが含まれます。php.ini
でdate.timezone
ディレクティブを設定することと、アプリケーションを提供するためのデフォルトのWebサイト構成ファイル(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アプリケーションを提供するためにカスタマイズされたものに置き換える必要があります。 最初に、現在のデフォルトのWebサイト構成のバックアップを作成します。
- cd /etc/nginx/sites-available
- sudo mv default default-bkp
新しいファイルを作成して、古いファイルを置き換えます。
- sudo nano /etc/nginx/sites-available/default
次の内容をファイルに貼り付けます。 サーバーのドメイン名またはIPアドレスを反映するために、server_name
の値を置き換えることを忘れないでください。
- 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 +PHP5Webサーバーの構成手順
デフォルトの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
ファイルを保存して終了します。 次に、デフォルトのWebサイト構成ファイルを、Symfonyアプリケーションを提供するために調整されたカスタムファイルに置き換える必要があります。 現在のデフォルトのWebサイト構成のバックアップを作成します。
- 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
. . .
ファイルを保存して終了します。 また、Apacheに対してmod_rewrite
を有効にする必要があります。
- sudo a2enmod rewrite
すべての変更を適用するには、Apacheを再起動します。
- sudo service apache2 restart
ステップ7—アプリケーションへのアクセス
サーバーはデモSymfonyアプリケーションを提供する準備ができているはずです。 ブラウザでhttp://your_server_ip
にアクセスすると、次のようなページが表示されます。
フォームを使用して、新しいタスクを作成し、アプリケーションの機能をテストできます。
結論
アプリケーションを本番環境にデプロイするには、アクセスが制限された専用のデータベースユーザーを作成したり、アプリケーションフォルダーに適切なディレクトリ権限を設定したりするなど、細部に特別な注意を払う必要があります。 これらの手順は、実稼働環境でサーバーとアプリケーションのセキュリティを強化するために必要です。 このチュートリアルでは、基本的なSymfonyアプリケーションをUbuntu14.04サーバーの本番環境に手動でデプロイするために実行する必要のある特定の手順を確認しました。