我已经通过了一些以前的线程:我如何设置子目录在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
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反转调整为该前缀。