问题标签 [preforking]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在接受套接字之前创建的子进程中使用父进程接受的套接字
我正在使用“预分叉模型”和 C 语言编写一个跨平台、多进程和多线程服务器。根据模式(多进程或多线程),刚刚启动的服务器会创建一组进程/线程,其任务是处理主服务器接受的客户端请求。因为子进程是在接受套接字之前创建的,所以它们显然不会继承接受的套接字。在win32中我解决了,复制套接字。我如何在 C linux 中进行操作?
http - 我需要 gunicorn 来实现内部异步微服务吗?
据我在互联网上阅读 - 部署 Flask/Django 应用程序的最佳实践是将其放在诸如 nginx 之类的 Web 服务器后面,并将它们与诸如 gunicorn 或 uWSGI 之类的 pre-fork 服务器捆绑在一起。
这有很多原因,例如 ssl 终止、防止 HTTP 攻击 (nginx)、分叉到线程以实现并发、内存泄漏后重新启动应用程序或其他异常 (gunicron)。
我想使用pm2在sanic上部署一个内部 API 微服务,因为它不是面向客户的,而是只会从内部服务调用 SSH 终止和防止 HTTP 攻击是无关紧要的,并发性由 sanic 的 asyncio 性质和异常重启由 pm2 处理。
我还需要gunicorn和nginx吗?我不能按原样运行应用程序进程并让它直接与调用者对话吗?
php - 由于重定向或服务器资源导致的流量丢失
我不是 100% 确定这个问题属于这里还是属于 ServerFault,但我会将它发布到社区希望我发布的地方。我有一个每天处理数千个重定向的网站。我们的许多客户抱怨他们正在失去一些流量。在仔细检查代码后,我们推断当我们重定向时流量实际上正在丢失:
100% 的流量到达调用这行代码的页面。只有大约 60% 的访问访问了https://samedomain/differentpath。
起初我们认为这是服务器问题,所以我们尝试了多种不同的 apache 和 mpm_prefork 设置组合,但均无济于事。这是我们当前的 mpm prefork 配置:
在进行了一些基准测试并发送了大量流量后,我注意到当我直接从自己的 IP 发送流量时,会发生 100% 的重定向。这很棒!我可能弄错了,但至少我可以更有信心服务器可以处理它(我已经在大约 2-3 分钟内测试了 2k 次访问)。然后我稍微修改了我的测试来模拟真实流量,所以我得到了一个随机代理列表,这更像是我的真实流量,我再次失去了 40% 的流量。而这一切都随着标题而丢失了。在此标头出现之前,我 100% 确信没有其他任何内容被发送到响应中。我们不提供内容,我们只重定向。
为了确保在标头出现之前我没有遇到响应内容问题,我开始使用元标记、JavaScript 重定向和标头刷新进行重定向,结果相同。
作为最后的绝望尝试,我们使用 php FastCGI 启动了 Nginx 服务器。发现同样的问题我并不感到惊讶。
顺便说一句,服务器资源也没有意义,因为我在发送大量流量的同时查看了进程,它在 12% 的 CPU 和 4% 的 RAM 时达到峰值。以下是服务器的一些详细信息:
Ubuntu 18.04.3 (LTS) x64 6 个 vCPU 16GB /320GB 磁盘
我应该提一下,我们的数据库服务器与此服务器是分开的,并且具有相同的规格。我们还启动了几台服务器并添加了一个负载均衡器,我们得到了(惊喜)相同的结果。
所以我的问题是,知道标头重定向没有因为内容而失败(我的一些测试我只有重定向但它仍然失败),还有其他可能的原因导致这种情况发生吗?这可能是 apache 问题,还是 php 问题,或两者兼而有之?
PS:我还查看了所有错误日志,它们很干净。
编辑:我认为有问题的其他问题是流量来源。也许代理被我的提供商阻止了,但如果是这种情况,最初的访问也不会点击页面,对吗?只是我认为可能有用的另一点信息。
sockets - 如何在所有子节点都阻塞接受()的预分叉服务器中检测父节点的死亡
假设我有一个 pre-fork 服务器。启动时,服务器侦听一个套接字并分叉多个子节点。然后,所有孩子都会阻止他们的accept()
系统调用,直到客户端发送请求,其中一个孩子将处理该请求。通过使用 SIGCHLD 处理程序,父级很容易检测到其子级的死亡。但是,孩子们如何得知父母去世的消息呢?所有孩子都在阻止他们的accept()
呼叫,因此他们将无法轮询父母的存在/缺席。