著者は、 Write for DOnations プログラムの一環として寄付を受け取るために、 Software in the Public InterestIncを選択しました。

序章

Symfony は、エレガントな構造を備えたオープンソースのPHPフレームワークであり、サイズに関係なくプロジェクトを開始するのに適したフレームワークであるという評判があります。 再利用可能なコンポーネントのセットとして、その柔軟性、アーキテクチャ、および高性能により、非常に複雑なエンタープライズアプリケーションを構築するための最良の選択肢となっています。

このチュートリアルでは、Ubuntu 18.04でLEMPスタック(Nginx、MySQL、PHP)を使用して、既存の標準のSymfony 4アプリケーションを本番環境にデプロイします。これにより、サーバーとフレームワークの構造の構成を開始できます。 Nginxは、リバースプロキシサポートなどの追加機能を備えた、人気のあるオープンソースの高性能HTTPサーバーです。 それは評判が良く、インターネット上で最大かつ最もトラフィックの多いサイトのいくつかをホストしています。 代わりに独自のSymfonyアプリケーションをデプロイすることを選択した場合、アプリケーションの既存の構造によっては、追加のステップを実装しなければならない場合があります。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Ubuntu18.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー。これには、sudoアクセス権を持つ非rootユーザーとファイアウォールが含まれます。
  • Ubuntu 18.04 にLinux、Nginx、MySQL、PHP(LEMPスタック)をインストールする方法に従ってインストールされたNginx、MySQL、およびPHP。
  • Ubuntu18.04にComposerをインストールして使用する方法の手順1と2に従ってComposerをインストールしました。
  • Ubuntu18.04にGitをインストールする方法に従ってGitをインストールします。

ステップ1—アプリケーションのユーザーとデータベースを作成する

前提条件の手順に従うことで、アプリケーションのインストールに必要なすべての基本的なサーバー依存関係が得られます。 すべての動的Webアプリケーションにはデータベースが必要なため、このセクションでは、ユーザーを作成し、アプリケーションのデータベースを適切に構成します。

アプリケーションとそれに関連付けられたユーザーのMySQLデータベースを作成するには、MySQLルートアカウントを使用してMySQLクライアントにアクセスする必要があります。

  1. mysql -u root -p

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

次に、次のコマンドを使用してアプリケーションデータベースを作成します。

  1. CREATE DATABASE blog;

コンソールに次の出力が表示されます。

Output
Query OK, 1 row affected (0.00 sec)

これで、アプリケーションデータベースが正常に作成されました。 これで、MySQLユーザーを作成し、新しく作成されたデータベースへのアクセスを許可できます。

次のコマンドを実行して、MySQLユーザーとパスワードを作成します。 必要に応じて、ユーザー名とパスワードをより安全なものに変更できます。

  1. CREATE USER 'blog-admin'@'localhost' IDENTIFIED BY 'password';

次の出力が表示されます。

Output
Query OK, 0 rows affected (0.00 sec)

現在、ユーザーblog-adminにはアプリケーションデータベースに対する適切な権限がありません。 実際、 blog-admin が自分のパスワードでログインしようとしても、MySQLシェルに到達することはできません。

ユーザーは、データベースにアクセスしたり、データベースで特定のアクションを実行したりする前に、適切な権限が必要です。 次のコマンドを使用して、blog-adminユーザーのblogデータベースへの完全なアクセスを許可します。

  1. GRANT ALL PRIVILEGES ON blog.* TO 'blog-admin'@'localhost';

次の出力が表示されます。

Output
Query OK, 0 rows affected (0.00 sec)

blog-admin は、blogデータベース内のすべてのテーブルに対するすべての権限を持つようになりました。 付与テーブルをリロードして変更を適用するには、flushステートメントを使用してflush-privilege操作を実行する必要があります。

  1. FLUSH PRIVILEGES;

次の出力が表示されます。

Output
Query OK, 0 rows affected (0.00 sec)

これで、新しいユーザーの作成と特権の付与が完了しました。 順調に進んでいるかどうかをテストするには、MySQLクライアントを終了します。

  1. quit;

そして、作成したMySQLユーザーの資格情報を使用して再度ログインし、プロンプトが表示されたらパスワードを入力します。

  1. mysql -u blog-admin -p

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

  1. SHOW DATABASES;

出力にblogテーブルが表示されます。

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

最後に、MySQLクライアントを終了します。

  1. quit;

これで、デモアプリケーションのユーザーであるデータベースが正常に作成され、新しく作成されたユーザーにデータベースにアクセスするための適切な権限が付与されました。 これで、デモアプリケーションをセットアップする準備が整いました。

ステップ2—デモアプリケーションのセットアップ

このチュートリアルを簡単にするために、Symfonyで構築されたブログアプリケーションをデプロイします。 このアプリケーションを使用すると、認証されたユーザーがブログ投稿を作成してデータベースに保存できます。 さらに、アプリケーションユーザーは、作成者に関連付けられているすべての投稿と詳細を表示できます。

このチュートリアルでデプロイするブログアプリケーションのソースコードは、GitHubです。 Git を使用して、GitHubからアプリケーションのソースコードをプルし、新しいディレクトリに保存します。

まず、アプリケーションのルートディレクトリとして機能するディレクトリを作成します。 したがって、コンソールから次のコマンドを実行して、symfony-blogという名前の新しいディレクトリを作成します。

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

root以外のユーザーアカウントを使用してプロジェクトファイルを操作するには、次のコマンドを実行してフォルダーの所有者とグループを変更する必要があります。

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

sammyをsudoのroot以外のユーザー名に置き換えます。

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

  1. cd /var/www
  2. git clone https://github.com/yemiwebby/symfony-blog.git symfony-blog

次の出力が表示されます。

Output
Cloning into 'symfony-blog'... remote: Counting objects: 180, done. remote: Compressing objects: 100% (122/122), done. remote: Total 180 (delta 57), reused 164 (delta 41), pack-reused 0 Receiving objects: 100% (180/180), 167.01 KiB | 11.13 MiB/s, done. Resolving deltas: 100% (57/57), done.

これでデモアプリケーションが設定されました。 次のステップでは、環境変数を構成し、プロジェクトに必要な依存関係をインストールします。

ステップ3—アプリケーションの環境変数を構成する

アプリケーションを完全にセットアップするには、プロジェクトの依存関係をインストールし、アプリケーションパラメーターを適切に構成する必要があります。

デフォルトでは、Symfonyアプリケーションは開発モードで実行され、デバッグの目的で非常に詳細なログを提供します。 これは、このチュートリアルで行っていることには当てはまりません。また、本番環境では、処理速度が低下し、非常に大きなログファイルが作成される可能性があるため、適切な方法ではありません。

symfonyは、アプリケーションを実稼働環境で実行していることを認識する必要があります。 これを設定するには、変数宣言を含む.envファイルを作成するか、環境変数を直接作成します。 .envファイルを使用して、このアプリケーションのデータベースクレデンシャルを構成することもできるため、これを行う方が理にかなっています。 作業ディレクトリを複製されたプロジェクトに変更し、次のコマンドを使用して.envファイルを作成します。

  1. cd symfony-blog
  2. sudo nano .env

次の行をファイルに追加して、実稼働アプリケーション環境を構成します。

.env
APP_ENV=prod
APP_DEBUG=0

APP_ENVは、アプリケーションが本番環境にあることを指定する環境変数であり、APP_DEBUGは、アプリケーションをデバッグモードで実行するかどうかを指定する環境変数です。 今のところ、falseに設定しています。

ファイルを保存して、エディターを終了します。

次に、SymfonyアプリがXMLを処理するために使用するPHP拡張機能をインストールします。

  1. sudo apt install php7.2-xml

次に、プロジェクトの依存関係をインストールし、composer installを実行する必要があります。

  1. cd /var/www/symfony-blog
  2. composer install

これで、環境変数が正常に構成され、プロジェクトに必要な依存関係がインストールされました。 次に、データベースのクレデンシャルを設定します。

ステップ4—データベースクレデンシャルの設定

以前に作成したアプリケーションのデータベースからデータを取得するには、Symfonyアプリケーション内から必要なデータベースクレデンシャルを設定および構成する必要があります。

.envファイルをもう一度開きます。

  1. sudo nano .env

次のコンテンツをファイルに追加します。これにより、データベースに簡単に接続して適切に操作できるようになります。 .envファイル内のAPP_DEBUG=0行の直後に追加できます。

.env
...
DATABASE_URL=mysql://blog-admin:password@localhost:3306/blog

Symfonyフレームワークは、Doctrineと呼ばれるサードパーティのライブラリを使用してデータベースと通信します。 Doctrineは、データベースとの対話を簡単かつ柔軟にするための便利なツールを提供します。

これで、Doctrineを使用して、複製されたGithubアプリケーションのテーブルでデータベースを更新できます。 これを行うには、次のコマンドを実行します。

  1. php bin/console doctrine:schema:update --force

次の出力が表示されます。

Output
Updating database schema... 4 queries were executed [OK] Database schema updated successfully!

必要な資格情報を設定し、データベーススキーマを更新した後、データベースを簡単に操作できるようになりました。 いくつかのデータを使用してアプリケーションを起動するために、次のセクションでダミーデータのセットをデータベースにロードします。

ステップ5—Doctrine-Fixturesを使用してデータベースにデータを入力する

現時点では、新しく作成されたテーブルは空です。 doctrine-fixturesを使用してデータを入力します。 Doctrine-Fixturesの使用はSymfonyアプリケーションの前提条件ではなく、アプリケーションにダミーデータを提供するためにのみ使用されます。

次のコマンドを実行して、authorとサンプルpostの詳細を含むテストデータをブログ用に作成されたデータベーステーブルに自動的にロードします。

  1. php bin/console doctrine:fixtures:load

データベースが削除されるという警告が表示されます。 先に進んでYと入力できます。

Output
Careful, database will be purged. Do you want to continue y/N ? y > purging database > loading App\DataFixtures\ORM\Fixtures

次のセクションでは、キャッシュをクリアしてウォームアップします。

ステップ6—キャッシュのクリアとウォーミングアップ

ユーザーがリクエストを行うときにアプリケーションの読み込みを高速化するには、デプロイ中にキャッシュをウォームアップすることをお勧めします。 キャッシュをウォームアップすると、ページが生成されて保存され、完全に新しいページを作成するのではなく、後で応答を高速化できます。 幸い、Symfonyには、ウォームアップをトリガーするキャッシュをクリアするコマンドがあります。 その目的のために次のコマンドを実行します。

  1. php bin/console cache:clear

次の出力が表示されます。

Output
Clearing the cache for the prod environment with debug false [OK] Cache for the "prod" environment (debug=false) was successfully cleared.

セットアップは少しで完了します。 残っているのは、Webサーバーを構成することだけです。 次のセクションでそれを行います。

ステップ7—Webサーバーの構成とアプリケーションの実行

これで、ページを提供するためのNginxと、データを保存および管理するためのMySQLがインストールされました。 ここで、デフォルトのブロックを編集する代わりに、新しいアプリケーションサーバーブロックを作成してWebサーバーを構成します。

次のコマンドで新しいサーバーブロックを開きます。

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

次のコンテンツを新しいサーバーブロック構成ファイルに追加します。 サーバーブロック内のyour_server_ipをサーバーのIPアドレスに置き換えてください。

/ etc / nginx / sites-available / blog

server {
    listen 80;
    listen [::]:80;

    server_name blog your_server_ip;
    root /var/www/symfony-blog/public;
    index index.php;
    client_max_body_size 100m;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php {
        try_files $uri /index.php =404;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_index index.php;
        include fastcgi_params;
      }

    location ~ /\.(?:ht|git|svn) {
        deny all;
    }
}

まず、Nginxにlistenディレクティブを指定しました。これは、デフォルトでポート80にあります。次に、サーバーのIPアドレスの要求に一致するようにサーバー名を設定します。 次に、rootディレクティブを使用して、プロジェクトのドキュメントルートを指定しました。 symfony-blogアプリケーションは/var/www/symfony-blogに保存されますが、ベストプラクティスに準拠するために、/publicサブディレクトリのみを公開する必要があるため、Webルートを/var/www/symfony-blog/publicに設定します。インターネットに。 最後に、PHP処理を処理するようにlocationディレクティブを構成しました。

コンテンツを追加したら、ファイルを保存してエディターを終了します。

注:前提条件の記事「Ubuntu18.04にLinux、Nginx、MySQL、PHP(LEMPスタック)をインストールする方法」でファイルexample.comを作成した場合は、sites-enabledからファイルを削除してください。 ]ディレクトリにsudo rm /etc/nginx/sites-enabled/example.comがあるため、この新しいファイルと競合しません。

新しく作成したサーバーブロックを有効にするには、次のコマンドを使用して、/etc/nginx/sites-availableディレクトリにある新しいサーバーブロック構成ファイルから/etc/nginx/sites-enabledへのシンボリックリンクを作成する必要があります。

  1. sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/

次のコマンドを実行して、新しい構成ファイルに構文エラーがないか確認します。

  1. sudo nginx -t

このコマンドは、エラーがある場合はコンソールに出力します。 エラーが発生しなくなったら、次のコマンドを実行してNginxをリロードします。

  1. sudo systemctl reload nginx

これで、Symfony4アプリケーションを正常にデプロイするために必要な最後のステップが完了しました。 サーバーブロックを作成してWebサーバーを構成し、WebアプリケーションにアクセスできるようにWebルートを適切に設定しました。

最後に、アプリケーションを実行してテストできます。 お気に入りのブラウザでhttp://your_server_ipにアクセスします。

次の画像は、サーバーのIPアドレスに表示されるSymfonyブログアプリケーションのスクリーンショットです。

Alt screenshot of the Symfony blog application

結論

Symfonyは、それを使用してソフトウェアを構築する開発者がWeb開発を楽しくするアーキテクチャを備えた機能豊富なPHPフレームワークです。 Symfonyは機能豊富なWeb開発フレームワークであり、開発者にWebアプリケーションを構築するための強力なツールを提供します。 柔軟性があるため、エンタープライズアプリケーションに適していると見なされることがよくあります。 典型的なSymfonyアプリケーションをデプロイする手順は、セットアップ、複雑さ、およびアプリケーションの要件によって異なります。

このチュートリアルでは、LEMPを実行しているUbuntu18.04サーバー上の本番環境にSymfony4アプリケーションを手動でデプロイしました。 これで、この知識を独自のSymfonyアプリケーションのデプロイに適用できます。