2017-01-09 31 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。當我需要執行管理任務時,我只是開始單獨的根會話。我使用與數據庫訪問相同的方法。該應用程序只有權執行程序,甚至不允許選擇。

相關問題