使用Apache + SSL执行CGI脚本

时间:2013-03-13 07:40:24

标签: apache ssl cgi

我在尝试通过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后,它将不会被执行。

感谢阅读!

2 个答案:

答案 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进程没有填满从不关闭自己的僵尸进程。