【问题标题】:How to frontend two wordpress sites running through two docker containers using nginx.如何使用 nginx 前端通过两个 docker 容器运行的两个 wordpress 站点。
【发布时间】:2016-09-22 18:33:41
【问题描述】:

我有两个 wordpress 实例,每个实例都作为一个 docker 容器运行。我想通过单个 nginx 服务器来前端/代理这两个 wordpress 实例。

以下是我的 nginx 配置文件。

upstream docker-site1 {
 server site1_site;
}

upstream docker-site2 {
 server site2_site;
}

server {
  listen         80;
  server_name    myserver.domain.com;

  proxy_set_header Host "myserver.domain.com"; # required for Docker client sake
  proxy_set_header X-Real-IP $remote_addr; #pass on real client IP
  client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads
  # required to avoid HTTP 411: see issue #1486 (https://github.com/dotcloud/docker/issues/1486)
  chunked_transfer_encoding on;

  location /site2 {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/pass/.site1_htpasswd;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_pass http://docker-site2/;

  }

  location / {
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/pass/.site1_htpasswd;
    proxy_set_header Host $http_host;
    add_header HTTP_HOST $http_host;
    proxy_pass http://docker-site1;
    proxy_http_version 1.1;
  }
}

【问题讨论】:

  • 这个配置有问题吗?错误是什么?
  • 这不是 docker 问题。只是 nginx 配置...
  • 我在使用 myserver.domain.com/site2 时无法访问 site2
  • 当然,这不是 docker 问题。但是 wordpress 容器本身无法理解位于子目录中。 Site2 wordpress 容器不尊重/site2 并且始终以myserver.domain.com/ 而不是myserver.domain.com/site2/ 发送URL。因此总是去 site-1 wordpress 网站。

标签: wordpress nginx docker


【解决方案1】:

有一个 nginx-proxy 镜像可以自动代理你的容器。你可以找到它here。像这样运行代理:

$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

然后,您必须使用环境变量运行您的 wordpress 图像

$docker run -e VIRTUAL_HOST=foo.bar.com ...
$docker run -e VIRTUAL_HOST=bar.foo.com ...

或者,更好的是,在 Dockerfile 中添加 ENV 指令并公开端口

# My Wordpress 1 Dockerfile
ENV VIRTUAL_HOST=foo.bar.com
EXPOSE 80

【讨论】:

  • 非常感谢您的回答。但是我的问题是,我没有多个域来指向不同的站点,如果有的话,我也可以使用多个 conf.d 配置文件并执行与 nginx-proxy 相同的操作
【解决方案2】:

虽然我已经使用带有 ssl 的反向代理做了同样的事情。首先,您将所有内容重定向到 https,然后:

server {
    listen *:443 ssl;
    ssl on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate         /etc/nginx/certs/certbundle.pem;
    ssl_certificate_key     /etc/nginx/certs/server.key;
    ssl_dhparam             /etc/nginx/certs/dhparam.pem;

    server_name myserver.domain.com;

    location /site1/ {
            proxy_pass http://127.0.0.1:8030/; #your wordpress container should have the same port

            proxy_set_header Host    $http_host;

            proxy_read_timeout       3500;
            proxy_connect_timeout    3250;

            proxy_set_header   X-Real-IP          $remote_addr;
            proxy_set_header   Host               $host;
            proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto  https;


            proxy_set_header   SSL_PROTOCOL       $ssl_protocol;
            proxy_set_header   SSL_CLIENT_CERT    $ssl_client_cert;
            proxy_set_header   SSL_CLIENT_VERIFY  $ssl_client_verify;
            proxy_set_header   SSL_SERVER_S_DN    $ssl_client_s_dn;

            auth_basic "Area 51 - No trespassing beyound this point without authentication";
            auth_basic_user_file sec/htpasswd;
    }

    location /site2/ {
            proxy_pass http://127.0.0.1:8080/; # again, change the port

            proxy_set_header Host    $http_host;

            proxy_read_timeout       3500;
            proxy_connect_timeout    3250;

            proxy_set_header   X-Real-IP          $remote_addr;
            proxy_set_header   Host               $host;
            proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto  https;


            proxy_set_header   SSL_PROTOCOL       $ssl_protocol;
            proxy_set_header   SSL_CLIENT_CERT    $ssl_client_cert;
            proxy_set_header   SSL_CLIENT_VERIFY  $ssl_client_verify;
            proxy_set_header   SSL_SERVER_S_DN    $ssl_client_s_dn;

            auth_basic "Area 51 - No trespassing beyound this point without authentication";
            auth_basic_user_file sec/htpasswd;
    }

在您的第一个站点的 wp-config.php 中,您应该添加以下行:

 define('WP_HOME', 'https://myserver.domain.com;/site1'); 
 define('WP_SITEURL', 'https://myserver.domain.com;/site1'); 

确保您已连接到数据库。我猜你正在为你的数据库使用另一个容器?如果是,请在您的 wp-config.php 中相应地配置这些属性

define('DB_NAME', 'youDbName'); #default is wordpress
define('DB_USER', 'root');     
define('DB_PASSWORD', 'yourPass');    
define('DB_HOST', 'mysql'); # your db container name    
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

没有ssl应该差不多

编辑:
正如 ShanShan 指出的那样,确保使用 -p 选项和所需端口运行容器,即站点 1 -p 8030:80

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2021-09-01
    • 2015-05-22
    • 2021-02-24
    • 1970-01-01
    相关资源
    最近更新 更多