Ubuntu 14.04の本番環境にSymfonyアプリケーションをデプロイする方法

前書き

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

このチュートリアルでは、基本的なSymfonyアプリケーションをUbuntu 14.04サーバーに手動でデプロイするために必要な手順を説明します。 実稼働の準備が整ったセットアップを達成するために、セキュリティとパフォーマンスの対策を考慮して、サーバーを適切に構成する方法を説明します。

Symfonyの入門チュートリアルを探している場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-get-started-with-symfony-2-on-ubuntu-を読むことができます。 14-04 [Ubuntu 14.04でSymfonyをインストールして開始する方法]。

前提条件

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

  • LAMPまたはhttpsを実行している新鮮なUbuntu 14.04ドロップレット://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 [LEMP]

  • Initial Server Setupチュートリアルに従って設定できるsudo非ルートユーザー

各アプリケーションには固有のニーズがあるため、展開は非常に広範なテーマであることに留意することが重要です。 物事を単純にするために、Symfonyで構築されたサンプルのTo Doアプリケーションを使用します。 ソースコードはhttps://github.com/php-demos/symfony[GitHub]にあります。

手順1-サーバーの依存関係のインストール

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

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

sudo apt-get update

アプリケーションファイルをチェックアウトするために + git +、アプリケーションをインストールするときに正しいディレクトリパーミッションを設定するために + acl +、そしてコマンドラインでPHPを実行するための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のセットアップを実稼働用に準備することから始めましょう。 次のステップでは、* root * MySQLアカウントのパスワードが必要になります。 MySQLが安全に設定されていることを確認してください(https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-onのステップ2 -ubuntu-14-04#step-two-%E2%80%94-install-mysql [LAMP]およびhttps://www.digitalocean.com/community/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 [LEMP] tutorials)。

デフォルトの照合と文字セットの設定

symfonyは、データベースの文字セットと照合順序を `+ utf8 +`に設定することをお勧めします。 ほとんどのデータベースは、デフォルトでラテン型の照合順序を使用します。これは、データベースに以前に保存されたデータ(奇妙な文字や判読不能なテキストなど)を取得するときに予期しない結果を引き起こします。 これをアプリケーションレベルで構成する方法はないため、MySQL構成ファイルを編集していくつかの定義を含める必要があります。

ファイル `+ / etc / mysql / my.cnf +`をお気に入りのコマンドラインエディターで開きます。

sudo nano /etc/mysql/my.cnf

ここで、* [mysqld] *ブロックを見つけます。 * Basic Settings *の下に `+ collat​​ion-server `および ` character-set-server +`オプションを追加します。

/etc/mysql/my.cnf

[mysqld]
#
# * Basic Settings
#


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 ;
OutputQuery OK, 1 row affected (0.00 sec)

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

CREATE USER ''@'localhost' IDENTIFIED BY '';
OutputQuery OK, 0 rows affected (0.00 sec)

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

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

GRANT ALL PRIVILEGES ON .* TO ''@'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  -p

このユーザーがアクセスできるデータベースは次の方法で確認できます。

SHOW DATABASES;

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

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

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

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

quit;

手順3-アプリケーションコードのチェックアウト

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

チュートリアルの流れを簡素化するために、Symfonyで構築された基本的なデモアプリケーションを使用します。 独自のSymfonyアプリケーションを使用することもできますが、アプリケーションのニーズに応じて追加のステップを実行する必要がある場合があることに留意してください。

私たちのアプリケーションは、あなたがアイテムを追加したり削除したり、各アイテムのステータスを変更したりすることを可能にする簡単なToDoリストです。 予定項目はMySQLデータベースに保存されます。 ソースコードはhttps://github.com/php-demos/symfony[GitHub]で入手できます。

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

sudo mkdir -p /var/www/

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

sudo chown  /var/www/

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

cd /var/www
git clone
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-フォルダーのアクセス許可を修正する

これで、アプリケーションファイルは_system user_が所有するディレクトリである + / var / www / todo-symfony +`に配置されます(このチュートリアルでは、例として* sammy を使用しています)。 ただし、webサーバーユーザー(通常 www-data *)もこれらのファイルにアクセスする必要があります。 そうしないと、Webサーバーはアプリケーションを提供できなくなります。 それとは別に、特別なパーミッションの配置を必要とする2つのディレクトリがあります: `+ app / cache`と + app / logs`。 これらのディレクトリは、システムユーザーとWebサーバーユーザーの両方が書き込み可能である必要があります。

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

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

sudo setfacl -R -m u:www-data:rX

次に、 + cache`フォルダーと + log`フォルダーに特別な権限を設定する必要があります。 Webサーバーがこれらのディレクトリにのみ書き込みできるようにするには、ユーザー* www-data *に_read + write + execute_パーミッション(rwX)を付与します。

sudo setfacl -R -m u:www-data:rwX /app/cache /app/logs

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

sudo setfacl -dR -m u:www-data:rwX /app/cache /app/logs

特定のディレクトリに現在どのパーミッションが設定されているかを確認したい場合は、 `+ getfacl +`を使用できます。

getfacl /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
composer install --no-dev --optimize-autoloader

インストールプロセスの最後に、 `+ parameters.yml `ファイルに入力する情報を提供するように求められます。 このファイルには、データベース接続設定など、アプリケーションの重要な情報が含まれています。 データベース名、ユーザー名、パスワードを除くこれらすべてのデフォルト値を受け入れるために、「 ENTER +」を押すことができます。 それらの場合、link:#step-2-%E2%80%94-configure-mysql [step 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):
database_user (root):
database_password (null):
. . .

インストールが終了したら、 `+ 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!

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

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

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 +」を使用しますが、http://php.net/manual/en/timezones.php [サポートされているタイムゾーン]を選択できます。

変更された/etc/php5/fpm/php.ini

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =

ファイルを保存して終了します。 変更を適用するには、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 +`の値を置き換えることを忘れないでください。

/ etc / nginx / sites-available / default

server {
   server_name ;
   root /var/www//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 +」を使用しますが、http://php.net/manual/en/timezones.php [サポートされているタイムゾーン]を選択できます。

変更された/etc/php5/fpm/php.ini

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone =

ファイルを保存して終了します。 次に、デフォルトの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

次のコンテンツをファイルに貼り付けます。

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

<VirtualHost *:80>

   DocumentRoot /var/www//web
   <Directory /var/www//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>



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

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

sudo a2enmod rewrite

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

sudo service apache2 restart

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

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

image:https://assets.digitalocean.com/articles/symfony_1404/todo-symfony.png [Symfony To-Doアプリのプレビュー]

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

結論

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

Related