nginx 子路径反向代理配置

nginx 子路径反向代理配置

我目前在 nginx 中有这样的反向代理配置

    server {
        listen 8888 default_server;

        root /usr/share/nginx/html;
        index index.html index.htm;

    location / {
        try_files $uri @proxy;
    }

    location = / {
        try_files $uri @proxy2;
    }

    location = /redirect.html {
        try_files $uri @proxy2;
    }

    location ~ /user/(.*)$ {
        try_files index.html @proxy2;
    }

    location @proxy2 {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:6079;
        max_ranges 0;
    }

    location @proxy {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:6081;
        max_ranges 0;
    }

    location = /websockify {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://127.0.0.1:6081;
    }

}

我的问题是,我有一个 类型的 URL http://example.com:8888/user/username,我需要将其重定向到localhost:6079。不幸的是,监听端口 6079 的 URL 需要没有/user/username部分的 URL。据我了解,当我尝试使用此配置时,我得到了一个 flask 生成的 404(端口 6079 上的应用程序是一个 flask 应用程序)。整个下午我几乎尝试了所有方法,包括重写 URL、对实际 URL 进行硬编码以及 nginx 文档中的其他技巧,但我找不到可行的解决方案。

观察一下,如果我直接连接到http://本地主机:6079/该应用程序运行良好,所以它似乎确实是这个 nginx 设置。

编辑

我尝试按照建议进行修改,并在 proxy2 proxy_pass 行中添加 /,但它会抱怨,正如这里所解释的那样

https://stackoverflow.com/questions/21662940/proxy-pass-cannot-have-uri-part-in-location/21714937#21714937

至于日志,我没有看到任何意外,除非我连接到 localhost:8888/user/username 它会显示 404,如果我连接到 localhost:8888 我会看到 flask 应用程序。

请记住,nginx 位于 docker 镜像上,但我从主机进行浏览,因此 nginx 中的 127.0.0.1 是 docker 实例,当我浏览 127.0.0.1 时,它是主机,端口通过我启动容器时设置的网桥。

编辑2

日志没有说明太多信息。

172.17.42.1 - - [10/May/2016:22:14:05 +0000] "GET /user/sborini/redirect.html?width=1375&height=695 HTTP/1.1" 200 212 "http://localhost:8888/user/sborini/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"
172.17.42.1 - - [10/May/2016:22:14:05 +0000] "GET /user/sborini/vnc_auto.html HTTP/1.1" 404 166 "http://localhost:8888/user/sborini/redirect.html?width=1375&height=695" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"
172.17.42.1 - - [10/May/2016:22:14:57 +0000] "GET /user/sborini/vnc_auto.html HTTP/1.1" 404 209 "http://localhost:8888/user/sborini/redirect.html?width=1375&height=695" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"
172.17.42.1 - - [10/May/2016:22:14:58 +0000] "GET /user/sborini/vnc_auto.html HTTP/1.1" 404 209 "http://localhost:8888/user/sborini/redirect.html?width=1375&height=695" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"
172.17.42.1 - - [10/May/2016:22:18:59 +0000] "GET / HTTP/1.1" 200 454 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0"

看看如果我连接到普通/条目我会得到什么无论如何,我尝试了一个简化的情况:

server {
    listen 8888 default_server;

    root /usr/share/nginx/html;
    index index.html index.htm;

location = /user/sborini/ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:5555;
    max_ranges 0;
}

}

还有一个 netcat 在监听 5555。我得到一个坏网关。正在调查。

答案1

在 proxy_pass 指令末尾添加一个斜杠。

proxy_pass http://127.0.0.1:6079/;

来源

文档

祈祷这个方法可行...我在 Google 上花了 30 秒才解决。

相关内容