将 yesod 应用程序作为(快速)CGI 服务
Serving a yesod application as a (Fast)CGI
我正在尝试将 yesod 应用程序作为 CGI(或 FastCGI)程序提供服务,但 Apache 向我显示 500 错误:
[Mon Sep 21 17:35:41.425565 2020] [http:error] [pid 2758] [client 10.0.2.2:43872] AH02429: Response header name '21/Sep/2020' contains invalid characters, aborting request
从 stack new project yesodweb/sqlite
的新模板开始,我尝试通过更改 src/Application.hs
.
将其转换为 CGI 程序
我已经使用
导入了 Wai CGI 库
import Network.Wai.Handler.CGI (run)
并将 appMain
的最后一行更改为 run app
:
-- | The @main@ function for an executable running this site.
appMain :: IO ()
appMain = do
-- Get the settings from all relevant sources
settings <- loadYamlSettingsArgs
-- fall back to compile-time values, set to [] to require values at runtime
[configSettingsYmlValue]
-- allow environment variables to override
useEnv
-- Generate the foundation from the settings
foundation <- makeFoundation settings
-- Generate a WAI Application from the foundation
app <- makeApplication foundation
-- Run the application with Warp
--runSettings (warpSettings foundation) app
run app
我认为这是将其用作 CGI 程序的最小更改,但显然不起作用。
我已经研究过 yesod 的书 chapter on deploying your Webapp,它可以很方便地编写适当的 Apache 配置,因此服务器可以 运行 应用程序。它没有说明我认为是问题所在的应用程序代码的必要更改。
我也检查过这个 Whosebug question 但它是将近 8 年前的,所以现在已经过时了。
问题是默认 makeFoundation
记录到标准输出,这也是 CGI 程序应该发送其响应的地方,所以你得到的响应 headers 与日志混合在一起输出,Apache 尝试将日志行解析为 HTTP headers,等等
如果您将 newStdoutLoggerSet
替换为 newStderrLoggerSet
,它应该可以工作,并且日志输出将以 Apache 的“error.log”或等效格式结束。
我正在尝试将 yesod 应用程序作为 CGI(或 FastCGI)程序提供服务,但 Apache 向我显示 500 错误:
[Mon Sep 21 17:35:41.425565 2020] [http:error] [pid 2758] [client 10.0.2.2:43872] AH02429: Response header name '21/Sep/2020' contains invalid characters, aborting request
从 stack new project yesodweb/sqlite
的新模板开始,我尝试通过更改 src/Application.hs
.
我已经使用
导入了 Wai CGI 库import Network.Wai.Handler.CGI (run)
并将 appMain
的最后一行更改为 run app
:
-- | The @main@ function for an executable running this site.
appMain :: IO ()
appMain = do
-- Get the settings from all relevant sources
settings <- loadYamlSettingsArgs
-- fall back to compile-time values, set to [] to require values at runtime
[configSettingsYmlValue]
-- allow environment variables to override
useEnv
-- Generate the foundation from the settings
foundation <- makeFoundation settings
-- Generate a WAI Application from the foundation
app <- makeApplication foundation
-- Run the application with Warp
--runSettings (warpSettings foundation) app
run app
我认为这是将其用作 CGI 程序的最小更改,但显然不起作用。
我已经研究过 yesod 的书 chapter on deploying your Webapp,它可以很方便地编写适当的 Apache 配置,因此服务器可以 运行 应用程序。它没有说明我认为是问题所在的应用程序代码的必要更改。
我也检查过这个 Whosebug question 但它是将近 8 年前的,所以现在已经过时了。
问题是默认 makeFoundation
记录到标准输出,这也是 CGI 程序应该发送其响应的地方,所以你得到的响应 headers 与日志混合在一起输出,Apache 尝试将日志行解析为 HTTP headers,等等
如果您将 newStdoutLoggerSet
替换为 newStderrLoggerSet
,它应该可以工作,并且日志输出将以 Apache 的“error.log”或等效格式结束。