首页 文章

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

提问于
浏览
0

我正在尝试使用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盒子的工作解决方案

Vagrant Configuration

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

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

nginx configuration

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 configuration

Docker-compose.yml file:

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>

Run docker container

docker-compose up -d

Route

wp.dev(10.10.45.10)→docker_wp(10.10.45.11端口8080)

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

Broken Configuration

/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配置相同 .

Testing configuration and results

卷曲测试:卷曲..com

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

页面挂起,我在 Headers 中看到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配置来隐藏目标端口,但似乎没有任何工作 .

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

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

error_log /var/log/nginx/mydomain_nonssl_error.log debug;

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

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

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

反向代理的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

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

    • 穆罕默德·阿兹法尔
  • 0

    更改

    proxy_redirect off

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

相关问题