nginx背後的aspnetcore 2.0紅est unix套接字

2018-04-19 nginx .net-core kestrel-http-server

我目前在Ubuntu 16中通過http請求在nginx後面使用aspnet核心。

我想切換到unix套接字。

在我的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可以運行它,但是,在更改為套接字時,出現了502錯誤。

Nginx是否需要任何特定模塊?我做錯了什麼?

Answers

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

而且,就是這樣!

@Apolineo正確標識了需要打開Unix套接字的權限才能允許其他用戶連接到該套接字。

但是,比手動設置權限更好的解決方案是在創建套接字後立即從Main以編程方式進行操作。

此答案中的示例解決方案。

Related