2016-03-04 123 views
8

我已经通过以前的一些线程去服务Django的一个子目录: How do I set subdirectory in nginx with Django how to deploy django under a suburl behind nginx Serving flask app on subdirectory nginx + uwsginginx的通过uWSGI

的基本教训是,你应该只需要配置您的网站(可用)来实现这个。现在我已经试过

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; 
}} 

一切的各种排列运行完美,当我定义的位置是“/”(并删除SCRIPT_NAME,modifier1,PATH_INFO和根本无所谓。但是试图用一个子目录总是导致找不到网页(404):?

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

(编辑),它增加了目录的要求什么我不搞清楚

(试过forced_script_name - should't必须使用这个并给出其他头痛类型 - 和uwsgi配置设置)

编辑:

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

不工作...套接字是存在的,当我配置/工程 - 我看不出我错过了什么。

UPDATE:

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

+0

django 1.9.2,uwsgi 2.07-debian (在ubuntu 15.10服务器上运行) – Bjorn

回答

0

最终放弃了试图做到“整齐”。

最终的解决方案只是让一个设置变量,我前缀static_url和项目urls.py文件。没有SCRIPT_NAME或任何复杂的nginx端。

0

首先,去除uwsgi_modifier1 30;。 Django将自行处理SCRIPT_NAME,并且不需要由uWSGI重写PATH_INFO。如果没有被uWSGI从标题中删除,则它可能会有害。

其次,从nginx的配置中删除uwsgi_param PATH_INFO "$1";PATH_INFO在uwsgi_params文件中已定义的,它应该是$document_uri(因为它是在uwsgi_params),不$1如果你传递SCRIPT_NAME到Django的。

即调整后,Django的应该把SCRIPT_NAME作为URL前缀,将调整URL调度和URL扭转了这一点。

+1

最终结果为: location/project/{ root/path/to/project; include/etc/nginx/uwsgi_params; uwsgi_param SCRIPT_NAME/project; uwsgi_pass unix:/tmp/project.sock; } (重新启动nginx和uwsgi后) - 相同的结果=请求URL http://www.example.com/project/project 这是当我试图浏览http://www.example.com/project – Bjorn

+0

为什么它添加一个目录到那里请求? – Bjorn

0

如果应用程序是如此简单,那么我宁愿没有任何更多的这种简单的解决方案简单的“/前缀”可以被添加到一个线urls.py

否则“/前缀”必须在Django管理附加在为您的网站备案domain网站表。 domain应再“example.com/project”与第二方案,因为Django的必须知道域和前缀,特别是对正确的重定向。自然,前缀也必须从网络服务器的请求URL中去除,就像你现在在nginx设置中一样。

我通常这种部署的验证拆分到两个问题:

  • 会报告的Web服务器(nginx的)预期或长或短的网址Django的?
  • 是否知道Django的完整基准网址,并在所有网页中一致地使用它?

我同时使用nginx日志和Django日志记录来查看其中哪些最终被错误配置。 (您没有写出足够的重要信息。)

应该测试的一个重要情况是:即使您在注销后尝试使用这些URL,也需要验证是否需要进行身份验证的网页正确地重定向到登录页面。

更多详细资料可在similar question找到。

+0

现在的问题是如何指向不同的静态目录(在op中提到的更新之后) – Bjorn

+0

您的问题是网页包含对静态文件的无效引用或者nginx找不到正确的静态url?如果项目位于“/”,我希望你能正确提供静态文件。如果项目的动态页面位于“/ project”中,则静态文件不会更改。我知道你要求提供“/ project”前缀,因为你需要在同一个域上有更多的项目。没有明确表示您接受传统的“/ static/appname /”,例如“/静态/管理”没有“/项目”在任何地方的网址。我认为是因为你还没有指定任何东西。 – hynekcer

+0

我得到它的工作,以便我找到静态文件就好,/项目/正确响应 - 但由于某种原因项目/应用程序不给我任何东西,nginx将控制权传递给一些默认项目/app/index.html处理程序 - 不是我的django应用程序:/ – Bjorn

3

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 

Hosting multiple apps in the same process (aka managing SCRIPT_NAME and PATH_INFO)

mount可以采取的module

的地方有关的Django具体,

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

最后!经过多次搜索,我发现你的解决方案合适。谢谢! – clapas

+1

很高兴有帮助。让uWSGI正确运行是我做过的最困难的事情之一;-) – shanemgrey