首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在nginx后面的郊区部署django

如何在nginx后面的郊区部署django
EN

Stack Overflow用户
提问于 2011-11-15 15:48:41
回答 3查看 13.2K关注 0票数 28

我有一个运行在http://localhost:12345上的django应用程序。我想让用户通过url http://my.server.com/myapp访问它。我使用nginx来反向代理它,如下所示:

代码语言:javascript
复制
... ...
server_name my.server.com;
location /myapp {
    rewrite /myapp(.*) $1 break;        
    ... ... # proxy param 
    proxy_pass http://localhost:12345;
}
... ...

问题是,当像上面这样配置时,如何使我响应页面中的urls具有前缀"/myapp“,以便nginx可以正确地将它们定向到myapp。例如,像“/foo/bar”这样的页面中的urls应该改为"/ myapp /foo/bar“,以允许nginx代理到myapp。要实现这一点,正确的nginx配置是什么?

我可以使用django的设置变量来指定根url前缀,但我认为这并不灵活,因为这个变量必须根据不同的nginx配置进行修改(比方说有一天nginx可能会将郊区从"/myapp“更改为"/anotherapp")。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-21 02:05:43

因为前缀是在Nginx中设置的,所以托管Django应用程序的web服务器无法知道URL前缀。正如orzel所说,如果您使用的是偶数nginx+gunicorn/uwsgi的apache+mod_wsgi (带有一些额外的配置),那么您可以使用Django自动读取的WSGIScriptAlias值。

当我需要使用urls.py前缀时,我通常会自己把它放在根URL中,在根URL中我只有一行,以前缀为前缀,并包括另一个URL

代码语言:javascript
复制
(r'^/myapp/', include('myapp.urls')),

但我猜这与在settings.py中设置前缀有相同的瓶颈,在nginx和Django中有冗余的配置。

您需要在托管Django应用程序的服务器中执行一些操作,时间为:12345。您可以在那里设置前缀,然后在mod_wsgi外部使用WSGIScriptAlias或其等效对象将其传递给Django。我不能提供更多信息,因为我不知道您的Django应用程序是如何运行的。此外,也许你应该考虑直接从Django运行你的Django应用程序,使用uWSGI或gunicorn。

要将前缀从the服务器传递给Django,您可以使用以下命令:

代码语言:javascript
复制
proxy_set_header SCRIPT_NAME /myapp;

更多信息here

票数 19
EN

Stack Overflow用户

发布于 2012-10-29 11:32:49

您需要更新您的设置:

代码语言:javascript
复制
USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = /myapp

并相应地更新您的MEDIA_URLSTATIC_URL

我没有在nginx下部署的经验,但在apache下,它工作得很好。请参阅:https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host

票数 15
EN

Stack Overflow用户

发布于 2013-01-10 05:27:26

这是我的nginx配置的一部分,诚然,它没有设置FORCE_SCRIPT_NAME,但是我没有使用子目录。也许在nginx而不是Django中设置与USE_X_FORWARDED_HOST相关的选项会很有用。

代码语言:javascript
复制
upstream app_server_djangoapp {
    server localhost:8001 fail_timeout=0;
}

server  {
    listen xxx.xxx.xx.xx:80;
    server_name mydomain.com www.mydomain.com;
    if ($host = mydomain.com) {
        rewrite ^/(.*)$ http://www.mydomain.com/$1 permanent;
    }
    ...
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        if (!-f $request_filename) {
            proxy_pass http://app_server_djangoapp;
            break;
        }
    }
    ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8133063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档