序章

SymfonyはPHPで書かれたオープンソースのWebフレームワークであり、あらゆるサイズのプロジェクトを構築するのに適しています。 再利用可能なコンポーネントに基づいて適切に設計された構造を提供し、その上に独自のPHPアプリケーションを構築できます。

このチュートリアルでは、Ubuntu14.04サーバーに基本的なSymfonyアプリケーションを手動でデプロイするために必要な手順について説明します。 本番環境に対応したセットアップを実行するために、セキュリティとパフォーマンスの対策を考慮してサーバーを適切に構成する方法を説明します。

Symfonyの入門チュートリアルをお探しの場合は、 Ubuntu14.04にSymfonyをインストールして使用を開始する方法をお読みください。

前提条件

このチュートリアルでは、次のものが必要になります。

  • LAMPまたはLEMPを実行している新しいUbuntu14.04ドロップレット
  • サーバーの初期設定チュートリアルに従って設定できるsudo非rootユーザー

各アプリケーションには固有のニーズがあるため、展開は非常に広範な主題であることに留意することが重要です。 簡単にするために、Symfonyでビルドされたサンプルのto-doアプリケーションを使用します。 ソースコードはGitHubにあります。

ステップ1—サーバーの依存関係をインストールする

このステップでは、サーバーの依存関係をインストールします。

パッケージマネージャーのキャッシュを更新することから始めます。

  1. sudo apt-get update

アプリケーションファイルをチェックアウトするためのgit、アプリケーションのインストール時に適切なディレクトリ権限を設定するためのacl、および2つのPHP拡張機能(php5-cli)が必要です。コマンドラインとphp5-curl(Symfonyの場合))。 必要なパッケージをインストールします。

  1. sudo apt-get install git php5-cli php5-curl acl

最後に、アプリケーションの依存関係をダウンロードするには、composerが必要です。 composerをシステム全体にインストールするには、次のコマンドを実行します。

  1. 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を開きます。

  1. sudo nano /etc/mysql/my.cnf

ここで、[mysqld]ブロックを見つけます。 基本設定の下にcollation-serverおよびcharacter-set-serverオプションを追加します。

/etc/mysql/my.cnf
[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を再起動して、変更を有効にします。

  1. sudo service mysql restart

アプリケーションのユーザーとデータベースの作成

次に、MySQLデータベースとアプリケーションのユーザーを作成する必要があります。

まず、MySQL rootアカウントを使用してMySQLクライアントにアクセスします。

  1. mysql -u root -p

パスワードの入力を求められます。 これは、mysql_secure_installationを実行するときに使用したものと同じパスワードである必要があります。

次に、アプリケーションデータベースを作成します。

  1. CREATE DATABASE todo;
Output
Query OK, 1 row affected (0.00 sec)

これでデータベースが作成されました。 次のステップは、MySQLユーザーを作成し、新しく作成したデータベースへのアクセスをユーザーに提供することです。

  1. CREATE USER 'todo-user'@'localhost' IDENTIFIED BY 'todo-password';
Output
Query OK, 0 rows affected (0.00 sec)

これにより、 todo-user という名前のユーザーが作成され、パスワードはtodo-passwordになります。 これらは変更が必要な単純な値の例であり、セキュリティを向上させるためにMySQLユーザーにはより複雑なパスワードを使用する必要があることに注意することが重要です。

このユーザーに、アプリケーションデータベースに対する適切なアクセス許可を付与する必要があります。 これは次の方法で実行できます。

  1. GRANT ALL PRIVILEGES ON todo.* TO 'todo-user'@'localhost';
Output
Query OK, 0 rows affected (0.00 sec)

これにより、todo-userユーザーにtodoデータベース内のすべてのテーブルに対するすべての特権が付与されます。 変更を適用するには、次のコマンドを実行します。

  1. FLUSH PRIVILEGES;
Output
Query OK, 0 rows affected (0.00 sec)

すべてが期待どおりに機能しているかどうかをテストするには、MySQLクライアントを終了します。

  1. quit;

今度は、作成したばかりの新しいMySQLユーザーとパスワードを使用して再度ログインします。 この例では、ユーザー名todo-userとパスワードtodo-passwordを使用しています。

  1. mysql -u todo-user -p

このユーザーがアクセスできるデータベースを確認するには、次のコマンドを使用します。

  1. SHOW DATABASES;

出力は次のようになります。

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

これは、新しいユーザーが適切な権限で正常に作成されたことを意味します。 information_schematodoの2つのデータベースのみが表示されます。

これで、MySQLクライアントを終了できます。

  1. quit;

ステップ3—アプリケーションコードをチェックアウトする

Symfonyプロジェクトのみを検討している場合でも、ほとんどのアプリケーションには固有の性質があるため、デプロイメントは広範なテーマです。 各ユースケースでは、データベースの移行や追加のセットアップコマンドの実行など、非常に具体的な展開手順が必要になる可能性があるため、一般化するのは困難です。

チュートリアルの流れを単純化するために、Symfonyで構築された基本的なデモアプリケーションを使用します。 独自のSymfonyアプリケーションを使用することもできますが、アプリケーションのニーズによっては追加の手順を実行する必要がある場合があることに注意してください。

私たちのアプリケーションは、アイテムを追加および削除したり、各アイテムのステータスを変更したりできるシンプルなToDoリストです。 やること項目はMySQLデータベースに保存されます。 ソースコードはGitHubで入手できます。

Gitを使用してアプリケーションコードをチェックアウトします。 次のステップは、アプリケーションのルートディレクトリとして機能する場所を選択することです。 後で、それに応じてWebサーバーを構成します。 このチュートリアルでは、/var/www/todo-symfonyを使用するので、ここでそのディレクトリを作成します。

  1. sudo mkdir -p /var/www/todo-symfony

リポジトリのクローンを作成する前に、フォルダの所有者とグループを変更して、通常のユーザーアカウントを使用してプロジェクトファイルを操作できるようにします。 sammyをsudoのroot以外のユーザー名に置き換えます。

  1. sudo chown sammy:sammy /var/www/todo-symfony

次に、親ディレクトリに移動して、アプリケーションのクローンを作成します。

  1. cd /var/www
  2. git clone https://github.com/php-demos/todo-symfony.git todo-symfony
Output
Cloning 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/cacheapp/logsです。 これらのディレクトリは、システムユーザーとWebサーバーユーザーの両方が書き込み可能である必要があります。

これらの特別なアクセス許可を構成するには、ACL(アクセス制御リスト)を使用します。 ACLを使用すると、ファイルとディレクトリに対するよりきめ細かいアクセス権が有効になります。これは、許容度の高い配置を避けながら、適切なアクセス許可を設定するために必要なものです。

まず、ユーザーwww-dataがアプリケーションフォルダー内のファイルにアクセスできるようにする必要があります。 このユーザーに、ディレクトリ全体で読み取り+実行権限(rX)を付与します。

  1. sudo setfacl -R -m u:www-data:rX todo-symfony

次に、cacheフォルダーとlogsフォルダーに特別なアクセス許可を設定する必要があります。 読み取り+書き込み+実行権限(rwX)をユーザー www-data に付与して、Webサーバーがこれらのディレクトリにのみ書き込みできるようにします。

  1. sudo setfacl -R -m u:www-data:rwX todo-symfony/app/cache todo-symfony/app/logs

最後に、app/cacheおよびapp/logsフォルダー内に作成されたすべての新しいファイルが、Webサーバーユーザーに対する読み取り、書き込み、および実行のアクセス許可を使用して、定義したのと同じアクセス許可スキーマに従うことを定義します。 これは、先ほど実行したsetfaclコマンドを繰り返すことで実行されますが、今回は-dオプションを追加します。

  1. sudo setfacl -dR -m u:www-data:rwX todo-symfony/app/cache todo-symfony/app/logs

特定のディレクトリに現在配置されている権限を確認する場合は、getfaclを使用できます。

  1. 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に本番環境でアプリケーションを実行していることを通知する環境変数を定義する必要があります。

  1. export SYMFONY_ENV=prod

次に、プロジェクトの依存関係をインストールする必要があります。 アプリケーションフォルダにアクセスし、composer installを実行します。

  1. cd todo-symfony
  2. composer install --no-dev --optimize-autoloader

インストールプロセスの最後に、parameters.ymlファイルに入力する情報を入力するように求められます。 このファイルには、データベース接続設定など、アプリケーションに関する重要な情報が含まれています。 ENTERを押すと、データベース名、ユーザー名、およびパスワードを除く、これらすべてのデフォルト値を受け入れることができます。 それらについては、ステップ2で作成した値を使用してください。

Output
Creating 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コンソールコマンドを使用してデータベース接続を確認できます。

  1. 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行が予想されるので、次にそれを実行しましょう。

  1. php app/console doctrine:schema:create
Output
ATTENTION: This operation should not be executed in a production environment. Creating database schema... Database schema created successfully!

これにより、アプリケーションエンティティから取得したメタデータ情報に従って、構成されたデータベースにすべてのアプリケーションテーブルが作成されます。

既存のアプリケーションを移行する場合は、doctrine:schema:createおよびdoctrine:schema:updateコマンドを直接使用せず、代わりにデータベース移行を実行する必要があります。 この場合、アプリケーションはクリーンで空のデータベースでインストールされることになっているため、移行は必要ありません。

次に、キャッシュをクリアする必要があります。

  1. php app/console cache:clear --env=prod --no-debug
Output
Clearing the cache for the prod environment with debug false

そして最後に、アプリケーションアセットを生成します。

  1. php app/console assetic:dump --env=prod --no-debug
Output
Dumping 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.inidate.timezoneディレクティブを設定することと、アプリケーションを提供するためのデフォルトのWebサイト構成ファイル(ApacheまたはNginxのいずれか)を更新することです。

LEMP環境とLAMP環境の両方でこれらの手順を実行する方法を説明します。

Nginx+PHP-FPMの構成手順

デフォルトのphp.iniファイルを編集して、サーバーのタイムゾーンを定義することから始めましょう。 これはSymfonyアプリケーションを実行するための要件であり、通常、サーバーの新規インストールでコメントアウトされます。

ファイル/etc/php5/fpm/php.iniを開きます。

  1. sudo nano /etc/php5/fpm/php.ini

date.timezoneを含む行を検索します。 行の先頭にある;記号を削除してディレクティブのコメントを解除し、アプリケーションに適切なタイムゾーンを追加します。 この例ではEurope/Amsterdamを使用しますが、でサポートされているタイムゾーンを選択できます。

変更された/etc/php5/fpm/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Amsterdam

ファイルを保存して終了します。 変更を適用するには、PHPを再起動します。

  1. sudo service php5-fpm restart

次に、デフォルトのウェブサイト設定ファイルを、Symfonyアプリケーションを提供するためにカスタマイズされたものに置き換える必要があります。 最初に、現在のデフォルトのWebサイト構成のバックアップを作成します。

  1. cd /etc/nginx/sites-available
  2. sudo mv default default-bkp

新しいファイルを作成して、古いファイルを置き換えます。

  1. sudo nano /etc/nginx/sites-available/default

次の内容をファイルに貼り付けます。 サーバーのドメイン名またはIPアドレスを反映するために、server_nameの値を置き換えることを忘れないでください。

/ etc / nginx / sites-available / default
  1. server {
  2. server_name example.com www.example.com your_server_ip;
  3. root /var/www/todo-symfony/web;
  4. location / {
  5. # try to serve file directly, fallback to app.php
  6. try_files $uri /app.php$is_args$args;
  7. }
  8. location ~ ^/app\.php(/|$) {
  9. fastcgi_pass unix:/var/run/php5-fpm.sock;
  10. fastcgi_split_path_info ^(.+\.php)(/.*)$;
  11. include fastcgi_params;
  12. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  13. # Prevents URIs that include the front controller. This will 404:
  14. # http://domain.tld/app.php/some-path
  15. # Remove the internal directive to allow URIs like this
  16. internal;
  17. }
  18. error_log /var/log/nginx/symfony_error.log;
  19. access_log /var/log/nginx/symfony_access.log;
  20. }

ファイルを保存して終了します。 変更を適用するには、Nginxを再起動します。

  1. sudo service nginx restart

Apache +PHP5Webサーバーの構成手順

デフォルトのphp.iniファイルを編集して、サーバーのタイムゾーンを定義することから始めましょう。 これはSymfonyアプリケーションを実行するための要件であり、通常、サーバーの新規インストールでコメントアウトされます。

ファイル/etc/php5/apache2/php.iniを開きます。

  1. sudo nano /etc/php5/apache2/php.ini

date.timezoneを含む行を検索します。 行の先頭にある;記号を削除してディレクティブのコメントを解除し、アプリケーションに適切なタイムゾーンを追加します。 この例ではEurope/Amsterdamを使用しますが、でサポートされているタイムゾーンを選択できます。

変更された/etc/php5/fpm/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Amsterdam

ファイルを保存して終了します。 次に、デフォルトのWebサイト構成ファイルを、Symfonyアプリケーションを提供するために調整されたカスタムファイルに置き換える必要があります。 現在のデフォルトのWebサイト構成のバックアップを作成します。

  1. cd /etc/apache2/sites-available
  2. sudo mv 000-default.conf default-bkp.conf

新しいファイルを作成して、古いファイルを置き換えます。

  1. sudo nano /etc/apache2/sites-available/000-default.conf

次の内容をファイルに貼り付けます。

/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の値を定義できます。 そうでない場合は、省略できます。

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/todo-symfony/web
. . .

ファイルを保存して終了します。 また、Apacheに対してmod_rewriteを有効にする必要があります。

  1. sudo a2enmod rewrite

すべての変更を適用するには、Apacheを再起動します。

  1. sudo service apache2 restart

ステップ7—アプリケーションへのアクセス

サーバーはデモSymfonyアプリケーションを提供する準備ができているはずです。 ブラウザでhttp://your_server_ipにアクセスすると、次のようなページが表示されます。

Symfony To-Do App Preview

フォームを使用して、新しいタスクを作成し、アプリケーションの機能をテストできます。

結論

アプリケーションを本番環境にデプロイするには、アクセスが制限された専用のデータベースユーザーを作成したり、アプリケーションフォルダーに適切なディレクトリ権限を設定したりするなど、細部に特別な注意を払う必要があります。 これらの手順は、実稼働環境でサーバーとアプリケーションのセキュリティを強化するために必要です。 このチュートリアルでは、基本的なSymfonyアプリケーションをUbuntu14.04サーバーの本番環境に手動でデプロイするために実行する必要のある特定の手順を確認しました。