首页 > 解决方案 > 套接字和文件描述符魔术

问题描述

我编写了一个在 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))

但是怎么做?我错过了什么?

我认为相关部分在这里这里

是因为这个魔法吗?

我很困惑

标签: socketsfastcgilighttpdflup

解决方案


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) 上有一个监听套接字并简单地使用它。


推荐阅读