套接字和文件描述符魔术

标签 sockets fastcgi lighttpd flup

我编写了一个在 Web 服务器中使用的 FCGI 实现。我想用 lighttpd 替换一个简单的设置。
我发现了一些奇怪的东西。
当我尝试生成 Python-Flup 服务器然后连接到它时,它只有在我使用 TCP 套接字时才有效
(My Code)。
但是,在我现有的 Flup 和 lighttpd 设置中,它也适用于 Unix 域套接字。
(在 FCGI 中,Web 服务器将监听套接字作为标准输入提供给 FCGI 服务器)。
因此,我查看了 Flups 代码(仅在本地发现它和 here )。好像只处理了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))
但是怎么做?我错过了什么?
我认为相关部分是herehere
是不是因为这个magic ?
我很困惑

最佳答案

lighttpd 打开并绑定(bind)到配置的监听套接字"socket" => "/tmp/fastcgi2.python.sock" ,无论是 TCP 还是 UDS,然后将该监听套接字设为 STDIN_FILENO配置 "bin-path" => "/var/www/heiz/flup.fcgi" 时的 fastcgi 后端
我的理解是 Flup 识别到 STDIN_FILENO 上有一个监听套接字。 (又名 FCGI_LISTENSOCK_FILENO )并简单地使用它。

关于套接字和文件描述符魔术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66092695/

相关文章:

c - 在 Ubuntu 上,setsockopt(...) 无法识别 IPPROTO_IP 的 IP_TTL

linux - 需要有关 Nginx CGI 配置的帮助

url - Lighttpd:如何对匹配正则表达式的 URL 进行密码保护

mod-rewrite - 从一个域代理/重写到另一个域的 lighttpd 配置

.net - 我如何使用 TCPListener 更好地处理客户端?

java - 客户端-服务器编程中出现错误

nginx - PHP7.0-fpm在Ubuntu Windows子系统Linux上极慢

php - Drupal + Nginx + Php-cgi : 502 Bad Gateway error

python - 用Flask Python框架重写配置Lighttpd的问题

sockets - TCP Socket 只接收消息的一部分