带有Docker容器的Nginx代理

这是我的docker红外线。

服务于端口80的nginx webserver(暴露给主机)

媒体和博客服务端口80(不暴露给主机)运行在单个容器

所有运行在同一个虚拟机上。


Name Command State Ports ---------------------------------------------------------------------------------- media docker-php-entrypoint apac ... Up 80/tcp mysql_db_blog docker-entrypoint.sh mysqld Up 3306/tcp mysql_db_media docker-entrypoint.sh mysqld Up 3306/tcp webserver nginx -g daemon off; Up 0.0.0.0:80->80/tcp blog docker-entrypoint.sh apach ... Up 80/tcp 

我的nginxconfiguration:

 server { listen 80 default_server; server_name 192.168.0.7; server_tokens off; location /story/ { proxy_pass http://blog/; proxy_set_header Host $host; 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 $server_name; } location /videos/ { proxy_pass http://media/; proxy_set_header Host $host; 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 $server_name; } } 

我的问题:

当我尝试访问下面的任何URL时

1) http:// webserver / story

2) http:// webserver / videos

在第一次请求后,最后一部分的“故事”或“video”从url中删除。

我从nginx conf中错过了什么,以确保'故事'或'video'不会从url中删除?

这是关于如何在您的节中写入proxy_pass

从proxy_pass :

一个请求URI被传递给服务器,如下所示:

如果proxy_pass指令是使用URI指定的,那么当请求传递给服务器时,与该位置匹配的标准化请求URI部分将被指令中指定的URIreplace:

 location /name/ { proxy_pass http://127.0.0.1/remote/; } 

如果指定的proxy_pass没有URI,那么当处理原始请求时,请求URI将以与客户端发送的forms相同的forms传递给服务器,或者在处理更改后的URI时传递完整的规范化请求URI:

 location /some/path/ { proxy_pass http://127.0.0.1; } 

所以改变你的proxy_pass:

 location /videos/ { proxy_pass http://media; 

注意 – 缺less斜线,意味着它保留了原始的URI。

你可能也想看看rewrite因为它做了一些相关的事情。