使用Docker容器的Nginx代理

时间:2017-05-19 09:49:16

标签: nginx docker

这是我的码头工具。

nginx webserver在端口80上提供服务(暴露给主机)

在单个容器

下运行的端口80(未暴露给主机)上的媒体和博客服务

所有在同一个VM上运行。

        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

我的nginx配置:

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;
        }
}

我的问题:

当我尝试访问以下任何网址时

  

1)http://webserver/story

     

2)http://webserver/videos

在第一次请求后,最后一部分“故事”或“视频”会从网址中删除。

我在nginx conf中遗漏了什么,以确保“故事”或“视频”不会从网址中删除?

1 个答案:

答案 0 :(得分:0)

关于如何在你的节中写出proxy_pass的方法。

来自proxy_pass

  

请求URI按如下方式传递给服务器:

     

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

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

如果指定了proxy_pass而没有URI,请求URI将以与处理原始请求时客户端发送的格式相同的形式传递给服务器,或者在处理更改的URI时传递完整的规范化请求URI: / p>

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

所以改变你的proxy_pass:

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

注意 - 缺少尾部斜杠,意味着它保留了原始URI。

您可能还希望查看rewrite,因为它会执行相关操作。