使用Apache + SSL执行CGI脚本
我在尝试通过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后,它将不会执行。
感谢您的阅读!
首先,感谢Joseph Myers的建议,即使他们没有提供解决方案,他们也帮助我实现了这个目标。他对僵尸进程的评价很有意义,在深入了解之后,我意识到不是在apache启动时加载mod_cgid,而是加载mod_cgi。所不同的是相当明显的,明知mod_cgid
创建一个外部守护进程,负责分叉子进程来运行CGI脚本
,它也似乎(在看看httpd的文件之后)这是默认的,而不是cgi。我不记得自己改变了这一点,但地狱,谁知道,它现在的作品!
tl; dr,不要使用mod_cgi!改用mod_cgid!
谢谢你的客气话! – 2013-03-25 21:26:50
我遇到过这样的问题,几乎所有的问题都通过在每个HTTPS响应中强制使用“Connection:close”来解决。它应该打印在HTTP标题中。另外,确保proxy.cgi脚本在每次运行后关闭/存在,以确保Apache SSL进程不会被僵尸进程填满,从而永远不会关闭自己。
感谢您的回答!我尝试了您提到的两件事情,看起来不是它:(看起来,虽然在我的Apache服务器上配置SSL时引发了这个问题,但即使我恢复了以前的配置,它仍然存在。 – 2013-03-25 08:31:17
你有这个地址发生了什么公开的地址?如果是这样的话,我可以看一看,以便看到系统生成的请求和响应。 – 2013-03-20 00:24:57
恐怕不是:(它在我的本地机器上运行,并且由于代理服务器,我无法为您提供访问权限 – 2013-03-20 07:13:57