2017-01-09 97 views
2

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

然后我试了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 &,它的工作原理。

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

+0

在哪个端口上运行它?端口<1024左右,需要root权限 – Tseng

+0

高端,54321。我可能通过在不同的服务器上尝试相同的操作,发现偶然发生的事情。问题不在于端口访问权限,而在于对.NET临时文件具有文件权限。 – Harry

回答

3

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

首先:如果您不打算为它们提供完全的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。当我需要执行管理任务时,我只是开始单独的根会话。我使用与数据库访问相同的方法。该应用程序只有权执行程序,甚至不允许选择。

相关问题