如何使用 nginx 反向代理 asp.net core

Posted on By 李继龙

前言

最近又双叒叕想搞前端项目了,这次我想玩玩nginx反代asp.net core,按照微软官方文档一顿操作后,输入地址发现是404,然后我就又开始了一顿穷折腾… 与以前稍微有点不同的是这次折腾了很久很久才解决问题

问题截图

nginx配置文件

浏览器实际效果

解决过程

我首先想到的是到群里面问问,很快就有人回复我了,不过这个回复看的我云里雾里,他说“设置请求头固定为你那个地址看看”,其中的地址就是”localhost:5000“,至于请求头是哪个嘛我当时也问了,他说”好像是host-header什么的来着,具体的拼写记不得“,然后就没下文了,于是我就去折腾nginx了,折腾了很久啥用都没

第二天,我想着是不是跨域问题弄得呢,然后我就必应去了,一顿操作下来后还是啥用都没,然后这个问题就被我搁置了几天,没办法,毕竟人不能在一棵树上吊死

几天后我突发灵感,想着是不是监听地址的问题,于是我做了个三步曲,一发布,二修改监听地址,三修改nginx配置文件 一顿操作后,打开浏览器,输入地址,敲回车… omg,终于不是404了!

正文

首先在Setup.cs里的Configure方法加入如下代码,并且最好加在开头

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

然后就能够发布了,接着再配置一下nginx,也没什么好配置的 主要就是“proxy_pass”要设置为实际的ip地址,不能用 localhost,“127.0.0.1”,“0.0.0.0”等ip地址

location / {
        proxy_pass         http://192.168.1.4:5000/;

        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }

然后就是重载二连

$ nginx -t
$ nginx -s reload

这样nginx就配置好了

以上两步参考自微软官方文档:https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-5.0

接下来就是配置监听地址了,有两种方法来配置,一是命令行,二是环境变量

命令行

$ dotnet <dll file> --urls "http://*:5000/"

环境变量

ASPNETCORE_URLS = http://*:5000/

以上配置方法参考自:https://blog.walterlv.com/post/configure-urls-and-port-for-asp-dotnet.html

4·13 更新

说来惭愧,我才知道docker容器默认不能直接访问宿主机的网络,仔细想想也对,毕竟是容器啊,哪能让你随便访问宿主机呢

那么这跟本文章有什么关系呢,有的,因为我的 nginx 就是用 docker 来部署的 🤣

所以要怎么解决呢,很简单,就是把上述两个地址改成“http://172.17.0.1:5000/”就行了

至于为啥要用这个ip地址,请参考:https://www.cnblogs.com/mafeng/p/11781003.html

顺便再提个醒,Linux下查询ip配置的命令是“ifconfig”不是“ipconfig”,别搞混了 😂

结果截图

最后再放送一波结果图

systemd服务配置

nginx配置

浏览器截图