加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > Nginx > 正文

在子文件夹上托管Django

发布时间:2020-12-13 20:56:21 所属栏目:Nginx 来源:网络整理
导读:我已经使用Gunicorn和NGINX部署了Django,并且如果使用以下配置将Django应用提供给根网址,则可以很好地工作: server { listen 80; location = /favicon.ico { access_log off; log_not_found off; } location / { include proxy_params; proxy_pass http://u

我已经使用Gunicorn和NGINX部署了Django,并且如果使用以下配置将Django应用提供给根网址,则可以很好地工作:

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”的内容.

最佳答案
我的评论并未显示全部内容.当我在子文件夹上运行Django站点时,我喜欢使用动态配置,以便您仍可以直接访问计算机(无需代理)并拥有可运行的Web应用程序.这可以帮助很多人调试难以在开发中重现的棘手内容.

如果您没有传递标头或修改wsgi.py的能力,仍可以在Django设置中设置FORCE_SCRIPT_NAME.

3个步骤:

>在网络服务器之前设置代理,以将子文件夹从URL中剥离
>设置X-Script-Name标头,以便您的Django站点使用/ myapp /开头生成其url-确保您使用的是{%url%}标签,并进行反向编码和硬编码!
>修改myapp / wsgi.py以将新的标头X-Script-Name读取到wsgi环境变量SCRIPT_NAME中(基于this flask snippet)

这是代理的Nginx配置示例,该配置指向子目录上的Django站点,并且还设置了X-Script-Name(步骤1和2),请注意,它不使用unix套接字,因此与OP的问题.欢迎编辑:

nginx.conf

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

并读取X-Script-Name:

myapp / wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE","myapp.settings")

_application = get_wsgi_application()


def application(environ,start_response):
    # http://flask.pocoo.org/snippets/35/
    script_name = environ.get('HTTP_X_SCRIPT_NAME','')
    if script_name:
        environ['SCRIPT_NAME'] = script_name
        path_info = environ['PATH_INFO']
        if path_info.startswith(script_name):
            environ['PATH_INFO'] = path_info[len(script_name):]

    scheme = environ.get('HTTP_X_SCHEME','')
    if scheme:
        environ['wsgi.url_scheme'] = scheme

    return _application(environ,start_response)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读