在Ubuntu16.04上使用systemD时,DotnetCore内容根路径正在更改
我目前正试图通过以下教程在Azure上的Ubuntu16.04虚拟机上部署DotNetCore应用程序: 将在Ubuntu16.04上使用systemD时,DotnetCore内容根路径正在更改,ubuntu,asp.net-core,systemd,kestrel-http-server,.net-core,Ubuntu,Asp.net Core,Systemd,Kestrel Http Server,.net Core,我目前正试图通过以下教程在Azure上的Ubuntu16.04虚拟机上部署DotNetCore应用程序: 将dotnet publish生成的文件夹内容部署到vm后。。。。如果我手动进入项目文件夹并通过dotnet app_name.dll启动Kestrel,它工作正常,我可以从浏览器访问应用程序 手动运行dotnet app_name.dll后从终端获得的输出为 托管环境:生产环境 内容根路径:/home/myUser/publish 现在收听:http://localhost:5000 应
dotnet publish
生成的文件夹内容部署到vm后。。。。如果我手动进入项目文件夹并通过dotnet app_name.dll
启动Kestrel,它工作正常,我可以从浏览器访问应用程序
手动运行dotnet app_name.dll
后从终端获得的输出为
托管环境:生产环境
内容根路径:/home/myUser/publish
现在收听:http://localhost:5000
应用程序已启动。按Ctrl+C关闭。
现在,教程希望我使用SystemD来管理Kestrel流程
它通过为我们运行dotnet
ExecStart=/usr/bin/dotnet/var/aspnetcore/app_name.dll
。在服务文件中
当我启动这项服务时,它看起来会起作用。我得到:
托管环境:生产环境
内容根路径:/
现在收听:http://localhost:5000
应用程序已启动。按Ctrl+C关闭。
。。。但当我尝试访问应用程序时,kestrel从未收到请求。我所看到的两者之间的唯一区别是内容根路径
现在,在项目中,路径在startup.cs中引用:
公共启动(IHostingEnvironment环境)
{
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath…
我尝试硬编码字符串值,但实际上没有改变任何东西
那么,是我的web应用程序无法在内容根路径下工作的罪魁祸首吗
如果是,我如何解决这个问题?
如果没有,是否还有其他问题需要注意?在新建WebHostBuilder时是否正在调用.UseContentRoot(Directory.GetCurrentDirectory())
如果是这样,当从systemd
调用它时,这将不起作用。您会发现,如果删除该行,它将获得正确的ContentRoot
编辑:
补充回答:是的,您可以在systemd
config中指定WorkingDirectory作为替代解决方案。您需要做的事情取决于您的特定需求和环境
请记住:
如果未设置WorkingDirectory,则“当systemd作为系统实例运行时,默认为根目录;如果作为用户运行,则默认为相应用户的主目录。”
如果设置了WorkingDirectory但未设置RootDirectory”,则WorkingDirectory=相对于运行服务管理器的系统的根
“请注意,设置此参数可能会导致向设备添加其他依赖项。”(例如现有目录)问题在于目录.CurrentDirectory()
返回运行dotnet
命令的目录。解决此问题的最简单方法是通过添加以下行来修改systemd配置文件:
WorkingDirectory=/var/aspnetcore
这将更改执行dotnet
命令的目录。这样,您就不必更改项目的代码,它在本地计算机上的工作方式与在远程计算机上的工作方式相同。您的应用程序的服务文件可能如下所示:
[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
WorkingDirectory=/var/www/helloapp
ExecStart=/usr/bin/dotnet /var/www/helloapp/helloapp.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=dotnet-example
User=your-user-name
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
[Install]
WantedBy=multi-user.target
您必须在“User=”行中指定用户名,并且您应该对项目目录(如/var/www/example)具有完全权限。如果您不添加用户行或不更改,系统将不会执行您的服务
要获取目录的权限,请执行以下操作:
sudo chown -R <user>:<user-group> /var/www/<your-app>
sudo setfacl -R -d -m u:<user>:rwx,g:<user-group>:rwx,o::r /var/www/<your-app>
sudo chown-R:/var/www/
sudosetfacl-R-d-mu::rwx,g::rwx,o::R/var/www/
如果您注意我所说的,您的服务将毫无问题地运行。删除后,停止在我的本地服务器上运行。尽管如此。UseContentRoot(Environment.GetEnvironmentVariable(“ASPNETCORE_Environment”)==“Production”?Path.GetDirectoryName(Assembly.GetEntryAssembly().Location):Directory.GetCurrentDirectory())谢谢……我看了几个小时,直到看到显示“www数据”的另一个“示例”中的问题。非常感谢。不客气:)我很高兴你解决了这个问题。