nut*_*ina 4 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;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在另一个 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;
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能让这个工作?到目前为止,我无法找到任何解决方案来指定诸如“BASE_URL”之类的内容。
我的评论没有显示全貌。当我在子文件夹上运行 Django 站点时,我喜欢使用动态配置,以便您仍然可以直接访问机器(没有代理)并拥有一个有效的网络应用程序。这可以帮助很多调试棘手的东西,这些东西很难在开发中重现。
如果您没有能力传递标头或修改 wsgi.py,您仍然可以 FORCE_SCRIPT_NAME在您的 Django 设置中进行设置。
3个步骤:
X-Script-Name标题,以便您的 Django 站点/myapp/在它们的前面生成它的url——确保您使用{% url %}标签和reverse, 与硬编码!SCRIPT_NAME(基于此烧瓶片段)这是一个代理的 Nginx 配置示例,该代理指向子目录中的 Django 站点并设置 X-Script-Name(步骤 1 和 2),注意这不使用 unix 套接字,因此它与OP的问题。欢迎编辑:
配置文件
location /my_app {
proxy_pass https://mywebapp.com/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Script-Name /my_app;
proxy_cookie_path / /my_app;
}
Run Code Online (Sandbox Code Playgroud)
并阅读 X-Script-Name:
我的应用程序/ 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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3706 次 |
| 最近记录: |