【问题标题】:how to deploy django under a suburl behind nginx如何在 nginx 后面的子 URL 下部署 django
【发布时间】:2011-12-29 07:17:09
【问题描述】:

我有一个在 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;
}
... ...

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

我可以使用 django 的设置变量来指定根 url 前缀,但我认为它不灵活,因为变量必须根据不同的 nginx 配置进行修改(比如有一天 nginx 可能会从“/myapp”更改子 URL " 到 "/另一个应用")。

【问题讨论】:

    标签: django deployment nginx subdirectory


    【解决方案1】:

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

    当我需要使用 URL 前缀时,我一般将它自己放在我的根 urls.py 中,其中我只有一行,以前缀为前缀并包含另一个 urls.py

    (r'^/myapp/', include('myapp.urls')),
    

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

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

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

    proxy_set_header SCRIPT_NAME /myapp;
    

    更多信息here

    【讨论】:

    • 谢谢,听起来我必须使用 WSGIScriptAlias 技巧
    • 感谢 GOODNESS 的这篇文章。 “proxy_set_header”技巧让我摆脱了谷歌搜索的噩梦。我应该知道的更好。格拉西亚斯。
    • 不幸的是,这不适用于静态文件,请参阅code.djangoproject.com/ticket/25598
    【解决方案2】:

    您需要更新您的设置:

    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

    【讨论】:

      【解决方案3】:

      这是我的 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;
              }
          }
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2011-03-24
        • 1970-01-01
        • 2013-07-04
        • 2016-07-09
        • 2022-06-30
        • 2018-01-18
        • 1970-01-01
        • 2019-08-14
        • 2019-02-01
        相关资源
        最近更新 更多