【问题标题】:What is the difference between fcgi_stdio and fcgiapp?fcgi_stdio 和 fcgiapp 有什么区别?
【发布时间】:2023-05-28 04:39:01
【问题描述】:

我正在尝试开始进行 fastcgi 开发,因此我下载了libfcgi 的参考实现并尝试让测试程序与lighttpd 一起运行。由于fcgi_stdio 允许cgi 向后兼容,我决定从它开始。 但是我无法让examples/tiny-fcgi.clighttpd 一起工作,它产生了internal server errror 500,相同的配置允许运行lighttpd 示例程序(http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModFastCGI,低于C/C++ FastCGI on lightty named socket)完美无缺。但是,我完全不清楚为什么默认提供的示例不起作用。

问题:

  1. 参考实现中的 examples/tiny-fcgi.c 示例有什么问题导致 lighttpd 返回错误 500?
  2. 哪个 fastcgi 实现更适合 c++ 开发(fcgi_stdio、fcgiapp、其他)? (fcgi 包中有一些流的东西,但是我没有找到好的/任何文档)

【问题讨论】:

    标签: c++ c fastcgi lighttpd


    【解决方案1】:

    对我来说并不完全相同,但如果我避免使用 getenv 示例运行时没有错误,则必须找出为什么 getenv 会导致错误

    【讨论】:

      【解决方案2】:

      我不知道你的问题是否和我的问题一样,但至少有相同的症状。

      tiny-fcgi 示例有不同的版本。我首先尝试了给定的here(示例1)。这因内部服务器错误而失败。但是,给定的示例 here (基本相同)有效。微小但关键的区别是工作代码使用

      getenv("SERVER_NAME")
      

      而不是

      getenv("SERVER_HOSTNAME")
      

      【讨论】:

        【解决方案3】:

        我已经测试了unmodified example (Ubuntu/13.10/amd-64, Apache/2.4.6, libapache2-mod-fastcgi/2.4.7~0910052141-1.1, libfcgi-dev/2.4.0-8.1ubuntu4)它运行正常:

        manuelz@garibaldi:~$ curl habrich/tiny-fcgi
        <title>FastCGI Hello! (C, fcgi_stdio library)</title>
        <h1>FastCGI Hello! (C, fcgi_stdio library)</h1>
        Request number 2 running on host <i>habrich</i>
        

        答案:

        1. 如果不知道您的配置很难判断,但这里有一个在黑暗中的镜头:如果 SERVER_NAMEundefinedgetenv 将返回 NULL
        2. fcgiapp 是基本实现:我会使用它进行新开发。 fcgi_stdio 是与 CGI 兼容的包装器:使用它来迁移遗留 CGI 项目。 Quote:

          fcgi_stdio 被实现为 fcgiapp 之上的一个薄层

        您可以在 fcgiapp.h 标头中找到适合 fcgiapp 的文档。

        【讨论】: