[英]“cURL error 28: Resolving timed out” on Wordpress on Azure App Service on Linux
我在Linux上使用自定义Docker容器在Azure应用服务上安装Wordpress的响应时间非常慢。 加载页面大约需要20-40秒。
我安装了故障排除插件,当对以下URL发出请求时,指示问题为“ cURL错误28:N毫秒后解析超时”
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问题似乎很相似。 有建议使用OpenDNS解析器 。 这可能是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会挂载主机的resolv.conf文件,并且应该使用Docker run命令选项设置DNS设置。 不建议直接更改这些文件。
Docker如何管理容器内部的DNS配置的确切详细信息可以从一个Docker版本更改为另一个版本。 因此,您不应该假设在容器内管理/etc/hosts、/etc/resolv.conf等文件的方式,不要理会这些文件,而应使用以下Docker选项。
但是,似乎无法在Azure中设置docker run参数。
curl的scm-site命令行在适用于Linux的Azure WebApps的主机上工作,而不是在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调用。
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.