Nginxでのデプロイ¶
Nginxは非常に高速で、実戦で証明されており、設定が簡単なHTTPサーバーおよびプロキシです。VaporはTLSありまたはなしでHTTPリクエストを直接提供することをサポートしていますが、Nginxの背後でプロキシすることで、パフォーマンス、セキュリティ、使いやすさが向上します。
Note
Vapor HTTPサーバーをNginxの背後でプロキシすることをお勧めします。
概要¶
HTTPサーバーをプロキシするとはどういう意味でしょうか?簡単に言えば、プロキシはパブリックインターネットとあなたのHTTPサーバーの間の仲介者として機能します。リクエストはプロキシに届き、その後Vaporに送信されます。
この仲介プロキシの重要な機能は、リクエストを変更したり、リダイレクトしたりできることです。例えば、プロキシはクライアントにTLS(https)の使用を要求したり、リクエストをレート制限したり、Vaporアプリケーションと通信せずにパブリックファイルを提供したりできます。
詳細¶
HTTPリクエストを受信するデフォルトのポートはポート80
(HTTPSの場合は443
)です。Vaporサーバーをポート80
にバインドすると、サーバーに届くHTTPリクエストを直接受信して応答します。Nginxのようなプロキシを追加する場合、Vaporを8080
のような内部ポートにバインドします。
Note
1024より大きいポートはバインドにsudo
を必要としません。
Vaporが80
または443
以外のポートにバインドされている場合、外部のインターネットからアクセスできません。次に、Nginxをポート80
にバインドし、ポート8080
(または選択したポート)にバインドされたVaporサーバーにリクエストをルーティングするように設定します。
以上です。Nginxが適切に設定されていれば、Vaporアプリがポート80
でリクエストに応答しているのが見えるでしょう。Nginxはリクエストとレスポンスを透過的にプロキシします。
Nginxのインストール¶
最初のステップはNginxのインストールです。Nginxの素晴らしい点の1つは、それを取り巻く膨大なコミュニティリソースとドキュメントです。このため、特定のプラットフォーム、OS、プロバイダー向けのチュートリアルがほぼ確実に存在するため、ここではNginxのインストールについて詳しく説明しません。
チュートリアル:
- Ubuntu 20.04にNginxをインストールする方法
- Ubuntu 18.04にNginxをインストールする方法
- CentOS 8にNginxをインストールする方法
- Ubuntu 16.04にNginxをインストールする方法
- HerokuにNginxをデプロイする方法
パッケージマネージャー¶
NginxはLinux上のパッケージマネージャーを通じてインストールできます。
Ubuntu¶
sudo apt-get update
sudo apt-get install nginx
CentOSとAmazon Linux¶
sudo yum install nginx
Fedora¶
sudo dnf install nginx
インストールの検証¶
ブラウザでサーバーのIPアドレスにアクセスして、Nginxが正しくインストールされたか確認します
http://server_domain_name_or_IP
サービス¶
サービスは開始または停止できます。
sudo service nginx stop
sudo service nginx start
sudo service nginx restart
Vaporの起動¶
Nginxはsudo service nginx ...
コマンドで開始と停止ができます。Vaporサーバーを開始と停止するための同様のものが必要になります。
これを行う方法は多くあり、デプロイ先のプラットフォームによって異なります。Vaporアプリを開始と停止するコマンドを追加するには、Supervisorの手順を確認してください。
プロキシの設定¶
有効なサイトの設定ファイルは/etc/nginx/sites-enabled/
にあります。
新しいファイルを作成するか、/etc/nginx/sites-available/
からサンプルテンプレートをコピーして始めます。
以下は、ホームディレクトリにあるHello
というVaporプロジェクトの設定ファイルの例です。
server {
server_name hello.com;
listen 80;
root /home/vapor/Hello/Public/;
location @proxy {
proxy_pass http://127.0.0.1:8080;
proxy_pass_header Server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 3s;
proxy_read_timeout 10s;
}
}
この設定ファイルは、Hello
プロジェクトがプロダクションモードで起動したときにポート8080
にバインドすることを前提としています。
ファイルの提供¶
NginxはVaporアプリに尋ねることなくパブリックファイルを提供することもできます。これにより、高負荷時にVaporプロセスを他のタスクのために解放し、パフォーマンスを向上させることができます。
server {
...
# すべてのpublic/staticファイルをnginx経由で提供し、残りはVaporにフォールバック
location / {
try_files $uri @proxy;
}
location @proxy {
...
}
}
TLS¶
証明書が適切に生成されていれば、TLSの追加は比較的簡単です。無料でTLS証明書を生成するには、Let's Encryptを確認してください。
server {
...
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/hello.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/hello.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
...
location @proxy {
...
}
}
上記の設定は、NginxでのTLSの比較的厳格な設定です。ここにある設定の一部は必須ではありませんが、セキュリティを強化します。