0

TL;DR 为什么这个wordpress:latest Dockerfile可以使用nginx-proxy 但这个不是wordpress:fpm Dockerfile?以及如何使用wordpress:fpm图像nginx-proxy

你好,

我成功地将 nginx-proxy 与一些 wordpress 容器一起使用。例如,这docker-compose.yml完美地工作:

db:
  image: mariadb
  environment:
    - MYSQL_ROOT_PASSWORD=password
  volumes:
    - /home/stack/my_domain/bdd:/var/lib/mysql

wordpress:
  image: wordpress
  links:
    - db:mysql
  environment:
    - VIRTUAL_HOST=my_domain.fr,www.my_domain.fr
    - LETSENCRYPT_HOST=www.my_domain.fr
    - LETSENCRYPT_EMAIL=contact@my_domain.fr
  env_file:
    - ./env

  volumes:
    - /home/stack/my_domain/wordpress:/var/www/html

但是,如果我使用wordpress:fpm图像(而不是基于 apache 的图像)我有 502 Bad Gateway 错误,并且日志中出现这条消息:

nginx.1 | 2017/08/14 21:29:51 [错误] 347#347: *2447 connect() 在连接到上游时失败(111:连接被拒绝),客户端:86.222.20.31,服务器:www.my_domain.fr,请求: “GET /contact/ HTTP/2.0”,上游:“ http://172.17.0.14:80/contact/ ”,主机:“www.my_domain.fr”,引荐来源:“ https://www.my_domain.fr/ "

这个消息:

root@9408854fae4b:/etc/nginx/conf.d# nginx -s reload 2017/08/14 21:37:35 [emerg] 671#671: /etc/nginx/conf 中“上游”指令中的参数数量无效。 d/default.conf:53 nginx:[emerg] /etc/nginx/conf.d/default.conf:53 中“上游”指令中的参数数量无效

第 53 行的 default.conf 包含

upstream mydomain.fr {
                                ## Can be connect with "bridge" network
                        # my_domain_wordpress_1
                        server 172.17.0.14:9000;
}

其他域有服务器172.17.0.xx:80;,所以我在 docker-compose.yml 文件中添加port:80和/或。expose:80我设法获得

upstream mydomain.fr {
                                ## Can be connect with "bridge" network
                        # my_domain_wordpress_1
                        server 172.17.0.14:80;
}

但同样的 502 错误。

知道为什么吗?

问候

4

1 回答 1

0

原因是两个图像的工作方式不同。

wordpress:latest在端口 80 上使用 apache,并使用执行的正确 PHP 脚本响应请求。它处理 HTTP 协议。

另一方面wordpress:fpm,使用 PHP-FPM,它是一个快速 CGI 服务器,它不仅仅需要proxy_pass其他 nginx 参数,如下所示

     location ~ \.php$ {
     try_files $uri =404;
           fastcgi_pass http://fpm:9000;
           fastcgi_index index.php;
           include /etc/nginx/fastcgi_params;
     }

nginx-proxyimage 只是检查哪些容器使用VIRTUAL_HOST环境变量启动,检查其暴露的端口,然后创建一个代理传递模板。你需要的是一个不同的模板。这可以使用每主机配置来完成。

每个 VIRTUAL_HOST

要基于每个 VIRTUAL_HOST 添加设置,请在 /etc/nginx/vhost.d 下添加配置文件。与代理范围的情况不同,它允许多个配置文件的名称以 .conf 结尾,每个 VIRTUAL_HOST 文件必须完全在 VIRTUAL_HOST 之后命名。

为了允许在添加和删除后端时动态配置虚拟主机,将外部目录挂载为 /etc/nginx/vhost.d 是最有意义的,而不是使用派生图像或挂载单个配置文件。

例如,如果您有一个名为 app.example.com 的虚拟主机,您可以为该主机提供自定义配置,如下所示:

$ docker run -d -p 80:80 -p 443:443 -v /path/to/vhost.d:/etc/nginx/vhost.d:ro -v /var/run/docker.sock:/tmp/ docker.sock:ro jwilder/nginx-proxy $ { echo 'server_tokens off;'; echo 'client_max_body_size 100m;'; } > /path/to/vhost.d/app.example.com

关注以下网址了解更多详情

https://github.com/jwilder/nginx-proxy#per-virtual_host

于 2017-08-16T05:25:48.900 回答