Nginx反向代理通过ecs到docker容器中的wordpress

时间:2019-09-18 15:08:47

标签: wordpress docker nginx amazon-ecs nginx-reverse-proxy

我正在尝试proxy_pass到通过Amazon ECS实例在Docker容器中设置的http Wordpress网站。客户端通过我们已设置的测试服务器(https://test.xxxxxxx.com)到达站点。当用户转到https://test.xxxxxxx.com时,我希望它在地址栏中显示https://test.xxxxxxx.com,但调出我的Wordpress网站的页面(端口80上的http://xx.xxx.xxx.xxx)。

我可以将其转到我的Wordpress网站,但看起来很有趣。我收到很多混合内容错误,因为我试图通过https请求访问http文件。我了解发生了什么,但是即使尝试了所有可以在网上找到的建议,我也似乎无法解决。

我尝试更改站点可用文件夹中的Nginx文件中的几个设置,以及更改Wordpress网站上wp-config.php中的设置。以下是我尝试过的一件事。我发现的几乎所有教程以及我尝试过的所有内容都是这种形式的变体。

#Nginx file

server {
    listen 443;

    location / {
        proxy_pass http://xx.xxx.xxx.xxx:80;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
#wp-config.php

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
    $_SERVER['HTTPS'] = '1';

if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
    $_SERVER[HTTP_HOST'] = $_SERVER[HTTP_X_FORWARDED_HOST'];
}

define( 'WP_HOME', 'http://xx.xxx.xxx.xxx');
define( 'WP_SITEURL', 'http://xx.xxx.xxx.xxx');

我想发生的是,当用户在地址栏中输入https://test.xxxxxxx.com时,我的Wordpress网站加载了正确的主题和所有图像,但是https://test.xxxxxxx.com仍显示在地址栏中

1 个答案:

答案 0 :(得分:0)

我建议您在ECS中使用HA-Proxy反向代理。 我尝试了nginx反向代理,但失败了。 HA-Proxy并获得成功。 它比nginx配置更简单。

首先,使用Docker的“链接”选项并设置“环境变量”(例如LINK_APP,LINK_PORT)。

第二,将此“环境变量”填充到haproxy.cfg中。

此外,我建议您使用“动态端口映射”到ALB。它使作品更加灵活。

taskdef.json:

# taskdef.json

{
    "executionRoleArn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/<APP_NAME>_ecsTaskExecutionRole",
    "containerDefinitions": [
      {
        "name": "<APP_NAME>-rp",
        "image": "gnokoheat/ecs-reverse-proxy:latest",
        "essential": true,
        "memoryReservation": <MEMORY_RESV>,
        "portMappings": [
          {
            "hostPort": 0,
            "containerPort": 80,
            "protocol": "tcp"
          }
        ],
        "links": [
          "<APP_NAME>"
        ],
        "environment": [
          {
            "name": "LINK_PORT",
            "value": "<SERVICE_PORT>"
          },
          {
            "name": "LINK_APP",
            "value": "<APP_NAME>"
          }
        ]
      },
      {
        "name": "<APP_NAME>",
        "image": "<IMAGE_NAME>",
        "essential": true,
        "memoryReservation": <MEMORY_RESV>,
        "portMappings": [
          {
            "protocol": "tcp",
            "containerPort": <SERVICE_PORT>
          }
        ],
        "environment": [
          {
            "name": "PORT",
            "value": "<SERVICE_PORT>"
          },
          {
            "name": "APP_NAME",
            "value": "<APP_NAME>"
          }
        ]
      }
    ],
    "requiresCompatibilities": [
      "EC2"
    ],
    "networkMode": "bridge",
    "family": "<APP_NAME>"
  }

haproxy.cfg:

# haproxy.cfg

global
    daemon
    pidfile /var/run/haproxy.pid

defaults
    log global
    mode http
    retries 3
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend http
    bind *:80

    http-request set-header X-Forwarded-Host %[req.hdr(Host)]

    compression algo gzip
    compression type text/css text/javascript text/plain application/json application/xml

    default_backend app

backend app
    server static "${LINK_APP}":"${LINK_PORT}"

Dockerfile(haproxy):

FROM haproxy:1.7
USER root
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
  

请参阅:

     

Github:https://github.com/gnokoheat/ecs-reverse-proxy

     

Docker镜像:gnokoheat / ecs-reverse-proxy:latest