nginx通过uWSGI在一个子目录中提供Django

Bjo*_*orn 11 django nginx subdirectory uwsgi

我已经经历了一些以前的线程: 如何在nginx中使用Django设置子目录如何在nginx 后面的子区域下部署django在 子目录nginx + uwsgi上服务烧瓶app

基本的教训是,您只需要配置您的站点(可用)即可实现此目的.我现在尝试了各种各样的排列

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我将location定义为"/"时,一切都运行得很好(并删除SCRIPT_NAME,modifier1,PATH_INFO和root并不重要.但是尝试使用子目录总是会导致找不到页面(404):

Request URL:    http://www.example.com/project/project
Run Code Online (Sandbox Code Playgroud)

(编辑)它正在为请求添加目录.我怎么不搞清楚?

(尝试过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;
}
Run Code Online (Sandbox Code Playgroud)

不工作......套接字在那里,当我配置/时工作 - 我只是看不到我错过的东西.

更新:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

sha*_*rey 8

nginx的uwsgi_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
Run Code Online (Sandbox Code Playgroud)

在同一过程中托管多个应用(也称为管理SCRIPT_NAME和PATH_INFO)

mount 可以代替 module

对于Django,

; Before
module = django_app.wsgi:application
; After
mount = /django_app=django_app.wsgi:application
manage-script-name = true
Run Code Online (Sandbox Code Playgroud)

  • 很高兴有帮助。正确运行uWSGI是我做过的最困难的事情之一;-) (3认同)

Bjo*_*orn 0

最终放弃了尝试“巧妙地”做到这一点。

最终的解决方案只是创建一个设置变量,并将其作为 static_url 和项目 urls.py 文件的前缀。nginx 端没有 SCRIPT_NAME 或任何复杂的内容。