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

Joh*_*ang 23 deployment django nginx subdirectory

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

... ...
server_name my.server.com;
location /myapp {
    rewrite /myapp(.*) $1 break;        
    ... ... # proxy param 
    proxy_pass http://localhost:12345;
}
... ...
Run Code Online (Sandbox Code Playgroud)

问题是,当如上配置时,如何使我的响应页面中的URL具有前缀"/ myapp",以便nginx可以正确地将它们引导到myapp.例如,像"/ foo/far"这样的页面中的url应该更改为"/ myapp/foo/bar"以允许nginx代理到myapp.什么是正确的nginx配置用来实现这一目标?

我可以使用django的设置变量来指定根URL前缀,但它不能灵活,因为变量必须根据不同的nginx配置进行修改(比如有一天nginx可能会将郊区从"/ myapp"更改为"/anotherapp").

pis*_*che 15

由于前缀是在Nginx中设置的,托管Django应用程序的Web服务器无法知道URL前缀.正如orzel所说,如果你使用甚至nginx + gunicorn/uwsgi的apache + mod_wsgi(带有一些额外的配置),你可以使用Django自动读取的WSGIScriptAlias值.

当我需要使用URL前缀时,我通常将它自己放在我的root urls.py中,其中我只有一行,前缀为前缀并包含其他urls.py

(r'^/myapp/', include('myapp.urls')),
Run Code Online (Sandbox Code Playgroud)

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

您需要在承载Django应用程序的服务器上执行以下操作:12345.您可以在那里设置前缀,并使用WSGIScriptAlias或其等效的外部mod_wsgi将其传递给Django.我不能提供更多信息,因为我不知道你的Django应用程序是如何运行的.另外,也许你应该考虑使用uWSGI或gunicorn直接从Django运行你的Django应用程序.

要从Web服务器将前缀传递给Django,您可以使用:

proxy_set_header SCRIPT_NAME /myapp;
Run Code Online (Sandbox Code Playgroud)

更多信息在这里

  • 感谢GOODNESS的这篇文章."proxy_set_header"技巧让我免于谷歌搜索的噩梦.我应该知道的更好.格拉西亚斯. (2认同)

yuw*_*ang 10

您需要更新您的设置:

USE_X_FORWARDED_HOST = True
FORCE_SCRIPT_NAME = /myapp
Run Code Online (Sandbox Code Playgroud)

并更新MEDIA_URLSTATIC_URL相应.

我没有在nginx下部署的经验,但在apache下,它运行正常.参考:https://docs.djangoproject.com/en/dev/ref/settings/#use-x-forwarded-host