ASP.NET CoreでWebアプリを作りました。
Linuxサーバ(Debian 8.6)にNginxを入れて、リバースプロキシの設定を行い、デプロイして、動きました。
でも、クライアントのIPアドレス(REMOTE_ADDR)が127.0.0.1になっています・・・
そんなときの解決法。
- .NETCoreApp 1.1
- Debian 8.6
- Nginx 1.6.2
#アプリ側の設定
##Configureに追記
公式ドキュメントの通り、Startup.cs の Configure メソッド内に下記を追記します。
app.UseMvcの記述よりも先に書きます。
// クライアントのIPアドレスを取得するため、NginxのProxyヘッダを使う設定
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
##クライアントIPアドレスの表示
HttpContextの、Connectionプロパティから取得できます。
テストのため、アクションメソッドでViewDataにセットして、Viewに表示します。
public class HomeController : Controller
{
public IActionResult Index()
{
ViewData["RemoteAddress"] = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
return View();
}
}
#Nginxの設定
##HttpRealModule設定ファイルの作成
バックエンド側のサーバ(Kestrel)で、X-Forwarded-For の値をクライアントのIPアドレスとして使用するようするため、HttpRealModuleを使います。
# vi /etc/nginx/conf.d/realip.conf
set_real_ip_from 127.0.0.1;
set_real_ip_from ::1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
このファイルは、/etc/nginx/nginx.conf から自動的に読み込まれます。
##サイトファイルの編集
ASP.NETサイト用にファイル(dotnetapp)を作ります。
Debian の Nginxパッケージには、proxy_paramsファイルが既に用意されているので、それをincludeします。
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_cache_bypass $http_upgrade;
include /etc/nginx/proxy_params; # 追記します
}
}
"proxy_xxx"の設定は、公式ドキュメントの通りに記述しています。
ちなみに、/etc/nginx/proxy_params ファイルの内容は、下記のようになっていました。
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
作成したサイトを有効にします。
# rm /etc/nginx/sites-enabled/default
# ln -s /etc/nginx/sites-available/dotnetapp /etc/nginx/sites-enabled/
# systemctl restart nginx.service
これでめでたく、クライアントのIPアドレスがアプリから取得できるようになりました。
#参考ページ