如何使用子文件夹域whith gunicorn Django配置nginx代理传递

时间:2019-02-07 17:34:59

标签: django nginx webserver proxypass

如何配置ngnix以便将代理路径从具有子文件夹的域重定向到/?
示例:
https://example.com/yoursub/ 至 没有/ yoursub /前缀的localhost
目前,从Intranet直接访问服务器IP http://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的任何事情?
我无法控制基本域。

3 个答案:

答案 0 :(得分: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的请求。

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

如果您想添加 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的请求

答案 1 :(得分:1)

尝试一下:

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

说明

按照nginx docs

  

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

由于/位置匹配任何内容,因此所有内容都将替换为/proxy_pass中的斜杠),然后再替换为上游。

答案 2 :(得分:0)

我处理此问题的方法是使用重写规则:

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

该重写会将您的URL从/yoursub/path/to/view转换为/path/to/view,用于您的应用服务器。