在后台运行时,Kestrel服务器不起作用,为什么?

时间:2017-01-09 13:13:22

标签: asp.net-core

我有一个使用Visual Studio制作和测试的项目。有用。 然后我将其上传到Ubuntu服务器。 然后使用dotnet run运行它。 Works,远程机器看到它(通过nginx代理)。

然后我尝试dotnet run &。这个过程好像已经开始,但没有任何东西监听指定的端口。然后,根据the example,我尝试sudo nohup dotnet run kestrel > /dev/null 2>&1 &。这次听了一会儿,然后死了:

  

申请已开始。按Ctrl + C关闭。

     

失败:   Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware [0]         发生了未处理的异常:无法找到包'google.protobuf'的编译库位置   System.InvalidOperationException:找不到编译库   包'google.protobuf'的位置在   Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths()

(nohup.out的输出片段,第一个亚麻布,我跳过项目详细信息为无关和私有)。

有什么线索发生了什么?在前台运行它时仍然没有错误。

以下是我发现的内容:当我以root身份运行时,我无法运行它(它会提供相同的错误消息)。在我的测试服务器上,我有一个名为“dotnet”的特殊用户帐户。当我以dotnet身份登录时,我可以运行该应用程序。作为根本我不能。

我不想以root权限运行我的应用程序。

接下来尝试:我以root身份运行dotnet restore。然后我和nohup dotnet run kestrel > /dev/null 2>&1 &一起使用它。

尼斯。现在有没有办法以有限的权限启动我的应用程序?

1 个答案:

答案 0 :(得分:4)

我自己找到了答案,所以我会分享。

首先:如果您不打算给他们完全的root权限,请不要在Linux上以root身份运行.NET核心项目。我认为具有root权限的Web应用程序是个坏主意,而且有点麻烦。

但是,当某些东西不起作用时,很有可能不时使用sudo。结果证明这是问题的原因:

dotnet restoredotnet run必须由同一用户以相同的权限执行。当我以root身份发布dotnet restore时,它就有效了。当你想以具有较低权限的用户运行项目时,另一方面则更难。您必须在发出dontet restore之前删除所有临时文件。因此,通常nohup dotnet run kestrel > /dev/null 2>&1 &作为魅力,此处需要sudo ,以root身份运行可能会有害。

现在我总是创建特殊的dotnet用户来在服务器上运行dotnet应用程序。这样更安全。用户不能sudo。当我需要执行管理任务时,我只需要启动单独的根会话。我使用相同的方法进行数据库访问。该应用程序仅具有执行程序的权限,甚至不允许选择允许的程序。