我在尝试通过apache执行CGI脚本时遇到了一些问题。此脚本与OpenLayers proxy.cgi相同,后者允许在一个域之外发出AJAX请求。使用普通的apache配置(没有SSL),此脚本运行顺畅,没有任何错误,但是!当我启用SSL时,它开始表现不正常。
让我先向您展示我的SSL配置:
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中运行顺利,问题是这个使用proxy.cgi的应用程序
奇怪的是,当我启动apache时,它在开始时会正常工作而没有任何问题,但过了一段时间(我不确定它是否依赖于请求的时间或数量,尽管经过测试我会说它是前者)当javascript代码调用这个proxy.cgi脚本时,请求将挂起,最后由于“超时”而中止。
我是否需要启用任何其他选项才能通过https执行cgi脚本?有什么我想念的吗?我可以把proxy.cgi代码,但我认为它没有任何事情要做,因为它已被证明可以正常工作,这里的问题是启用SSL后,它将不会被执行。
感谢阅读!
答案 0 :(得分:3)
首先,感谢Joseph Myers的建议,即使他们没有提供解决方案,他们也帮助我实现了这一目标。他对僵尸进程的看法很有意义,经过深入研究后我意识到,不是在apache启动时加载mod_cgid,而是加载了mod_cgi。知道(在查看httpd文档之后)知道mod_cgid
的区别非常明显创建一个外部守护程序,负责分配子进程以运行CGI脚本
它似乎也是默认值,而不是cgi。我不记得自己改变了这一点,但是,谁知道,它现在有用了!
tl;博士,不要使用mod_cgi!改用mod_cgid!
答案 1 :(得分:2)
我有时会遇到这样的问题,而且几乎所有问题都是通过在每个HTTPS响应中强制“连接:关闭”来解决的。它应该打印在HTTP标头中。此外,确保每次运行后proxy.cgi脚本关闭/存在,以确保Apache SSL进程没有填满从不关闭自己的僵尸进程。