アジョブジ星通信

日常系バンザイ。

ASP.NET 5アプリをUpstartでデーモン化してnginxでリバースプロキシするお話

タイトルで内容が全部終わった。要するに「もう Hello, World だけして満足する時代は終わった。Linuxの本番環境に乗せるぞ」ということです。

dnu publish

合言葉は

dnu publish --configuration Release --no-source --framework dnxcore50

これで CoreCLR 向けにリリースビルドされます。 --no-source を指定することで実行時にソースコードを利用せずコンパイル済みアセンブリを使用するのでパフォーマンスもメモリ使用量も削れるはず。

Upstart スクリプト

start on runlevel [2345]
stop on runlevel [016]

exec DNXのパス/runtimes/dnx-coreclr-linux-x64.1.0.0-rc1-update1/bin/dnx \
    -p ソースコード/src/アプリ名/bin/output/approot/packages/アプリ名/バージョン/root \
    web \
    --server.urls http://localhost:ポート/

respawn

KestrelHttpServer なら Unix ドメインソケットにも対応してます。

nginx

server {
    listen 80;

    location / {
        proxy_pass http://localhost:ポート/;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Connection "keep-alive";
    }
}

Microsoft.AspNet.HttpOverrides パッケージを使うと X-Forwarded ヘッダーをうまいこと使ってくれます。

Connection: keep-alive は指定しておかないと chunked なレスポンスが返ってこなくなります。謎い。

詳しい話

dnu publish することで、パッケージが全コピーされるので、ユーザーにかかわらず実行できるようになります。そもそも publish は別のマシンでやって、それを本番環境にコピーするのが一番いい方法ですね。ただし、 Windows でやって Linux で動かすとなると、 OS 依存のパッケージが違ってくるので死ぬかも。

まとめ

とりあえずこれで https://twpollapi.azyobuzi.net/ は動いているので、 ASP.NET 5 は Linux でも使い物になります。たぶん。