我有一个使用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 &
一起使用它。
尼斯。现在有没有办法以有限的权限启动我的应用程序?
答案 0 :(得分:4)
我自己找到了答案,所以我会分享。
首先:如果您不打算给他们完全的root权限,请不要在Linux上以root身份运行.NET核心项目。我认为具有root权限的Web应用程序是个坏主意,而且有点麻烦。
但是,当某些东西不起作用时,很有可能不时使用sudo
。结果证明这是问题的原因:
dotnet restore
和dotnet run
必须由同一用户以相同的权限执行。当我以root身份发布dotnet restore
时,它就有效了。当你想以具有较低权限的用户运行项目时,另一方面则更难。您必须在发出dontet restore
之前删除所有临时文件。因此,通常nohup dotnet run kestrel > /dev/null 2>&1 &
作为魅力,此处需要不sudo
,以root身份运行可能会有害。
现在我总是创建特殊的dotnet
用户来在服务器上运行dotnet应用程序。这样更安全。用户不能sudo。当我需要执行管理任务时,我只需要启动单独的根会话。我使用相同的方法进行数据库访问。该应用程序仅具有执行程序的权限,甚至不允许选择允许的程序。