【问题标题】:How to config nginx proxy pass using subfolder domain whith gunicorn Django如何使用 gunicorn Django 的子文件夹域配置 nginx 代理通行证
【发布时间】:2019-07-01 21:51:19
【问题描述】:

如何配置 ngnix 以将 proxypass 从具有子文件夹的域重定向到 /?
示例:
https://example.com/yoursub/ 到 没有 /yoursub/ 前缀的本地主机
目前从内网直接访问服务器iphttp://xxx.xxx.xxx.xx/没有问题。

我的 nginx 配置文件:

upstream app_server {
    server unix:/home/myname/APP-Server/gunicorn/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;

    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name 123.456.789.1;

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /home/myname/APP-Server/logs/nginx-access.log;
    error_log /home/myname/APP-Server/logs/nginx-error.log;

    location /static/ {
        alias /home/myname/APP-Server/static-root/;
    }

    # checks for static file, if not found proxy to app
    location / {
try_files $uri @proxy_to_app; 
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}

如果相关:后端是带有 gunicorn 服务器的 django 应用程序。
我是否需要考虑从 https 到 http 的重定向?
我无法控制基本域。

【问题讨论】:

    标签: django nginx webserver proxypass


    【解决方案1】:

    我的处理方式是使用重写规则:

    location /yoursub {
        rewrite /yoursub(.*) $1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;      
        proxy_redirect off;
        proxy_pass http://app_server;
    }
    

    重写会将您的网址从 /yoursub/path/to/view 转换为 /path/to/view 以供您的应用服务器使用。

    【讨论】:

      【解决方案2】:

      如果我理解正确,您想删除 URI 的第一部分。有多种方法可以做到这一点,但最简单的可能是使用 alias 指令,它将删除与当前位置块匹配的 URI 部分:

      location /foo/ {
          alias /home/myname/APP-Server/static-root/;  # It doesn't really matter what you put here, since you're proxying everything.
      
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
          proxy_pass http://app_server;
      }
      

      如果您的 Nginx 服务器在 foobar.example 上运行并且您请求 http://foobar.example/foo/bar,则上游服务器将看到对 http://foobar.example/bar 的请求。

      别名指令可能有点错误/不直观,因此最好将您的位置指令保持在顶级(不嵌套在其他位置块中)并尽可能简单。

      如果您想添加前缀到 URI,您可以在 proxy_pass 指令本身中执行此操作:

      location @proxy_to_app {
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_redirect off;
          proxy_pass http://app_server/foo$uri$is_args$args;
      }
      

      如果您的 Nginx 服务器在 foobar.example 上运行并且您请求 http://foobar.example/bar,则上游服务器将看到对 http://foobar.example/foo/bar 的请求

      【讨论】:

        【解决方案3】:

        试试这个:

        server {
            ...
            location @proxy_to_app {
                ...
                proxy_pass http://app_server/;  # note the trailing slash
            }
        }
        

        说明

        根据nginx docs

        如果 proxy_pass 指令使用 URI 指定,则当请求传递到服务器时,与位置匹配的规范化请求 URI 部分将替换为指令中指定的 URI。

        由于/ 位置匹配任何内容,因此在代理到上游之前,所有内容都将替换为/proxy_pass 中的尾部斜杠)。

        【讨论】:

        • 用斜线我得到“502 Bad Gateway”
        • 不使用 nginx 可以访问上游的应用吗? 502 错误表示 nginx 无法从服务器获得有效响应(它无法到达),通常是因为它已关闭或配置错误。仔细检查您的 gunicorn 配置。
        猜你喜欢
        • 1970-01-01
        • 2021-02-08
        • 2017-05-30
        • 2017-02-23
        • 2013-06-12
        • 2019-09-19
        • 2011-12-15
        • 2017-11-22
        • 2017-07-25
        相关资源
        最近更新 更多