nginx后面的aspnetcore 2.0 kestrel unix socket

时间:2018-04-18 17:31:55

标签: nginx .net-core kestrel-http-server

我目前正在通过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上使用任何特定模块吗?我做错了什么?

2 个答案:

答案 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中的示例解决方案。