关于Linux上的Azure应用程序服务上的WordPress上的“cURL错误28:解决超时”问题

Linux上使用自定义Docker容器的Azure App Service上的Wordpress安装具有非常缓慢的响应时间。 加载大约需要20-40秒的时间。

我有一个疑难解答插件安装,指出问题是“cURL错误28:解决超时N毫秒”超时请求下列url

  • https://api.wordpress.org/core/version-check/1.7/
  • http://api.wordpress.org/core/version-check/1.7/
  • https://api.wordpress.org/plugins/update-check/1.1/
  • http://api.wordpress.org/plugins/update-check/1.1/
  • https://api.wordpress.org/themes/update-check/1.1/
  • http://api.wordpress.org/themes/update-check/1.1/

卷曲错误

cURL可以在scm-site命令行上正常工作。 例如,这工作正常。

curl -X POST http://api.wordpress.org/core/version-check/1.7/ 

编辑如果我SSH入容器并运行这个PHP代码,它工作正常。

 <?php $url = 'http://api.wordpress.org/core/version-check/1.7/'; $fields = array( 'version' => urlencode('4.8.1'), 'php' => urlencode('7.1.8'), 'locale' => urlencode('fi'), 'mysql' => urlencode('5.6.26.0'), 'local_package' => urlencode('fi'), 'blogs' => urlencode('1'), 'users' => urlencode('4'), 'multisite_enabled' => urlencode('0'), 'initial_db_version' => urlencode('26691') ); foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } rtrim($fields_string, '&'); $ch = curl_init(); curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, TRUE); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); curl_exec($ch); curl_close($ch); 

它返回以下内容。

 root@71c3bba3a35e:/home/site/wwwroot# php curl.php {"offers":[{"response":"upgrade","download":"http:\/\/downloads.wordpress.org\/release\/wordpress-4.8.1.zip","locale":"en_US","packages":{"full":"http:\/\/downloads.wordpress.org\/release\/wordpres s-4.8.1.zip","no_content":"http:\/\/downloads.wordpress.org\/release\/wordpress-4.8.1-no-content.zip","new_bundled":"http:\/\/downloads.wordpress.org\/release\/wordpress-4.8.1-new-bundled.zip","par tial":false,"rollback":false},"current":"4.8.1","version":"4.8.1","php_version":"5.2.4","mysql_version":"5.0","new_bundled":"4.7","partial_version":false}],"translations":[]} 

我的Docker镜像使用了php:7.1.8-apache。

这是我的Dockerfile。

 FROM php:7.1.8-apache EXPOSE 80 443 2222 RUN apt-get update -y && apt-get install -y --no-install-recommends \ ssl-cert \ ca-certificates \ apt-utils \ vim \ curl \ mysql-client \ openssh-server \ libmcrypt-dev \ libcurl4-gnutls-dev \ libicu-dev \ && docker-php-ext-install -j$(nproc) iconv \ mcrypt \ mysqli \ json \ mbstring \ curl \ intl \ && echo "root:Docker!" | chpasswd \ && ln -s /home/LogFiles /var/log/apache2 ENV APACHE_CONFDIR=/etc/apache2 \ APACHE_ENVVARS=/etc/apache2/envvars \ APACHE_LOCK_DIR=/var/lock/apache2 \ APACHE_LOG_DIR=/var/log/apache2 \ APACHE_RUN_DIR=/var/run/apache2 \ APACHE_PID_FILE=/var/run/apache2/apache2.pid \ APACHE_RUN_USER=www-data \ APACHE_RUN_GROUP=www-data WORKDIR /usr/local COPY config/wprun.sh config/wp-config.php /usr/local/ COPY config/sshd_config /etc/ssh/ COPY config/php.ini /usr/local/etc/php/ RUN chmod 755 wprun.sh && \ rm -R /var/www/html && \ a2enmod rewrite && \ a2enmod expires && \ a2enmod include && \ sed -i "s@/var/www@/home/site/wwwroot@" /etc/apache2/sites-enabled/000-default.conf && \ sed -i "s@/var/www@/home/site/wwwroot@" /etc/apache2/apache2.conf CMD ["/bin/bash","wprun.sh"] 

编辑2这个GitHub问题似乎相似。 有一个build议使用OpenDNSparsing器 。 这可能是一个DNS问题? 如果是这样,那么Doc​​ker和Azure如何工作呢?

编辑3这似乎是一个DNS问题。 这是Azure中的resolv.conf文件。

 search reddog.microsoft.com nameserver 127.0.0.11 options timeout:1 attempts:5 ndots:0 

当我将名称服务器更改为8.8.8.8时,页面会在一到两秒内加载。 此外所有的curl错误消失。

如果我理解正确, Docker挂载主机的resolv.conf文件,并且应该使用Docker运行命令选项设置DNS设置。 不build议直接更改这些文件。

Docker如何pipe理容器内的DNSconfiguration的确切细节可以从一个Docker版本更改为下一个。 所以你不应该假定/ etc / hosts,/etc/resolv.conf这样的文件在容器内被pipe理,并且保持文件不变,而是使用下面的Docker选项。

但是,在Azure中设置泊坞窗运行参数似乎不可能。

用于curl的scm站点命令行在Azure WebApps for Linux的主机上运行,​​不在Docker容器内。

在GitHub moby/moby https连接上, 容器内部的curl会失败 ,这与你的非常相似。 据此,我认为你需要通过PHP方法curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');来设置--tlsv1选项curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); 用于在Azure WebApp for Linux的Docker容器中进行curl调用。

希望能帮助到你。