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毎に変えれば同じサーバで複数公開出来そうだ。