Ano*_*ous 6 nginx docker asp.net-core-mvc kestrel-http-server asp.net-core
问题描述:
当我访问应该返回我的远程客户端的 IP 地址的 Asp.net MVC Core 3.1 网页时,我反而获得了 Nginx 容器的内部 docker IP。我不确定问题是我在 asp.net core 中的代码,Nginx 反向代理配置没有将我的客户端 ip 转发到 Kestrel 容器,还是其他什么。
输出:
::ffff:172.23.0.3
所需的输出(使用随机 ip 的示例):
231.43.6.124
设置:
配置文件
http {
        upstream backendservers {
                server kestrel:80;
        }
        server {
                listen 80;
                location / {
                        proxy_pass http://backendservers/;
                        proxy_set_header Host $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-Host $host:443;
                        proxy_set_header X-Forwarded-Server $host;
                        proxy_set_header X-Forwarded-Port 443;
                        proxy_set_header X-Forwarded-Proto https;
                }
        }
}
events {
}
asp.net核心代码
// controller
public IActionResult GetIP()
{
   var ip = HttpContext.Connection.RemoteIpAddress.ToString();
   ViewBag.ip = ip;
   return View();
}
// view
@{
    ViewData["Title"] = "Get IP";
}
<div class="text-center">
   <p>@ViewBag.ip</p>
</div>
Docker 启动:
docker network create --driver=bridge stacknet
docker run -d --name=kestrel --restart=always -h kestrel.local --network=stacknet mykestrelimage
docker run -d --name=nginx --restart=always  -p 80:80 -h nginx.local --network=stacknet mynginximage
更新 1: 作为测试,我打开了 Kestrel 80 端口。当我直接点击 Kestrel 时,我可以获得客户端 IP,但当它通过 Nginx 反向代理来时,我无法获得它。
更新 2: 根据以下答复之一的建议向 ngix.conf 添加了一些行,但似乎没有什么区别。
我有类似的问题,这是我尝试过的,它解决了我的问题..
/etc/nginx/sites-available/
您将找到您像这样配置服务器的默认文件。Run Code Online (Sandbox Code Playgroud)server{ server_name example.com; location / { proxy_pass http://localhost:4000; proxy_set_header X-Real-IP $remote_addr; <---Add this line proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; <---this line too }
2. /nginx 文件夹中还会有一个名为 proxy_params 的文件,请确保此文件中有以下几行。
Run Code Online (Sandbox Code Playgroud)proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Run Code Online (Sandbox Code Playgroud)const ipAddress = req.headers['x-forwarded-for'] as string;
也可以通过这个命令查看请求ip。
Run Code Online (Sandbox Code Playgroud)$ sudo tail -f /var/log/nginx/access.log
您可能需要转发原始IP。这是 NGinx 关于该主题的文档:https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/
旧版 x-forwarded-for 的示例来自:https://plone.lucidsolutions.co.nz/web/reverseproxyandcache/setting-nginx-http-x-forward-headers-for-reverse-proxy
location / {
  proxy_pass              http://upstream/;
  proxy_set_header        Host               $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-Host   $host:443;
  proxy_set_header        X-Forwarded-Server $host;
  proxy_set_header        X-Forwarded-Port   443;
  proxy_set_header        X-Forwarded-Proto  https;
}
| 归档时间: | 
 | 
| 查看次数: | 7503 次 | 
| 最近记录: |