2013-03-13 130 views
3

我在尝试通过apache执行CGI脚本时遇到了一些问题。这个脚本与OpenLayers的proxy.cgi相同,它允许在域之外发出AJAX请求。这个脚本运行平稳,没有任何错误使用普通的Apache配置(没有SSL),但!当我启用SSL时,它开始表现不正常。使用Apache + SSL执行CGI脚本

让我给你先为SSL我的Apache配置:正确

NameVirtualHost *:443 
<VirtualHost *:443> 
    ServerName 172.22.1.37 
    SSLEngine on 
    SSLProtocol all -SSLv2 
    SSLCertificateFile /etc/apache2/ca/apache-server.crt 
    SSLCertificateKeyFile /etc/apache2/ca/apache-server.key 
    SSLCertificateChainFile /etc/apache2/ca/proba.crt 
    SSLCACertificateFile /etc/apache2/ca/proba.crt 
    AddType application/x-x509-ca-cert .crt 
    AddType application/x-pkcs7-crl .crl 
    Alias /mapviewer "/var/www/mapviewer/" 
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 
    AddHandler cgi-script .cgi 
    DocumentRoot /usr/lib/cgi-bin/ 
    <Directory "/usr/lib/cgi-bin"> 
     AllowOverride All 
     Options +ExecCGI -Multiviews +SymLinksIfOwnerMatch 
     Order allow,deny 
     Allow from all 
    </Directory> 
</VirtualHost> 

因此,SSL负载,因为我已经尝试过其他的web应用,它们在HTTPS流畅运行,问题是这样的应用程序,使用代理.cgi

奇怪的是,当我启动apache时,一开始它会正常工作,没有任何问题,但过了一段时间(我不确定它是否依赖于时间或请求数量,虽然在测试后我'd说这是前者),当JavaScript代码调用这个proxy.cgi脚本时,请求将会在那里挂起,最后由于“时间到”。

我是否需要启用任何其他选项来通过https执行cgi脚本?有什么我失踪?我可以放置proxy.cgi代码,但我认为它没有任何事情要做,因为它已被证明可以正常工作,这里的问题是启用SSL后,它将不会执行。

感谢您的阅读!

+0

你有这个地址发生了什么公开的地址?如果是这样的话,我可以看一看,以便看到系统生成的请求和响应。 – 2013-03-20 00:24:57

+0

恐怕不是:(它在我的本地机器上运行,并且由于代理服务器,我无法为您提供访问权限 – 2013-03-20 07:13:57

回答

3

首先,感谢Joseph Myers的建议,即使他们没有提供解决方案,他们也帮助我实现了这个目标。他对僵尸进程的评价很有意义,在深入了解之后,我意识到不是在apache启动时加载mod_cgid,而是加载mod_cgi。所不同的是相当明显的,明知mod_cgid

创建一个外部守护进程,负责分叉子进程来运行CGI脚本

,它也似乎(在看看httpd的文件之后)这是默认的,而不是cgi。我不记得自己改变了这一点,但地狱,谁知道,它现在的作品!

tl; dr,不要使用mod_cgi!改用mod_cgid!

+2

谢谢你的客气话! – 2013-03-25 21:26:50

2

我遇到过这样的问题,几乎所有的问题都通过在每个HTTPS响应中强制使用“Connection:close”来解决。它应该打印在HTTP标题中。另外,确保proxy.cgi脚本在每次运行后关闭/存在,以确保Apache SSL进程不会被僵尸进程填满,从而永远不会关闭自己。

+0

感谢您的回答!我尝试了您提到的两件事情,看起来不是它:(看起来,虽然在我的Apache服务器上配置SSL时引发了这个问题,但即使我恢复了以前的配置,它仍然存在。 – 2013-03-25 08:31:17