.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 estFreesqlProEmsTestFreeSqlMySqlProgram.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 的进程。

啊,这个问题我整了一天,终于是搞定了,看下结果

 

 

原文地址:https://www.cnblogs.com/axinno1/p/14858337.html