Laravel は、PHPで記述された最も人気のあるオープンソースのWebアプリケーションフレームワークの1つです。 これは、頻繁に使用されるアプリケーションタスク(キャッシュや認証など)を簡単にすることで、開発者が単純なアプリケーションと複雑なアプリケーションの両方を構築できるようにすることを目的としています。

このチュートリアルでは、本番環境を念頭に置いて単純なLaravelアプリケーションをデプロイします。これには、いくつかの一般的な手順が必要です。 たとえば、アプリケーションは、必要なデータベースのみにアクセスが制限された専用のデータベースユーザーを使用する必要があります。 ファイルのアクセス許可は、必要なディレクトリとファイルのみが書き込み可能であることを保証する必要があります。 アプリケーション設定を考慮して、アプリケーション構成の詳細が公開される可能性のあるデバッグ情報がエンドユーザーに表示されないようにする必要があります。

このチュートリアルは、既存のアプリケーションのデプロイに関するものです。 代わりに、Laravelフレームワーク自体の使用方法について知りたい場合は、Laravel独自の Laravel fromScratchシリーズから始めることをお勧めします。

前提条件

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

  • この初期サーバーセットアップチュートリアルでセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
  • Ubuntu16.04チュートリアルLinux、Nginx、MySQL、PHP(LEMPスタック)に従ってインストールされたLEMPスタック。
  • DigitalOcean でホスト名を設定する方法で説明されているように、サーバーを指すドメイン名。 このチュートリアルでは、全体を通してexample.comを使用します。 これは、WebサイトのSSL証明書を取得するために必要です。これにより、TLS暗号化を使用してアプリケーションを安全に提供できます。

ステップ1—パッケージの依存関係をインストールする

Laravelアプリケーションを実行するには、基本的なLEMPスタックに加えて、いくつかのPHP拡張機能とComposerと呼ばれるPHP依存関係マネージャーが必要です。

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

  1. sudo apt-get update

必要なPHP拡張機能は、マルチバイト文字列のサポートとXMLのサポートです。 これらの拡張機能、Composer、およびunzip(Composerがzipファイルを処理できるようにする)を同時にインストールできます。

  1. sudo apt-get install php7.0-mbstring php7.0-xml composer unzip

パッケージの依存関係がインストールされたので、MySQLデータベースとアプリの専用ユーザーアカウントを作成して構成します。

ステップ2—MySQLの構成

Laravelはさまざまなデータベースサーバーをサポートしています。 このチュートリアルではLEM Pスタックを使用するため、MySQLはアプリケーションのデータを保存します。

デフォルトのインストールでは、MySQLはroot管理者アカウントのみを作成します。 root データベースユーザーをWebサイト内で使用することは、データベースサーバーに対する無制限の特権を持っているため、悪いセキュリティ慣行です。 代わりに、Laravelアプリケーションが使用する専用のデータベースユーザーと、Laravelユーザーがアクセスできる新しいデータベースを作成しましょう。

MySQLroot管理者アカウントにログインします。

  1. mysql -u root -p

インストール中にMySQLrootアカウントに設定したパスワードの入力を求められます。

laravelという新しいデータベースを作成することから始めます。これは、Webサイトに使用するものです。 別の名前を選択することもできますが、後で必要になるため、必ず覚えておいてください。

  1. CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

次に、このデータベースへのアクセスを許可する新しいユーザーを作成します。 ここでは、ユーザー名としてlaraveluserを使用していますが、これもカスタマイズできます。 次の行のpasswordは、強力で安全なパスワードに置き換えることを忘れないでください。

  1. GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';

権限をフラッシュして、MySQLサーバーに変更を通知します。

  1. FLUSH PRIVILEGES;

そして、MySQLを終了します。

  1. EXIT;

これで、Laravelが使用する専用データベースとユーザーアカウントが構成されました。 データベースコンポーネントの準備ができたので、次に、デモアプリケーションをセットアップします。

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

LaravelがGitHubで配布しているデモquickstartアプリケーションは、単純なタスクリストです。 これにより、やること項目を追加および削除し、そのタスクをMySQLデータベースに保存できます。

まず、アプリケーションを保持するNginxWebルート内にディレクトリを作成します。 デモアプリケーションの名前はquickstartなので、/var/www/html/quickstartを使用しましょう。

  1. sudo mkdir -p /var/www/html/quickstart

次に、新しく作成したディレクトリの所有権をユーザーに変更して、sudoを使用せずに内部のファイルを操作できるようにします。

  1. sudo chown sammy:sammy /var/www/html/quickstart

新しいディレクトリに移動し、Gitを使用してデモアプリケーションのクローンを作成します。

  1. cd /var/www/html/quickstart
  2. git clone https://github.com/laravel/quickstart-basic .

Gitは、デモアプリケーションリポジトリからすべてのファイルをダウンロードします。 次のような出力が表示されます。

Git output
Cloning into '.'... remote: Counting objects: 263, done. remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263 Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done. Resolving deltas: 100% (72/72), done. Checking connectivity... done.

次に、プロジェクトの依存関係をインストールする必要があります。 LaravelはComposerを利用して依存関係の管理を処理します。これにより、必要なパッケージを一度に簡単にインストールできます。

  1. composer install

やや長い出力には、すべてのプロジェクト依存関係のインストールの進行状況が表示されます。

Composer output
Loading composer repositories with package information Installing dependencies (including require-dev) from lock file . . . Generating autoload files > php artisan clear-compiled > php artisan optimize Generating optimized class loader

アプリ自体がセットアップされているので、次のステップはアプリ環境を構成することです。 これには、アプリケーションとデータベースを接続し、本番用にいくつかの設定をカスタマイズすることが含まれます。

ステップ4—アプリケーション環境の構成

このステップでは、セキュリティ関連のアプリケーション設定を変更し、アプリケーションがデータベースに接続できるようにして、データベースを使用できるように準備します。 これらは、ここで使用しているデモアプリケーションだけでなく、LEMPがサポートするすべてのLaravelアプリケーションに必要な手順です。

nanoまたはお好みのテキストエディタでLaravel環境設定ファイルを開きます。

  1. sudo nano /var/www/html/quickstart/.env

ファイルに次の変更を加える必要があります。 passwordexample.comなどのプレースホルダー変数を適切な値で更新してください。

/var/www/html/quickstart/.env
APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://example.com

DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password

. . .

ファイルを保存して終了します。

これらの変更について詳しく見ていきましょう。 ここには2つの構成ブロックがあります。 1つ目はアプリケーション構成用で、2つ目はデータベース構成用です。

アプリケーション構成セクション:

  • APP_ENV変数は、アプリケーションが実行されるシステム環境を示します。 デフォルト値はlocalで、ローカル開発環境で使用されます。 実稼働環境では、ここで行ったように、productionに変更する必要があります。 この変数を変更すると、ログの詳細度、キャッシュ設定、およびエラーの表示方法(アプリによって異なります)が制御されます。 local設定を使用すると、開発とデバッグが容易になるように設定されます。これは、アプリでの作業中に便利ですが、本番環境では使用しないでください。

  • APP_DEBUG変数は、APP_ENVを補完し、デバッグ情報と詳細なエラー表示を明示的に有効または無効にします。 本番環境のセットアップでは、デバッグ情報がユーザーに表示されないように、この値をfalseに設定する必要があります。

  • APP_URL変数は、サイトにアクセスするためのIPアドレスまたはドメイン名を指定します。 ここではexample.comドメイン名を使用しましたが、Webサイトにアクセスする必要がある独自のドメインに置き換える必要があります。

データベース構成セクションはもう少し簡単です。

  • DB_DATABASEはデータベースの名前です。
  • DB_USERNAMEは、アプリが使用するMySQLユーザーの名前です。
  • DB_PASSWORDは、そのユーザーのデータベースパスワードです。

次に、データベース移行を実行する必要があります。これにより、新しく作成されたデータベースに、デモアプリケーションを正しく実行するために必要なテーブルが追加されます。

  1. php artisan migrate

Artisanは、本番モードで実行するかどうかの確認を求めます。 質問にyと答えてください。 その後、必要なデータベースタスクを実行します。

Artisan output
************************************** * Application In Production! * ************************************** Do you really wish to run this command? [y/N] (yes/no) [no]: > y Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2015_10_27_141258_create_tasks_table

これで、Laravelが完全にインストールおよび構成されました。 次に、アプリケーションを提供するようにNginxを構成する必要があります。

ステップ5—Nginxを構成する

アプリケーションディレクトリは、システムユーザー sammy が所有しており、Webサーバーでは読み取り可能ですが、書き込み可能ではありません。 これはほとんどのアプリケーションファイルに対して正しいですが、特別な処理が必要なディレクトリはほとんどありません。 具体的には、Laravelがアップロードされたメディアとキャッシュされたデータを保存する場所はどこでも、Webサーバーはそれらにアクセスできるだけでなく、それらにファイルを書き込むことができなければなりません。

storageおよびbootstrap/cacheディレクトリのグループ所有権をwww-dataに変更してみましょう。

  1. sudo chgrp -R www-data storage bootstrap/cache

次に、書き込みと実行を含むすべてのアクセス許可をグループに再帰的に付与します。

  1. sudo chmod -R ug+rwx storage bootstrap/cache

これで、すべてのデモアプリケーションファイルが適切な権限で配置されました。 次に、Laravelのインストールで正しく機能するようにNginxの構成を変更する必要があります。 まず、デフォルトのファイルをコピーして、アプリケーション用の新しいサーバーブロック構成ファイルを作成しましょう。

  1. sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

新しく作成した構成ファイルを開きます。

  1. sudo nano /etc/nginx/sites-available/example.com

必要な変更はいくつかあります。

  • listenディレクティブからdefault_server指定を削除します。
  • rootディレクティブを変更して、Webルートを更新します。
  • server_nameディレクティブを更新して、サーバーのドメイン名を正しく指すようにします。
  • try_filesディレクティブを変更して、リクエストURI処理を更新します。

変更されたNginx構成ファイルは次のようになります。

/etc/nginx/sites-enabled/example.com
server {
    listen 80;
    listen [::]:80;
    
    . . .

    root /var/www/html/quickstart/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    . . .
}

これらの変更について詳しく説明しましょう。

デフォルトの構成ファイルのlistenディレクティブでは、default_serverオプションが有効になっています。これは、他のサーバーブロックが適切でない場合に、サーバーブロックが要求を処理する必要があることを指定します。 このオプションを有効にできるのは、有効なサーバーブロックの1つだけです。 デフォルトのサーバーブロックをそのまま残したため、この2番目の構成ファイルからdefault_serverの指定を削除します。

rootディレクティブは、アプリケーションファイルの保存場所を指定します。 Laravelアプリケーションは/var/www/html/quickstartに保存されていますが、インターネットに公開する必要があるのは/publicサブディレクトリのみです。 他のすべてのアプリケーションファイルには、ブラウザからアクセスできないようにする必要があります。 これらのベストプラクティスに準拠するために、Webルートを/var/www/html/quickstart/publicに設定します。

server_nameディレクティブは、サーバーブロックが応答するドメイン名のリストを指定します。 ここではexample.comwww.example.comを使用しましたが、これらをWebサイトで使用するドメイン名に置き換える必要があります。

リクエストURIの処理も変更しました。 デフォルト設定では、Webサーバーに既存のファイルを検索し、次に既存のディレクトリを検索するか、最後に404 Not Foundエラーをスローするように指示します(組み込みの=404設定を使用)。 Laravelが正しく機能するには、すべてのリクエストをLaravel自体にルーティングする必要があります。 これは、Nginxのデフォルトの404エラーハンドラーを削除して/index.php?$query_stringに設定することを意味します。これにより、リクエストクエリがメインのLaravelアプリケーションファイルであるindex.phpファイルに渡されます。

上記の変更を行ったら、ファイルを保存して閉じることができます。 このファイルからsites-enabledディレクトリへのシンボリックリンクを作成して、新しい構成ファイルを有効にする必要があります。

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

そして最後にNginxをリロードして、変更を考慮に入れます。

  1. sudo systemctl reload nginx

これで、デモLaravelアプリケーションを提供するようにNginxが構成されたので、すべてのコンポーネントがセットアップされました。

この時点でデプロイメントが機能していることを確認するのは簡単です。 お気に入りのブラウザでhttp://example.comにアクセスするだけです。 シンプルなタスクアプリのページが表示され、タスクの追加または削除を試すことができます。 行ったすべての変更はデータベースに保存され、その後のWebサイトへのアクセスのために保持されます。これは、ブラウザーを閉じてサイトをもう一度開くことで確認できます。

次の最後のステップでは、安全な接続を介してアプリケーションにサービスを提供するようにTLS暗号化を構成します。

ステップ6—TLSを使用したアプリケーションの保護

本番環境のセットアップを完了するには、TLSを使用して安全なHTTPSを介してアプリケーションを提供することをお勧めします。 これにより、アプリケーションとその訪問者の間のすべての通信が暗号化されます。これは、アプリケーションがログインやパスワードなどの機密情報を要求する場合に特に重要です。

Let’s Encrypt は、WebサイトへのTLSの追加を簡単にする無料の認証局です。 新しくデプロイされたアプリケーションでHTTPSを有効にするために、 Ubuntu 16.04でLet’sEncryptを使用してNginxを保護する方法チュートリアルに従い、この特定のLaravelアプリのセットアップに対応するためにいくつかの小さな変更を加えます。

唯一の変更は次のとおりです。

  • SSL証明書を要求するときに、デフォルトのWebルート(/var/www/html)の代わりにLaravelアプリケーションの場所(/var/www/html/quickstart)を使用します。
  • デフォルトのサーバーブロックファイルの代わりに/etc/nginx/sites-available/example.com構成ファイルを変更します。

具体的には、証明書を取得するためのコマンドは次のようになります。

  1. sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com

そして、/etc/nginx/sites-available/example.com構成ファイルの最終バージョンは次のようになります。

/etc/nginx/sites-enabled/example.com
server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        root /var/www/html/quickstart/public;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

        location ~ /.well-known {
                allow all;
        }
}

構成に構文エラーがないことを確認してください。

  1. sudo nginx -t

すべての変更が成功した場合、次のような結果が得られます。

Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful

その場合は、Nginxを安全に再起動して、変更を有効にすることができます。

  1. sudo systemctl restart nginx

Let’s Encrypt TLS / SSL証明書が完全に配置され、アプリケーションは安全な接続を介して利用できるようになります。 すべてが期待どおりに機能するかどうかを確認するには、https://example.comにアクセスしてください。 以前と同じ申請フォームが表示されますが、今回は接続が完全に保護されます。

結論

これで、Laravelに同梱されているデモアプリケーションをLEMPスタックを使用して本番環境に正常にデプロイできました。 実際のアプリケーションでは、構成タスクのリストに、より多くのステップとアプリケーション固有のアクションが含まれる場合があります。 疑問がある場合は、デプロイするアプリケーションのドキュメントを常に参照してください。ただし、公式のLaravelドキュメントにも多くの役立つ情報があります。