我目前正在通过Ubuntu 16中的http请求在nginx后面使用aspnet核心。
我想切换到unix socket。
在我的program.cs中,我有:
var host = default(IWebHost);
var builder = new WebHostBuilder()
.UseKestrel(opt =>
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) && settings.Config.ListenUnixSocket)
{
opt.ListenUnixSocket("/tmp/api.sock");
}
})
.Configure(app =>
{
app.Map("/health", b => b.Run(async context =>
{
context.Response.StatusCode = (int)HttpStatusCode.OK;
await context.Response.WriteAsync("Ok");
}));
});
if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || !settings.Config.ListenUnixSocket)
{
host = builder.UseUrls("http://0.0.0.0:5501").Build();
}
else
{
host = builder.Build();
}
host.Run();
而且,在Nginx:
location /health {
#proxy_pass http://127.0.0.1:5501;
proxy_pass http://unix:/tmp/api.sock:/;
}
使用http运行它,但是,chaning to socket我遇到了502错误。
我需要在nginx上使用任何特定模块吗?我做错了什么?
答案 0 :(得分:3)
Aspnetcore会在运行时创建api.socket,但Nginx必须具有写入权限。
因此,如果您不知道用户nginx使用的是什么,请执行:
ps aux | grep nginx
你会在终端得到这样的东西:
root 5005 0.0 0.2 125116 1460 ? Ss 20:12 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 5006 0.0 0.6 125440 3260 ? S 20:12 0:00 nginx: worker process
root 5173 0.0 0.1 14516 920 pts/0 S+ 20:17 0:00 grep --color=auto nginx
然后设置权限:
sudo chown www-data:www-data /tmp/api.sock
而且,那就是它!
答案 1 :(得分:0)
@Apolineo正确地标识了需要打开Unix套接字的权限以允许其他用户连接到套接字。
但是,比手动设置权限更好的解决方案是在创建套接字后立即从Main以编程方式进行操作。
this answer中的示例解决方案。