sockets - 套接字和文件描述符魔术
问题描述
我编写了一个在 Web 服务器中使用的 FCGI 实现。我想用 lighttpd 替换一个简单的设置。
我发现了一些奇怪的东西。
当我尝试生成 Python-Flup 服务器然后连接到它时,它仅在我使用 TCP 套接字(我的代码)时才有效。但是,在我现有的 Flup 和 lighttpd 设置中,它也适用于 Unix 域套接字。
(在 FCGI 中,Web 服务器将侦听套接字作为标准输入提供给 FCGI 服务器)。因此,我查看了 Flups 代码(仅在本地和此处找到)。好像只处理了TCP,所以UDS应该不行。但是使用 lighttpd 它以某种方式做到了!
fastcgi.server = (
"/heiz" =>
(
"python-fcgi" =>
(
"socket" => "/tmp/fastcgi2.python.sock",
"bin-path" => "/var/www/heiz/flup.fcgi",
"check-local" => "disable",
"max-procs" => 1
)
)
)
运行如下:
sudo ss -lxp | grep /tmp/fastcgi2.python.sock
u_str LISTEN 0 1024 /tmp/fastcgi2.python.sock-0 4378053 * 0 users:(("flup.fcgi",pid=349092,fd=3),("flup.fcgi",pid=349092,fd=0))
但是怎么做?我错过了什么?
是因为这个魔法吗?
我很困惑
解决方案
lighttpd 打开并绑定到配置的侦听套接字"socket" => "/tmp/fastcgi2.python.sock"
,无论是 TCP 还是 UDS,然后STDIN_FILENO
在您配置时使该侦听套接字成为您的 fastcgi 后端"bin-path" => "/var/www/heiz/flup.fcgi"
我的理解是 Flup 认识到STDIN_FILENO
(aka FCGI_LISTENSOCK_FILENO
) 上有一个监听套接字并简单地使用它。
推荐阅读
- c# - 使用带有 xceed 命名空间的 c# 在 ms word 中的特定位置插入图表
- java - 如何将 JsonObject 存储到 Postgresql 数据库?
- python-3.x - SageMath:定义一系列函数(Callable Symbolic Expressions)
- javascript - Vue CLI 3 - 输入字符计数问题 v-model
- kubernetes - 无法访问 dapr 上的无头服务
- css - 如何在 Ipad 和移动断点上禁用此 CSS 代码?
- sql - Oracle for Microsoft SQL Server 数据库中 ENABLE 关键字的等效项是什么?
- heroku - 通过 Heroku 部署应用程序时的问题
- oracle - Oracle查询 - 如何根据它们的值将两个不同的行计为一个
- html - 更改底部 div 的背景颜色