" cURL错误28:解决超时问题"在Linux上的Azure应用服务上的Wordpress上

时间:2017-09-11 12:20:00

标签: php linux wordpress docker azure-web-sites

使用自定义Docker容器在Linux上的Azure App Service上安装我的Wordpress的响应时间非常慢。页面大约需要20-40秒才能加载。

我安装了一个故障排除插件,表明问题是" cURL错误28:在N毫秒后解决超时问题"在向以下网址发出请求时

curl errors

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 issue似乎相似。有人建议使用OpenDNS resolvers。这可能是DNS问题吗?如果是这样,那么这如何与Docker和Azure一起使用?

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

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

当我将nameserver更改为8.8.8.8时,页面会在一到两秒内加载。此外,所有cURL错误都会消失。

如果我理解正确,应使用Docker运行命令选项设置Docker mounts the host machine's resolv.conf file和DNS设置。建议不要直接更改这些文件。

  

Docker如何管理内部DNS配置的确切细节   容器可以从一个Docker版本更改为下一个版本。那么你   不应该假设/ etc / hosts等文件的方式,   /etc/resolv.conf在容器内部进行管理并保留文件   单独使用以下Docker选项。

但是,似乎无法在Azure中设置docker run参数。

1 个答案:

答案 0 :(得分:0)

curl的scm-site命令行在Azure WebApps for Linux的主机上运行,​​而不是在docker容器内。

GitHub moby/moby上存在问题curl fails inside container on https connection,与您的问题非常相似。根据这一点,我认为您需要通过PHP方法--tlsv1为您的Azure WebApp for Linux的docker容器内的curl调用设置curl_setopt($curl, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');选项。

希望它有所帮助。