在Production上运行dotnet核心服务器设置时,我们当前遇到问题。我们将其发布在Bamboo中并从AWS linux服务器运行,它位于nginx反向代理的后面。
从本质上讲,每隔几天我们的dotnet核心服务器进程都会静音。它默默地接受并挂起Web请求,甚至默默地忽略我们(更有礼貌)阻止它的尝试。我们已经通过将curl请求直接从服务器内部发送到端口5000来证明它实际上是挂起的netcore进程。我们已经尽最大的能力将生产部署复制到了测试环境中,并且无法重现此故障模式。
我们用NewRelic监视了服务器,并在服务器进入故障模式时对其进行了检查。我们无法将此行为与任何重要级别的流量,RAM使用率,CPU使用率或打开文件描述符使用率相关联。确实,这些测量似乎都保持在非常合理的水平。
我和我的团队对于可能导致服务器挂起的原因,甚至诊断该服务器下一步的措施都有些困惑。 是什么原因导致我们的服务器进程挂起?我们可以采取哪些进一步的步骤来诊断问题?
其他信息
我们的nginx conf模板:
upstream wfe {
server 127.0.0.1:5000;
server 127.0.0.1:5001;
}
server {
listen 80 default_server;
location / {
proxy_set_header Host $http_host;
proxy_pass http://wfe;
proxy_read_timeout 20s;
# Attempting a fix suggested by:
# https://medium.com/@mshanak/soved-dotnet-core-too-many-open-files-in-system-when-using-postgress-with-entity-framework-c6e30eeff6d1
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_cache_bypass $http_upgrade;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}
}
我们的Program.cs
:
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Net;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
namespace MyApplication.Presentation
{
[ExcludeFromCodeCoverage]
public class Program
{
public static void Main(string[] args)
{
IWebHost host = WebHost.CreateDefaultBuilder(args)
#if DEBUG
.UseKestrel(options => options.Listen(IPAddress.Any, 5000))
#endif
.UseStartup<Startup>()
.UseSerilog()
.Build();
host.Run();
}
}
}
在CD的构建过程中,我们发布要部署的应用程序,其中包括:
dotnet publish --self-contained -c Release -r linux-x64
然后我们将文件夹bin/Release/netcoreapp2.0/linux-x64
部署到我们的服务器,并从内部运行publish/<our-executable-name>
。
编辑:dotnet --version
在我们的CI平台和生产服务器上均输出2.1.4
。
当中断开始时,nginx日志显示服务器对请求的响应从200变为502,并在中断时发出单个504。
同时,来自我们服务器进程的日志也将停止。那里有警告,但它们都是我们已放入应用程序代码中的显式警告。它们都没有表明已引发任何异常。