Ubuntu16.04でNginxを使用してLaravelアプリケーションをデプロイする方法
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依存関係マネージャーが必要です。
パッケージマネージャーのキャッシュを更新することから始めます。
sudo apt-get update
必要なPHP拡張機能は、マルチバイト文字列のサポートとXMLのサポートです。 これらの拡張機能、Composer、およびunzip
(Composerがzipファイルを処理できるようにする)を同時にインストールできます。
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
管理者アカウントにログインします。
mysql -u root -p
インストール中にMySQLrootアカウントに設定したパスワードの入力を求められます。
laravel
という新しいデータベースを作成することから始めます。これは、Webサイトに使用するものです。 別の名前を選択することもできますが、後で必要になるため、必ず覚えておいてください。
CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
次に、このデータベースへのアクセスを許可する新しいユーザーを作成します。 ここでは、ユーザー名としてlaraveluser
を使用していますが、これもカスタマイズできます。 次の行のpassword
は、強力で安全なパスワードに置き換えることを忘れないでください。
GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';
権限をフラッシュして、MySQLサーバーに変更を通知します。
FLUSH PRIVILEGES;
そして、MySQLを終了します。
EXIT;
これで、Laravelが使用する専用データベースとユーザーアカウントが構成されました。 データベースコンポーネントの準備ができたので、次に、デモアプリケーションをセットアップします。
ステップ3—デモアプリケーションのセットアップ
LaravelがGitHubで配布しているデモquickstart
アプリケーションは、単純なタスクリストです。 これにより、やること項目を追加および削除し、そのタスクをMySQLデータベースに保存できます。
まず、アプリケーションを保持するNginxWebルート内にディレクトリを作成します。 デモアプリケーションの名前はquickstart
なので、/var/www/html/quickstart
を使用しましょう。
sudo mkdir -p /var/www/html/quickstart
次に、新しく作成したディレクトリの所有権をユーザーに変更して、sudo
を使用せずに内部のファイルを操作できるようにします。
sudo chown sammy:sammy /var/www/html/quickstart
新しいディレクトリに移動し、Gitを使用してデモアプリケーションのクローンを作成します。
cd /var/www/html/quickstart git clone https://github.com/laravel/quickstart-basic .
Gitは、デモアプリケーションリポジトリからすべてのファイルをダウンロードします。 次のような出力が表示されます。
Git outputCloning 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を利用して依存関係の管理を処理します。これにより、必要なパッケージを一度に簡単にインストールできます。
composer install
やや長い出力には、すべてのプロジェクト依存関係のインストールの進行状況が表示されます。
Composer outputLoading 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環境設定ファイルを開きます。
sudo nano /var/www/html/quickstart/.env
ファイルに次の変更を加える必要があります。 password
やexample.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
は、そのユーザーのデータベースパスワードです。
次に、データベース移行を実行する必要があります。これにより、新しく作成されたデータベースに、デモアプリケーションを正しく実行するために必要なテーブルが追加されます。
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に変更してみましょう。
sudo chgrp -R www-data storage bootstrap/cache
次に、書き込みと実行を含むすべてのアクセス許可をグループに再帰的に付与します。
sudo chmod -R ug+rwx storage bootstrap/cache
これで、すべてのデモアプリケーションファイルが適切な権限で配置されました。 次に、Laravelのインストールで正しく機能するようにNginxの構成を変更する必要があります。 まず、デフォルトのファイルをコピーして、アプリケーション用の新しいサーバーブロック構成ファイルを作成しましょう。
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
新しく作成した構成ファイルを開きます。
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.com
とwww.example.com
を使用しましたが、これらをWebサイトで使用するドメイン名に置き換える必要があります。
リクエストURIの処理も変更しました。 デフォルト設定では、Webサーバーに既存のファイルを検索し、次に既存のディレクトリを検索するか、最後に404 Not Foundエラーをスローするように指示します(組み込みの=404
設定を使用)。 Laravelが正しく機能するには、すべてのリクエストをLaravel自体にルーティングする必要があります。 これは、Nginxのデフォルトの404エラーハンドラーを削除して/index.php?$query_string
に設定することを意味します。これにより、リクエストクエリがメインのLaravelアプリケーションファイルであるindex.php
ファイルに渡されます。
上記の変更を行ったら、ファイルを保存して閉じることができます。 このファイルからsites-enabled
ディレクトリへのシンボリックリンクを作成して、新しい構成ファイルを有効にする必要があります。
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
そして最後にNginxをリロードして、変更を考慮に入れます。
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
構成ファイルを変更します。
具体的には、証明書を取得するためのコマンドは次のようになります。
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; } }
構成に構文エラーがないことを確認してください。
sudo nginx -t
すべての変更が成功した場合、次のような結果が得られます。
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
その場合は、Nginxを安全に再起動して、変更を有効にすることができます。
sudo systemctl restart nginx
Let's Encrypt TLS / SSL証明書が完全に配置され、アプリケーションは安全な接続を介して利用できるようになります。 すべてが期待どおりに機能するかどうかを確認するには、https://example.com
にアクセスしてください。 以前と同じ申請フォームが表示されますが、今回は接続が完全に保護されます。
結論
これで、Laravelに同梱されているデモアプリケーションをLEMPスタックを使用して本番環境に正常にデプロイできました。 実際のアプリケーションでは、構成タスクのリストに、より多くのステップとアプリケーション固有のアクションが含まれる場合があります。 疑問がある場合は、デプロイするアプリケーションのドキュメントを常に参照してください。ただし、公式のLaravelドキュメントにも多くの役立つ情報があります。