如何使用子文件夹域配置nginx代理通行证,其中包括gunicorn Django



如何配置 ngnix 以将代理通行证从具有子文件夹的域重定向到/?
例:
https://example.com/yoursub/自不带/yoursub/前缀
的本地主机目前,从内部网直接访问服务器 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的任何信息吗?
我无法控制基本域。

如果我

理解正确,您想删除 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请求

试试这个:

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

解释

根据nginx文档:

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

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

我处理这个问题的方式是使用重写规则:

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

相关内容

最新更新