Ubuntu 16.04でNginxを使用してLaravelアプリケーションをデプロイする方法

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

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

このチュートリアルでは、既存のアプリケーションのデプロイについて説明します。 代わりに、Laravelフレームワーク自体の使用方法について学びたい場合は、Laravel自身のhttps://laracasts.com/series/laravel-from-scratch-2017[Laravel from Scratch]シリーズを開始するのに適した場所です。

前提条件

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

手順1-パッケージの依存関係のインストール

Laravelアプリケーションを実行するには、基本的なLEMPスタックに加えて、いくつかのPHP拡張機能とhttps://getcomposer.org/[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はさまざまなデータベースサーバーをサポートしています。 このチュートリアルではLE M Pスタックを使用するため、MySQLはアプリケーションのデータを保存します。

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

MySQL `+ root +`管理アカウントにログインします。

mysql -u root -p

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

まず、「++」という新しいデータベースを作成します。これはウェブサイトで使用するものです。 別の名前を選択することもできますが、後で必要になるため、忘れないようにしてください。

CREATE DATABASE  DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

GRANT ALL ON .* TO ''@'localhost' IDENTIFIED BY '';

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

FLUSH PRIVILEGES;

MySQLを終了します。

EXIT;

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

手順3-デモアプリケーションのセットアップ

デモの `+ quickstart +`アプリケーション、https://github.com/laravel/quickstart-basic [GitHubでLaravelによって配布]は、単純なタスクリストです。 To Doアイテムを追加および削除し、そのタスクをMySQLデータベースに保存できます。

最初に、アプリケーションを保持するNginx Webルート内にディレクトリを作成します。 デモアプリケーションの名前は「+ quickstart 」なので、「 / var / www / html / quickstart +」を使用します。

sudo mkdir -p /var/www/html/

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

sudo chown  /var/www/html/

新しいディレクトリに移動し、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

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

/var/www/html/quickstart/.env

APP_ENV=
APP_DEBUG=
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://

DB_HOST=127.0.0.1
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

. . .

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

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

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

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

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

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

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

  • `+ DB_DATABASE +`はデータベースの名前です。

  • `+ DB_USERNAME +`は、アプリが使用するMySQLユーザーの名前です。

  • `+ DB_PASSWORD +`はそのユーザーのデータベースパスワードです。

次に、https://laravel.com/docs/5.4/migrations [databasemigrations]を実行する必要があります。これにより、デモアプリケーションを適切に実行するために、新しく作成されたデータベースに必要なテーブルが設定されます。

php artisan migrate

Artisanは、実稼働モードで実行するかどうかの確認を求めます。 質問に「+ y +」と答えます。 その後、必要なデータベースタスクを実行します。

Artisan output**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N] (yes/no) [no]:
>

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の設定を変更する必要があります。 まず、https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04 [新しいサーバーブロック構成ファイルを作成しましょう]デフォルトのファイルをコピーしてアプリケーションを作成します。

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/

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

sudo nano /etc/nginx/sites-enabled/

必要な変更はほとんどありません:

  • `+ listen `ディレクティブから ` default_server +`指定を削除し、

  • `+ root +`ディレクティブを変更してWebルートを更新し、

  • サーバーのドメイン名を正しく指すように `+ server_name +`ディレクティブを更新し、

  • `+ try_files +`ディレクティブを変更してリクエストURIの処理を更新します。

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

/etc/nginx/sites-enabled/example.com

server {
   listen
   listen

   . . .

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

   server_name  www.;

   location / {
       try_files $uri $uri/
   }

   . . .
}

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

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

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

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

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

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

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

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

sudo systemctl reload nginx

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

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

次の最後の手順では、TLS暗号化を構成して、安全な接続を介してアプリケーションを提供します。

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

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

Let’s Encryptは無料の認証局で、ウェブサイトにTLSを簡単に追加できます。 新しくデプロイされたアプリケーションでHTTPSを有効にするには、https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16をフォローします-04 [Ubuntu 16.04でLet’s Encryptを使用してNginxを保護する方法]この特定のLaravelアプリのセットアップに対応するためにいくつかの小さな変更を加えたチュートリアル。

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

  • SSL証明書を要求するときに、デフォルトのWebルート( + / var / www / html +)の代わりにLaravelアプリケーションの場所( + / var / www / html / +)を使用します。

  • デフォルトのサーバーブロックファイルの代わりに、 `+ / etc / nginx / sites-available / +`設定ファイルを変更します。

具体的には、証明書を取得するコマンドは次のとおりです。

sudo certbot certonly --webroot --webroot-path= -d  -d

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

/etc/nginx/sites-enabled/example.com

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

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

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

       include snippets/ssl-.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  www.;

       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証明書が完全に配置され、アプリケーションは安全な接続を介して利用可能になります。 すべてが期待どおりに機能するかどうかを確認するには、単に「+:// +」にアクセスします。 以前と同じアプリケーションフォームが表示されますが、今回は接続が完全に保護されます。

結論

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

Related