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ユーザーがアクセスできる新しいデータベースを作成しましょう。
MySQLにログインします root
管理者アカウント。
- mysql -u root -p
インストール中にMySQLrootアカウントに設定したパスワードの入力を求められます。
と呼ばれる新しいデータベースを作成することから始めます laravel
、これは私たちがウェブサイトに使用するものです。 別の名前を選択することもできますが、後で必要になるため、必ず覚えておいてください。
- 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—デモアプリケーションのセットアップ
デモ quickstart
LaravelがGitHubで配布しているアプリケーションは、単純なタスクリストです。 これにより、やること項目を追加および削除し、そのタスクを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アプリケーションに必要な手順です。
Laravel環境設定ファイルをで開きます nano
またはお気に入りのテキストエディタ。
- sudo nano /var/www/html/quickstart/.env
ファイルに次の変更を加える必要があります。 次のようなプレースホルダー変数を更新してください password
と example.com
、適切な値を使用します。
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つ目はデータベース構成用です。
アプリケーション構成セクション:
-
The
APP_ENV
変数は、アプリケーションが実行されるシステム環境を示します。 デフォルト値はlocal
これは、ローカル開発環境に使用されます。 本番デプロイメントの場合は、次のように変更する必要がありますproduction
、ここで行ったように。 この変数を変更すると、ログの詳細度、キャッシュ設定、およびエラーの表示方法(アプリによって異なります)が制御されます。 とlocal
設定では、開発とデバッグを容易にするように設定されています。これは、アプリでの作業中に便利ですが、本番環境では使用しないでください。 -
The
APP_DEBUG
可変補数APP_ENV
デバッグ情報と詳細なエラー表示を明示的に有効または無効にします。 本番環境では、この値を次のように設定する必要がありますfalse
デバッグ情報がユーザーに表示されないようにするため。 -
The
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
必要な変更はいくつかあります。
- の削除
default_server
からの指定listen
指令、 - を変更してWebルートを更新する
root
指令、 - の更新
server_name
サーバーのドメイン名を正しく指すように指示します。 - を変更してリクエストURI処理を更新する
try_files
指令。
変更されたNginx構成ファイルは次のようになります。
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;
}
. . .
}
これらの変更について詳しく説明しましょう。
The listen
デフォルトの設定ファイルのディレクティブには、 default_server
オプションが有効になっています。これは、他のサーバーブロックが適切でない場合に、サーバーブロックが要求を処理する必要があることを指定します。 このオプションを有効にできるのは、有効なサーバーブロックの1つだけです。 デフォルトのサーバーブロックをそのまま残したので、 default_server
この2番目の構成ファイルからの指定。
The root
ディレクティブは、アプリケーションファイルが保存される場所を指定します。 Laravelアプリケーションはに保存されます /var/www/html/quickstart
、しかし /public
サブディレクトリはインターネットに公開する必要があります。 他のすべてのアプリケーションファイルには、ブラウザからアクセスできないようにする必要があります。 これらのベストプラクティスに準拠するために、Webルートを次のように設定します。 /var/www/html/quickstart/public
.
The server_name
ディレクティブは、サーバーブロックが応答するドメイン名のリストを指定します。 使用しました example.com
と www.example.com
ここでは、それらをWebサイトに使用するドメイン名に置き換える必要があります。
リクエストURIの処理も変更しました。 デフォルト設定では、Webサーバーに既存のファイルを検索し、次に既存のディレクトリを検索するか、最後に404 Not Foundエラーをスローするように指示します(組み込みを使用) =404
設定)。 Laravelが正しく機能するには、すべてのリクエストをLaravel自体にルーティングする必要があります。 これは、Nginxのデフォルトの404エラーハンドラーを削除して、 /index.php?$query_string
、リクエストクエリをに渡します index.php
ファイル、メインのLaravelアプリケーションファイル。
上記の変更を行ったら、ファイルを保存して閉じることができます。 このファイルからのシンボリックリンクを作成して、新しい構成ファイルを有効にする必要があります。 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アプリのセットアップに対応するためにいくつかの小さな変更を加えます。
唯一の変更は次のとおりです。
- Laravelアプリケーションの場所を使用する(
/var/www/html/quickstart
)デフォルトのWebルートの代わりに(/var/www/html
)SSL証明書を要求する場合。 - の変更
/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
構成ファイルは次のようになります
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証明書が完全に配置され、アプリケーションは安全な接続を介して利用できるようになります。 すべてが期待どおりに機能するかどうかを確認するには、次のWebサイトにアクセスしてください。 https://example.com
. 以前と同じ申請フォームが表示されますが、今回は接続が完全に保護されます。
結論
これで、Laravelに同梱されているデモアプリケーションをLEMPスタックを使用して本番環境に正常にデプロイできました。 実際のアプリケーションでは、構成タスクのリストに、より多くのステップとアプリケーション固有のアクションが含まれる場合があります。 疑問がある場合は、デプロイするアプリケーションのドキュメントを常に参照してください。ただし、公式のLaravelドキュメントにも多くの役立つ情報があります。