nginx反向代理到wordpress docker容器挂起HTTP 301错误

时间:2017-08-19 16:49:57

标签: wordpress nginx nginx-reverse-proxy

我正在尝试使用nginx作为运行wordpress的多个docker容器的反向代理。 nginx实例和docker正在Ubuntu 16.04.3服务器上运行。我一直在我的本地开发环境中使用Vagrant测试它,使用单独的Ubuntu框用于nginx,另一个用于docker。 vagrant配置按预期工作,但是当我尝试在单个物理Ubuntu服务器上进行类似配置时,到wordpress docker容器的路由挂起并最终返回HTTP 301错误。

注意:对于侦听不同端口的其他docker容器使用类似的nginx反向代理配置。例如,在docker中运行Jenkins并使用反向代理到该容器可以成功运行。

以下是我与Vagrant一​​起使用的配置,然后是我的物理Ubuntu服务器:

使用Vagrant和两个独立的Ubuntu框的工作解决方案

流浪汉配置

Nginx在一个单独的Ubuntu Box中运行

设置本地主机文件 / etc / hosts 10.10.45.10 - wp.dev

nginx配置

server {
listen 80;
listen [::]:80;
server_name wp.dev;
error_log /var/log/nginx/wp_dev_error.log debug;

    location / {
        proxy_pass      http://10.10.45.11:8080;
        proxy_redirect  off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Wordpress泊坞窗配置

Docker-compose.yml文件:

  version: "2"
  services:
  my-wpdb:
    image: mariadb
    ports:
      - "8081:3306"
    environment:
      MYSQL_ROOT_PASSWORD: <some_password>
  my-wp:
    image: wordpress
    volumes:
      - ./:/var/www/html
    ports:
      - "8080:80"
    links:
      - my-wpdb:mysql
    environment:
      WORDPRESS_DB_PASSWORD: <some_password>

运行泊坞窗容器

docker-compose up -d

路线

wp.dev(10.10.45.10)→docker_wp(10.10.45.11 port 8080)

卷曲测试:卷曲wp.dev - 成功 10.10.45.1 - - [18 / Aug / 2017:21:38:37 +0000]“GET / HTTP / 1.1”200 51638“ - ”“curl / 7.54.0”

配置损坏

/etc/nginx/sites-available/sub1.mydomain.com.conf

server {
    listen 80;
    listen [::]:80;
    server_name sub1.mydomain.com;
    error_log /var/log/nginx/mydomain_nonssl_error.log debug;

    location / {

        proxy_pass http://localhost:8080;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}

wordpress docker容器的Docker-compose文件与上面的vagrant配置相同。

测试配置和结果

卷曲测试:curl ..com

159.203.127.57 - - [18/Aug/2017:15:37:52 -0600] "GET / HTTP/1.1" 301 0 "-" "curl/7.47.0"

页面挂起,我在标题中看到HTTP 301错误。

curl -v http://

* Rebuilt URL to: http://<my_testdomain>/
*   Trying xx.xx.xx.91...
* Connected to sub1.mydomain.com (xx.xx.xx.91) port 80 (#0)
> GET / HTTP/1.1
> Host: sub1.mydomain.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 301 Moved Permanently
< Server: nginx/1.10.3 (Ubuntu)
< Date: Sat, 19 Aug 2017 15:05:38 GMT
< Content-Type: text/html; charset=UTF-8
< Content-Length: 0
< Connection: keep-alive
< X-Powered-By: PHP/5.6.31
**< Location: http://<my_test_domain>:8080/**
< 
* Connection #0 to host <my_test_domain> left intact

注意:路由继续使用URL中的目标端口。我在Vagrant配置中没有看到这一点。这可能是问题所在。

我尝试过不同的nginx配置来隐藏目标端口,但似乎没有任何效果。

以下是一些可能有助于解决此问题的具体问题:

  1. 如何使用nginx启用更多调试信息。我正在使用以下“error_log”设置,但希望启用“详细”日志记录以确定路由的工作方式。
  2. error_log /var/log/nginx/mydomain_nonssl_error.log debug;

    1. 当我在同一台机器上运行nginx反向代理时,为什么目标端口仍显示在URL中,但在Vagrant中运行单独的框的类似配置会隐藏端口并在请求中使用原始URL?

    2. 问题出在导致301 HTTP错误的Docker wordpress / Apache容器中吗?

    3. 我已经在这个问题上工作了好几天,但一直无法解决这个问题。在此先感谢您的帮助。

      **反向代理的Nginx日志文件**

          2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: "X-Real-IP: "
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script var: "168.179.61.161"
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: "
      "
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: "X-Forwarded-For: "
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script var: "168.179.61.161"
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: "
      "
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: "Connection: close
      "
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: ""
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: ""
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: ""
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http script copy: ""
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http proxy header: "user-agent: curl/7.53.0"
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http proxy header: "accept: */*"
      2017/08/28 09:53:14 [debug] 11853#11853: *1 http proxy header:
      "GET / HTTP/1.0
      Host: <mydevsite>
      X-Real-IP: 168.179.61.161
      X-Forwarded-For: 168.179.61.161
      Connection: close
      user-agent: curl/7.53.0
      accept: */*
      
      … snip ….
      
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http upstream request: "/?"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http upstream process header
      2017/08/28 09:53:15 [debug] 11853#11853: *1 malloc: 000055D755D248F0:4096
      2017/08/28 09:53:15 [debug] 11853#11853: *1 recv: fd:29 246 of 4096
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy status 301 "301 Moved Permanently"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 posix_memalign: 000055D755D168A0:4096 @16
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header: "Date: Mon, 28 Aug 2017 15:53:14 GMT"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header: "Server: Apache/2.4.10 (Debian)"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header: "X-Powered-By: PHP/5.6.31"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header: "Location: http://<mydevsite>:8080/"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header: "Content-Length: 0"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header: "Connection: close"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header: "Content-Type: text/html; charset=UTF-8"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy header done
      2017/08/28 09:53:15 [debug] 11853#11853: *1 xslt filter header
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 header filter
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: ":status: 301"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "server: nginx/1.10.3 (Ubuntu)"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "date: Mon, 28 Aug 2017 15:53:15 GMT"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "content-type: text/html; charset=UTF-8"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "content-length: 0"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "location: http://<mydevsite>:8080/"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "x-powered-by: PHP/5.6.31"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "strict-transport-security: max-age=63072000; includeSubdomains"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "x-frame-options: DENY"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 output header: "x-content-type-options: nosniff"
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2:1 create HEADERS frame 000055D755D16B78: len:200
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http cleanup add: 000055D755D16C60
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 frame out: 000055D755D16B78 sid:1 bl:1 len:200
      2017/08/28 09:53:15 [debug] 11853#11853: *1 SSL buf copy: 9
      2017/08/28 09:53:15 [debug] 11853#11853: *1 SSL buf copy: 200
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2:1 HEADERS frame 000055D755D16B78 was sent
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http2 frame sent: 000055D755D16B78 sid:1 bl:1 len:200
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http cacheable: 0
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http proxy filter init s:301 h:0 c:0 l:0
      2017/08/28 09:53:15 [debug] 11853#11853: *1 http upstream process upstream
      2017/08/28 09:53:15 [debug] 11853#11853: *1 pipe read upstream: 1
      2017/08/28 09:53:15 [debug] 11853#11853: *1 pipe preread: 0
      2017/08/28 09:53:15 [debug] 11853#11853: *1 readv: 1, last:3850
      2017/08/28 09:53:15 [debug] 11853#11853: *1 pipe recv chain: 0
      2017/08/28 09:53:15 [debug] 11853#11853: *1 pipe buf free s:0 t:1 f:0 000055D755D248F0, pos 000055D755D249E6, size: 0 file: 0, size: 0
      

2 个答案:

答案 0 :(得分:0)

在看到你试图在nginx方面进行调试之前,我建议你试试nginx的上游是如何活动的。可以从nginx发布http://localhost:8080的输出吗?

- 穆罕默德·阿兹法尔

答案 1 :(得分:0)

更改

proxy_redirect off

proxy_redirect http://localhost:8080/ http://$host/