我正在尝试运行多个都在端口80上运行nginx侦听的docker容器,但将不同的主机端口映射到容器端口80。
在大多数情况下,这是可行的,但nginx由于缺少尾部斜杠而进行重定向时除外。
server {
listen 80;
root /var/www;
index index.html;
location /docs {}
}
给定上述nginx配置和一个运行它的docker容器,并将其主机端口8080映射到容器端口80,我可以通过curl ok获得localhost:8080 / docs /:
> GET /docs/ HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 200 OK
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:27:05 GMT
< Content-Type: text/html
< Content-Length: 6431
< Last-Modified: Sat, 28 Nov 2015 17:17:06 GMT
< Connection: keep-alive
< ETag: "5659e192-191f"
< Accept-Ranges: bytes
<
... html page ...
但是,如果我请求localhost:8080 / docs,则会重定向到localhost / docs /
> GET /docs HTTP/1.1
> User-Agent: curl/7.35.0
> Host: localhost:8080
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
* Server nginx/1.9.5 is not blacklisted
< Server: nginx/1.9.5
< Date: Sat, 28 Nov 2015 17:29:40 GMT
< Content-Type: text/html
< Content-Length: 184
< Location: http://localhost/docs/
< Connection: keep-alive
<
... html redirect page ...
进行重定向时,如何让nginx保留原始端口?我尝试查看port_in_redirect和server_name_in_redirect,但它们没有帮助。
编辑
基于https://forum.nginx.org/read.php?2,261216,261216#msg-261216,目前看来这不可能。
查看nginx-proxy容器,因此您无需执行任何此类疯狂的端口重写垃圾操作。
—
Michael Hampton
我真的不希望在这些容器前保持平衡。我有一个docker-compose文件,该文件基于env var设置外部端口,大多数时候,我只是一次“ docker-compose up -d”该文件。但是出于测试的原因,并允许我从事其他工作,我希望能够执行“ PORT = 8080 docker-compose -p test up -d”来启动一组全新的容器(由于新的项目名称) )映射到其他主机端口。
—
伊巴萨2015年
阿克,也碰到了这个问题。我猜我将不得不使用nginx或将8080上的内容移动到其他位置。
—
肯(Ken)