我已经使用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)