强制将文件创建通知给FAM或lighttpd

时间:2016-03-22 09:35:57

标签: cgi lighttpd

环境:Debian,lighttpd,fam。目前还不清楚是否启用了虚拟专用服务器的内核Dnotify。

我的CGI在文件系统中创建文件后,它会向客户端响应一条短消息,在浏览器中运行java脚本,通知客户端文件已准备好下载。这里有一个问题 - 大多数情况下客户端从lighttpd收到http 404错误,尤其是当所有这些软件都在localhost中运行时。我认为这个问题是由文件创建的fam通知lighttpd的延迟引起的。我想所有事件都按以下顺序发生:

  1. CGI创建一个文件。
  2. CGI回应客户。
  3. 客户端从lighttpd获取文件。
  4. lighttpd在其缓存中找不到该文件。
  5. 我可以想象,一旦在远程主机中创建文件并通过NFS通知lighttpd,这样的问题会更糟。

    我的问题是:如何编写CGI来告诉lighttpd在响应客户端之前创建文件?

    也就是说,如何在上述步骤1.2.之间“插入”通知步骤?如果我不能用lighttpd做这个,但我可以用nginx做,我也可以考虑转换到后者。同样,我可以从fam切换到其他文件交替监视器。

    最诚挚的问候,

1 个答案:

答案 0 :(得分:1)

lighttpd没有缓存文件的不存在,因此问题更可能出现在CGI脚本中。 CGI脚本应该创建文件并应该关闭它,以便内核知道内容应该刷新到磁盘,因为它们可能仍然在CGI进程中的stdio中缓冲。只有在此之后,脚本才会向客户端发送消息。

如您所述,如果CGI在与接收文件的第二个请求的服务器不同的服务器上运行,并且该文件存储在NFS或其他远程文件系统上,则需要额外的步骤。最简单的解决方案是让客户端等待一两秒,然后重试下载文件几次,因为典型的NFS缓存设置大约为5秒。