提问者:小点点

nginx通过uWSGI在子目录中服务Django


我已经通过了一些以前的线程:我如何设置子目录在nginx与Django如何部署django下郊区后面nginx服务烧瓶应用程序子目录nginx uwsgi

基本的教训是,您应该只需要配置您的网站(s-可用)来实现这一点。我现在已经尝试了各种排列

server {
    listen 80;
    server_name www.example.com;

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

    location /static/ {
        root /path/to/project;
    }

    location /project/ {
        root            /path/to/project;
        include         /etc/nginx/uwsgi_params;
        uwsgi_param     SCRIPT_NAME /project;
        uwsgi_modifier1 30;
        uwsgi_param PATH_INFO "$1";
        uwsgi_pass      unix:/tmp/project.sock;
    }
}

当我将位置定义为“/”时,一切都运行得很好,删除脚本名称、修饰符1、路径信息和根并不重要。但尝试使用子目录总是导致找不到页面(404):

Request URL:    http://www.example.com/project/project

(编辑)它正在向请求添加目录。我还没弄明白什么?

(尝试forced_script_name-不应该使用这个,给其他类型的头痛-和uwsgi配置设置)

编辑:

location /project/ {
    root            /path/to/project;
    include         /etc/nginx/uwsgi_params;
    uwsgi_param     SCRIPT_NAME /project;
    uwsgi_pass      unix:/tmp/project.sock;
}

不起作用。。。套接字就在那里,当我为/-配置时可以工作,我只是看不到我缺少什么。

更新:

location ~ /project(?<path_info>/.*|$) {
    include         /etc/nginx/uwsgi_params;
    uwsgi_pass      unix:/tmp/project.sock;
    uwsgi_param     PATH_INFO $path_info;
    uwsgi_param     SCRIPT_NAME /project;
}

这会加载站点,但所有链接都指向http://example.com/link/to/something而不是http://example.com/project/link/to/something


共3个答案

匿名用户

nginxuwsgi_modifier1在uWSGI中不建议使用。

您的目标是能够从任何地方托管wsgi应用程序,而无需对应用程序进行调整以说明其服务的来源。

在uWSGI中执行此操作的当前方法是为每个URI应用程序组合映射装入点,如下所示:

[uwsgi]
socket = 127.0.0.1:3031
; mount apps
mount = /app1=app1.py
mount = /app2=app2.py
; rewrite SCRIPT_NAME and PATH_INFO accordingly
manage-script-name = true

在同一进程中托管多个应用程序(即管理SCRIPT_NAME和PATH_INFO)

mount可以代替模块

特别是对Django来说,

; Before
module = django_app.wsgi:application
; After
mount = /django_app=django_app.wsgi:application
manage-script-name = true

匿名用户

由于最新版本中删除了uwsgi_modifier1 30,而且我觉得挂载点的内容太粗糙,因此我不得不使用更新的方法在子目录中为Django提供服务:

[uwsgi]
socket =        /tmp/project.sock

# Requires PCRE support compiled into uWSGI
route-run =     fixpathinfo:
location /project {
    include         /etc/nginx/uwsgi_params;
    uwsgi_pass      unix:/tmp/project.sock;
    uwsgi_param     SCRIPT_NAME /project; # Pass the URL prefix to uWSGI so the "fixpathinfo:" route-rule can strip it out
}

因此,如果事情不起作用,尝试安装libpcre和libpcre-dev,然后用pip安装--I--no-cache-dir uwsgi重新编译uwsgi。uWSGI的内部路由子系统要求在编译/安装uWSGI之前安装PCRE库。关于uWSGI和PCRE的更多信息。

匿名用户

首先,去掉uwsgi_modifier130;。Django将自行处理SCRIPT_NAME,不需要由uWSGI重写PATH_INFO。如果uWSGI没有从标题中删除SCRIPT_NAME,这可能是有害的。

其次,删除uwsgi_参数路径信息“$1”来自nginx配置<代码>路径信息已在uwsgi_参数文件中定义,如果要将脚本名称传递给django,则它应该是$document_uri(在uwsgi_参数中是这样),而不是$1

调整之后,django应该将SCRIPT\u NAME视为URL前缀,并将URL调度程序和URL反转调整为该前缀。