我有一个运行在http://localhost:12345上的django应用程序。我想让用户通过url http://my.server.com/myapp访问它。我使用nginx来反向代理它,如下所示:
... ...
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")。
发布于 2012-10-21 02:05:43
因为前缀是在Nginx中设置的,所以托管Django应用程序的web服务器无法知道URL前缀。正如orzel所说,如果您使用的是偶数nginx+gunicorn/uwsgi的apache+mod_wsgi (带有一些额外的配置),那么您可以使用Django自动读取的WSGIScriptAlias值。
当我需要使用urls.py前缀时,我通常会自己把它放在根URL中,在根URL中我只有一行,以前缀为前缀,并包括另一个URL
(r'^/myapp/', include('myapp.urls')),
但我猜这与在settings.py中设置前缀有相同的瓶颈,在nginx和Django中有冗余的配置。
您需要在托管Django应用程序的服务器中执行一些操作,时间为:12345。您可以在那里设置前缀,然后在mod_wsgi外部使用WSGIScriptAlias或其等效对象将其传递给Django。我不能提供更多信息,因为我不知道您的Django应用程序是如何运行的。此外,也许你应该考虑直接从Django运行你的Django应用程序,使用uWSGI或gunicorn。
要将前缀从the服务器传递给Django,您可以使用以下命令:
proxy_set_header SCRIPT_NAME /myapp;
更多信息here
发布于 2012-10-29 11:32:49
您需要更新您的设置:
USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = /myapp
并相应地更新您的MEDIA_URL
和STATIC_URL
。
我没有在nginx下部署的经验,但在apache下,它工作得很好。请参阅:https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host
发布于 2013-01-10 05:27:26
这是我的nginx配置的一部分,诚然,它没有设置FORCE_SCRIPT_NAME,但是我没有使用子目录。也许在nginx而不是Django中设置与USE_X_FORWARDED_HOST相关的选项会很有用。
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;
}
}
...
}
https://stackoverflow.com/questions/8133063
复制相似问题