搞開發是不是很奇怪,昨天.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 的進程。
啊,這個問題我整了一天,終於是搞定了,看下結果

