NginxをリバースプロキシとしたLinuxでASP.NET Coreをホストする

オウルです。

前回の続編です。今回は、WSL Ubuntu 環境下で ASP.NET Core App に要求を転送するように Nginxリバースプロキシサーバーとして設定します。

ローカル環境

Client OS Windows10
WSL Ubuntu 18.04.2 LTS
Editor Visual Studio Code
SDK ASP.NET Core 3.1
Web Server Nginx
RDBMS SQLite 3.22.0

WSL に Ubuntu 18.04.2 LTS をインストールする方法は、こちらの記事を参考にしてください。

Nginx

Nginx は、OSS な Webサーバです。ASP.NET Core のプロジェクトテンプレートには、Kestrel(Web サーバー)が含まれていますが、なぜ Nginx をリバースプロキシサーバーとして設定する必要があるのでしょう。これについては、Microsoft のドキュメントに、以下の説明がありました。

Kestrel は、ASP.NET Core から動的なコンテンツを提供するのに役立ちます。 ただし、Web サーバーとしての機能は、IIS、Apache、Nginx などのサーバーと比べると制限されます。 リバース プロキシ サーバーは、静的コンテンツ サービス、要求のキャッシュ、要求の圧縮、HTTP サーバーからの HTTPS 終了などの作業の負荷を軽減します。

インストール

コマンドプロンプトを起動して、次のコマンドを実行します。

設定

userディレクティブ

nginx.conf にある userディレクティブワーカープロセスで使用されるユーザーとグループの資格情報を定義) 確認します。

自己証明書作成

TLS で接続するために、自己証明書を作成しておきます。

serverディレクティブ

serverディレクティブ を設定します。

まずは、全てのリクエストを Kestrel に転送するようにします。上記は Microsoft の Nginx 搭載の Linux で ASP.NET Core をホストする を参考にしていますが、try_files を変更しています。

try_files

デフォルトのコードのままだと ASP.NET Core identityIdentity エリアへルーティングされないのでコメントアウト。おそらく ASP.NET Cor 側のエリアルーティングの話だと思うので、これは ASP.NET Core MVC + ASP.NET Core identity(Razor クラスライブラリ) のテーマで取り上げたいと思います。

Nginx で SSL/TLS 通信を終了、http で Kestrel に転送させています。

HTTPS server プロトコルと暗号スイート

Nignx を HTTPS server として構成した場合のプロトコルのデフォルトは、「TLSv1 TLSv1.1 TLSv1.2」で、暗号スイートのデフォルトは、「HIGH:!aNULL:!MD5」です。

上記の「HIGH:!aNULL:!MD5」って何?と気になった方は、↓ をご覧ください。セキュリティについて、とても参考になる・使えるリファレンスをまとめています。

起動

次のコマンドを実行します。

nginx has one master process and several worker processes. The main purpose of the master process is to read and evaluate configuration, and maintain worker processes. Worker processes do actual processing of requests. nginx employs event-based model and OS-dependent mechanisms to efficiently distribute requests among worker processes. The number of worker processes is defined in the configuration file and may be fixed for a given configuration or automatically adjusted to the number of available CPU cores (see worker_processes).

SQLite

以下のコマンドを実行します。

ASP.NET Core App 発行

前回作成した ASP.NET Core Web App の Startup.cs を変更して発行します。

Startup.cs

認証スキーム ミドルウェア(app.UseAuthentication() など)を呼び出す前に、UseForwardedHeaders メソッドを呼び出します。ミドルウェアを構成して、X-Forwarded-For および X-Forwarded-Proto ヘッダー(Nginx の location ディレクティブで設定)を転送します。

発行

db ファイル移動

次のコマンドを実行します。

db ファイルを移動したので、忘れずに appsettings.json のパスを変更しておきます。

動作

次のコマンドを実行します。

ブラウザで動作

ユーザ登録時に ”SQLite Error 14: ‘unable to open database file’.” エラーが発生した場合はパーミッションエラーの可能性が高いです(今回は root 起動しているため、ないと思いますが)。db フォルダ(ジャーナルを作成するため rw が必要)、db ファイルのパーミッションをご確認ください。

curl で TLS の接続テスト

次のコマンドを実行して、TLS の接続テストをします。

TLS1.2

SSL3.0

Nignxで 静的ファイルを処理

次に、Nignxで静的ファイル(ここでは CSS)を処理させるように server ディレクティブを変更します。

Nignx 設定変更

server ディレクティブ

要求 URI には優先順位があります。バージョンによって違いがあるため、詳しくは下記リンクのドキュメントをご覧ください。

要求URIに応じて構成を設定

設定を反映

ログを確認

ログ(NLog)に、’/css/site.css’ の出力がなければ OK です。一方、’/js/site.js’ は出力されているはずです。

今回は WSL Ubuntu 環境下で ASP.NET Core App に要求を転送するように Nginx をリバースプロキシサーバーとして設定してみました。プロダクションでは、しっかり権限、セキュリティ対策をしましょう。

nginx実践ガイド (impress top gear)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA