Ubuntu下Systemd托管ASP.Net Core 3.1 API配置键值为NULL问题
解决Systemd托管ASP.NET Core 3.1 API无法读取appsettings.json的问题
我之前部署ASP.NET Core服务时也碰到过一模一样的情况——命令行直接跑完全正常,用Systemd托管就读不到配置值,大概率是下面几个原因导致的,咱们一步步排查解决:
1. 最常见的坑:Systemd服务未设置正确的工作目录
Systemd默认的工作目录是根目录/,而你的appsettings.json明明放在发布文件夹里。当服务启动时,程序会在/下去找配置文件,自然找不到,所以读取的配置键值全是null。
解决办法:
编辑你的/etc/systemd/system/mytest.service文件,添加WorkingDirectory配置项,指向API发布文件夹的绝对路径,示例如下:
[Unit] Description=My Test ASP.NET Core API [Service] WorkingDirectory=/var/www/mytest # 替换成你的实际发布文件夹路径 ExecStart=/var/www/mytest/YourApiExecutableName # 同样用绝对路径指向可执行文件 Restart=always # 若需要指定运行用户,可加上User=www-data(根据实际场景调整) [Install] WantedBy=multi-user.target
修改完成后,重载Systemd并重启服务:
sudo systemctl daemon-reload sudo systemctl restart mytest.service
2. 权限问题:Systemd运行用户无配置文件读取权限
如果你的发布文件夹或appsettings.json的权限设置不合理,Systemd使用的运行用户(默认是root,未指定的话)可能没有读取文件的权限,也会导致配置读取失败。
解决办法:
- 先查看文件权限情况:
ls -l /var/www/mytest/appsettings.json
- 如果权限不足,可将发布文件夹的所有权转给运行用户(比如常用的
www-data):
sudo chown -R www-data:www-data /var/www/mytest
- 或者直接调整配置文件的可读权限:
sudo chmod 644 /var/www/mytest/appsettings.json
3. 发布时配置文件未被包含到输出目录
有时候可能因为项目中appsettings.json的复制属性没设置对,导致发布时没有把配置文件打包到输出文件夹里。
解决办法:
- 回到本地项目中,右键
appsettings.json文件,选择「属性」,将「复制到输出目录」设置为「如果较新则复制」或「始终复制」。 - 重新执行发布命令:
dotnet publish -c Release -r linux-x64 --self-contained
- 发布完成后,检查Ubuntu上的发布文件夹,确认
appsettings.json存在。如果缺失,手动将本地的配置文件复制到Ubuntu的发布目录中。
4. 验证排查:查看Systemd服务日志
如果上面的方法都没解决问题,可以查看服务的实时日志,获取具体的错误提示:
journalctl -u mytest.service -f
日志里如果出现类似“找不到appsettings.json”的错误,就能直接对应到工作目录或文件缺失的问题。
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

