在子文件夹中托管Django

时间:2017-12-22 11:52:00

标签: django nginx gunicorn

我已经使用Gunicorn和NGINX部署了Django,如果Django应用程序在根URL上提供,它的工作正常,具有以下配置:

server {
    listen 80;

    location = /favicon.ico { access_log off; log_not_found off; }

    location / {
        include proxy_params;
        proxy_pass http://unix:my_app.sock;
    }
}

然而,当我尝试在另一个URL上提供Django应用程序时,它不起作用。 如果我尝试访问http://domain/my_app/admin/,那么Django告诉我它无法找到该视图。

这是NGINX配置:

server {
    listen 80;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /my_app {
        include proxy_params;
        proxy_pass http://unix:/var/my_app/app.sock;
    }
}

我怎么能让这个工作?到目前为止,我无法找到任何解决方案来指定类似“BASE_URL”的内容。

1 个答案:

答案 0 :(得分:3)

我的评论并未显示整体情况。当我在子文件夹上运行Django网站时,我喜欢使用动态配置,这样你仍然可以直接访问机器(没有代理)并拥有一个可用的网络应用程序。这可以帮助很多人调试这样难以在dev中重现的棘手的东西。

如果您无法传递标题或修改wsgi.py,您仍然可以在Django设置中设置FORCE_SCRIPT_NAME

3个步骤:

  1. 在网络服务器前设置代理,将子文件夹从网址中删除
  2. 设置X-Script-Name标题,以便您的Django网站在其前面/myapp/生成其网址 - 确保您使用{% url %}代码和{{1} },与硬编码!
  3. 修改myapp / wsgi.py,将新的标题X-Script-Name读入wsgi环境变量reverse(基于this flask snippet
  4. 下面是代理的Nginx配置示例,该代理指向子目录上的Django站点并设置X-Script-Name(步骤1和2),请注意,这不使用unix套接字,所以它与OP的问题略有不同。欢迎编辑:

    nginx.conf

    SCRIPT_NAME

    阅读X-Script-Name:

    的myapp / wsgi.py

    location /my_app {
        rewrite ^/my_app/(.*)$ /$1 break;
        proxy_pass https://mywebapp.com/$uri$is_args$args;
        proxy_set_header Host $host;
        proxy_set_header X-Script-Name /my_app;
        proxy_cookie_path / /my_app;
    }