.net core3.1 webapi项目部署在centos7中,通过supervisor来做进程守护遇到backoff Exited too quickly (process log may have details)的错误--并提供解决方法
搞开发是不是很奇怪,昨天.net core3.1 webapi项目在linux中还跑的好好的,咋就过了一个周末为什么就报错了呢?这个错还很奇怪请看咱们的supervisor提供的日志信息
因为supervisor安装之后,supervisor 的服务端daemon在路径 /etc/ 项目对应的supervisor的配置需要在 /etc/supervisord.d/ 路径下去创建具体如何将.net core3.1 webapi 通过supervisor来守护进程请看点击
[.net core项目在 linux服务器部署的解决方法] 这里就不罗嗦,这是我将.net core3.1 webapi项目部署在supervisor进程守护工具中的配置,进入testfreesql.ini文件,
vim /etc/supervisord.d/testfreesql.ini
看到的信息如下:
[program:testfreesql]
command=dotnet EmsTestFreeSqlMySql.dll --urls="http://*:5000"
directory=/var/testfreesql/
environment=ASPNETCORE_ENVIRONMENT=Development
user=root
stopsignal=INT
autostart=true
autorestart=true
startsecs=1
stderr_logfile=/var/log/EmsTestFreeSqlMySql.err.log
stdout_logfile=/var/log/EmsTestFreeSqlMySql.out.log
阿西吧报这个错,蒙蔽状态 错误信息:backoff Exited too quickly (process log may have details) ,可以断定此处定妖孽作祟,好的,那咱就看看supervisor提供的日志信息把
在linux 查看日志命令
vim /var/log/EmsTestFreeSqlMySql.err.log
发现了妖孽
Unhandled exception. System.InvalidOperationException: Could not determine an appropriate location for storing user secrets. Set the DOTNET_USER_SECRETS_FALLBACK_DIR environment variable to a folder where user secrets should be stored.
at Microsoft.Extensions.Configuration.UserSecrets.PathHelper.GetSecretsPathFromSecretsId(String userSecretsId)
at Microsoft.Extensions.Configuration.UserSecretsConfigurationExtensions.AddUserSecrets(IConfigurationBuilder configuration, String userSecretsId, Boolean reloadOnChange)
at Microsoft.Extensions.Configuration.UserSecretsConfigurationExtensions.AddUserSecrets(IConfigurationBuilder configuration, Assembly assembly, Boolean optional, Boolean reloadOnChange)
at Microsoft.Extensions.Configuration.UserSecretsConfigurationExtensions.AddUserSecrets(IConfigurationBuilder configuration, Assembly assembly, Boolean optional)
at Microsoft.Extensions.Hosting.Host.<>c__DisplayClass1_0.<CreateDefaultBuilder>b__1(HostBuilderContext hostingContext, IConfigurationBuilder config)
at Microsoft.Extensions.Hosting.HostBuilder.BuildAppConfiguration()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at EmsTestFreeSqlMySql.Program.Main(String[] args) in E:\KCSoftwareTest\testFreesqlPro\EmsTestFreeSqlMySql\Program.cs:line 18
这些bug要加粗,是的看的更清楚些,这里的错误是说 “无法确定存储用户机密的适当位置”,报这个错主要原因找到:
第一,发布之后环境变量是Production,配置supervisor的时候写的是development
我们部署的时候linux先跳到自己的项目目录,然后 dotnet xxx.dll 跑一遍看看是什么环境
然后根据 hosting environment:Production 在supervisor配置项目中环境变量也要一致
改完之后再一次进入testfreesql.ini文件,
vim /etc/supervisord.d/testfreesql.ini
看到的信息如下:
[program:testfreesql] command=dotnet EmsTestFreeSqlMySql.dll --urls="http://*:5000" directory=/var/testfreesql/
#切记,这里的环境变量一定要跟发布项目的环境变量要一致 environment=ASPNETCORE_ENVIRONMENT=Development user=root stopsignal=INT autostart=true autorestart=true startsecs=1 stderr_logfile=/var/log/EmsTestFreeSqlMySql.err.log stdout_logfile=/var/log/EmsTestFreeSqlMySql.out.log
webapi项目配置到supervisor时,supervisor需要重新reread下,命令步骤如下:
supervisorctl reread
supervisorctl reload
supervisorctl update
登录supervisor后台就可以看到绿色的运行结果。
项目启动的时候一定要把配置注入到容器中,然后把环境变量加上去,
请看Program.cs的一个方法。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostbuilderContext, config) =>
{//报这个错之后定位加的配置注入,如果你要用到环境变量或者appsettings的配置一定要做这个注入
var env = hostbuilderContext.HostingEnvironment;
var basedirectory = AppDomain.CurrentDomain.BaseDirectory;
config.SetBasePath(basedirectory)
.AddJsonFile("appsettings.json", true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, reloadOnChange: true)
.AddEnvironmentVariables() //切记要添加环境变量
.AddCommandLine(args);//切记要添加这行
;
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseKestrel();
webBuilder.UseUrls("http://*:5000");
webBuilder.UseStartup<Startup>();
}).ConfigureServices((services) =>
{
services.AddHostedService<MainHostService>();//启动后台执行程序
}).ConfigureLogging((logger) =>
{
logger.ClearProviders();
logger.SetMinimumLevel(LogLevel.Trace);
}).UseNLog();//加载Nlog
改完代码之后通过mobaxterm工具上传到centos7,通过supervisor后台可视化来管理.net core3.1 webapi 的进程。
啊,这个问题我整了一天,终于是搞定了,看下结果