Oh!Super164 取り留めのない日記のような

2020/4/19 日曜日

asp.net core 3.1 + centos7 + apache

Filed under: ASP,備忘録 — pecos @ 0:25:24

asp.net core 3.1で戯れる
dotnet 3.1になって既存のソースとか、ほぼそのままcoreでもビルド出来るようになって来た。これまでMVC5を使って来たのだが、いよいよ将来の移行も視野にasp.net coreを触ってみる。
VisualStudio上で動かすのは簡単だが、いざdeployとなるとどうなんだろう?ということでcentos7上でkestrelをapacheでリバースプロキシ経由で公開するテストをしてみた。vsでランタイムから何から一本のdllにまとめてしまうという素晴らしいオプションでpublishしたバイナリを使用。centos上でそのdllを普通に動かすだけで、そのままwebappが動くのでお気楽だ。
既定ではkestrelを動かすと”http://localhost:5000″として動作するが、これをそのままapache経由で公開するとwebのroot”/”になってしまう(凡例”http://www.example.com/”)。
そこで、外部からは”myapp”とかの名前で公開したい(凡例”http://www.example.com/myapp”)ので、いろいろ試行錯誤した結果を備忘録にしておこう。
まずはasp.net coreのアプリ側の細工:

//1) kestrelで"myapp"がbasepathになるようにする
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
        :
    app.UsePathBase("myapp");
    app.UseStaticFiles();
        :
    app.UseForwardedHeaders(new ForwardedHeadersOptions {
        ForwardedHeaders = ForwardedHeaders.All
    });
        :
}

次にapache側の設定:

#2) apacheのリバースプロキシを設定
<VirtualHost *:*>
        RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}e
</VirtualHost>

<VirtualHost *:80>
        ProxyPreserveHost On
        ProxyPass /myapp http://localhost:5000/myapp
        ProxyPassReverse /myapp http://localhost:5000/myapp
        ServerName www.example.com
        <Location /myapp>
                Require all denied
                Require ip 127.0.0.1/32
                Require ip 192.168.0.0/24
        </Location>
</VirtualHost>

これで取りあえずは”myapp”で公開された。
そして更に、オレオレ証明書でhttpsにしたかったので、上記のconfを書き換えた:

#2') apacheのリバースプロキシを設定(https)
<VirtualHost *:*>
        RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}e
</VirtualHost>

<VirtualHost *:80>
        RewriteEngine On
        RewriteCond %{REQUEST_URI} /myapp
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

        <Location /myapp>
                Require all denied
                Require ip 127.0.0.1/32
                Require ip 192.168.0.0/24
        </Location>
</VirtualHost>

<VirtualHost *:443>
        ProxyPreserveHost On
        ProxyPass /myapp http://localhost:5000/myapp
        ProxyPassReverse /myapp http://localhost:5000/myapp
        SSLEngine on
        SSLProtocol all -SSLv2
        SSLCipherSuite ALL:!ADH:!EXPORT:SSLv2:!RC4+RSA:+HIGH:+MEDIUM:!LOW:!RC4
        SSLCertificateFile /etc/pki/tls/certs/localhost.crt
        SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

        <Location /myapp>
                Require all denied
                Require ip 127.0.0.1/32
                Require ip 192.168.0.0/24
        </Location>
</VirtualHost>

ブラウザには最初に怒られるが、構わず続けるとhttpsでアクセスできた。
これなら、kestrelのポートをwebapp毎に変えれば同じサーバで複数公開出来そうだ。

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress