使用自定义Docker容器在Linux上的Azure App Service上安装我的Wordpress的响应时间非常慢。页面大约需要20-40秒才能加载。
我安装了一个故障排除插件,表明问题是" 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 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参数。
答案 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');
选项。
希望它有所帮助。