Ubuntu Lamp - 代理 - 防火墙 - Joomla curl和fsockopen不会工作

时间:2015-05-20 07:45:37

标签: php apache ubuntu curl joomla

好的,我已经在这几天挣扎了。

我的内部网络上的本地计算机上安装了Joomla,也安装了Jomsocial。

问题是,当我进入站点配置或编辑事件或导航到任何调用外部api的joomla模块时,我得到

CURL error : 7 Failed to connect to maps.google.com port 80: Connection timed out 

Connection timed out (110) 

问题是定义不是Joomla或Jomsocial我在同一台服务器上运行的其他php应用程序也无法联系外部api的

服务器设置

Ubuntu 14Lts PHP 5.5 Apache 2.4.7 MariaDB的

服务器位于代理服务器后面,但是可以从CLI获得完全的Internet访问权限。启用所有必要的php扩展。我在apt / config中也在/ etc / environment中设置了全局代理变量,并在Joomla中设置了代理变量。我的Joomla更新和组件更新工作正常,但fsockopen函数的卷曲不起作用。

我不知道在哪里寻找错误。我的想法是www-data用户可能没有足够的权限从浏览器执行fsockopen和curl。

有什么建议吗?

更新,我已在另一台不在公司网络(直接连接到互联网)的机器上测试了该网站,一切正常。所以我很确定我的问题出在我的机器和网络权限上,特别是我的www-data用户。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

即使http_proxy用于传递它,或者直接使用PassEnv设置,PHP(mod_php)似乎也没有使用SetEnv变量。此外,在PHP脚本中调用getenv('http_proxy')时,它会正确显示。

但是,有两种方法可以让它发挥作用:

  • 在Apache envvars(/etc/apache2/envvars)中设置如下:

    export http_proxy=http://proxy.example.com:8080/
    

    并重启Apache。

  • 放入加载应用程序的PHP文件(例如index.php,bootstrap.php等):

    putenv('http_proxy=http://proxy.example.com:8080/');
    

同样,如果您使用getenv('http_proxy')进行测试,您会看到它们设置正确。

答案 1 :(得分:1)

我在一个非常接近的设置中遇到了同样的问题(唯一的区别是mysql而不是MariaDb和Joomla 3.4.1)并且我花了很长时间才把所有东西放在一起,所以我会把这里可能存在绊脚石的列表:

  1. 确保已安装 php5-curl 。 Joomla只能将CURL用作传输层。

    sudo apt-get install php5-curl
    
  2. 我发现在Joomla配置中输入代理没什么用。它唯一的好处是更新连接不会超时但立即返回。

  3. 将环境变量放在/ etc / apache2 / envvars中是不够的,还需要使用" PassEnv"在/etc/apache2/apache2.conf中, 即(摘自https://stackoverflow.com/a/21571588/1967646

    PassEnv http_proxy
    
  4. 此外,我需要传递 HTTP_PROXY HTTPS_PROXY ,因为xml-lists是通过http获取的,而文件是通过https获取的(可能是从github更新文件) 。可能,您需要将这些变量设置为小写,但需要在joomla配置页面" PHP信息"类似命名的变量以大写形式显示。

  5. 我不知道这在哪里确实有所不同,但重启apache2如下似乎是正确的方法(而不是apache2ctl)。

     sudo service apache2 restart
    
  6. 我整理了一些偶然的代码,用于测试curl和php是否可以一起工作,大部分来自https://stackoverflow.com/a/1477710/1967646。我只添加了大量的错误报告。在web文件夹的根目录中放入 test.php 文件,然后使用您喜欢的浏览器查看。

    <?php
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);
    
    $url = 'http://update.joomla.org/core/list.xml';
    
    function get_page($url, $proxy=true) {
        if ($url!='') {
            $ch = curl_init ();
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
            if ($proxy) {
                curl_setopt($ch, CURLOPT_PROXY, '<enter your proxy host here>');
                curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
                curl_setopt($ch, CURLOPT_PROXYPORT, <enter your proxy port here>);
            }
            if (! $html = curl_exec($ch)) {
                echo '<br>Last CURL error is '.curl_error($ch).'<br>';
        } else {
                echo '<br>CURL without error.<br>';
        }
            curl_close($ch);
            return $html;
        } else {
        echo 'Empty URL.';
        }
    }
    
    echo 'Hello, getting pages via curl:';
    $html=get_page($url);
    var_dump($html);
    echo bin2hex($html);
    echo '<br>';
    var_dump(get_page($url, false));
    echo '<br>done.<br>';
    ?>
    

答案 2 :(得分:0)

使用此:

man curl:

或者这个:

来自-x, --proxy <[protocol://][user:password@]proxyhost[:port]> Use the specified HTTP proxy. If the port number is not specified, it is assumed at port 1080.

  <div>
    <input ng-model="serverip">
    <input type="button" class="button" value="Apply" ng-click="save()">
  </div>