【问题标题】:How to mediate Django-Tastypie URI with Nginx routing如何使用 Nginx 路由调解 Django-Tastypie URI
【发布时间】:2013-09-15 04:11:15
【问题描述】:

具体来说,我认为我需要 Nginx 不消耗(捕获?)我用来路由位置的 URI 的一部分。但我不知道这样的事情是否可能。


让我备份。我正在转换我的应用程序的设置。之前,我有一个 Nginx 配置文件,其中包含一个匹配所有内容的位置块:

server {
    listen   80;
    server_name ec2-54-234-175-21.compute-1.amazonaws.com;

    location / {
        ...
        proxy_pass http://localhost:8000/;
    }

通过这个设置,到目前为止,我一直在运行一个 Django 应用程序。在 Nginx 将用户路由到唯一的端点后,Django 使用整个 URI。这意味着在内部,Django 砍掉了/api/,然后只剩下1.0,它也需要它。

现在,我将使用 Nginx 代理多个服务器,每个服务器都托管一个应用程序。由于前面提到的内部路由,Django 应用程序需要(至少)接收/1.0 的 URI,而另一个(在 Flask 上)需要获取/api/2.0。但是,为了让 Nginx 位置指令有意义,我必须区分这两个应用程序。我的工作是,我将只有以下两个位置指令:

server {
    listen   80;
    server_name ec2-54-234-175-21.compute-1.amazonaws.com;

    location /api/[1.0] {
        ...
        proxy_pass http://localhost:8000/;
    }

    location / {
        ...
        proxy_pass http://localhost:8080/;
    }

但是,请注意括号中的 [1.0]。如果存在,我意识到为了实际访问预期的资源,我必须输入 /api/1.0/1.0 的 URI。所以,不知何故,我需要在我的 nginx conf 中有一个非消耗位置。如果我知道如何用更简单的术语来表达这一点,我会的。我想要的可能吗?

【问题讨论】:

  • 简单的答案,使用 gunicorn。问题解决了。
  • 我目前使用 Nginx 作为 Gunicorn 的代理服务器。你能说得更具体点吗?
  • 我以为我在切换哪个应用程序位于“/”位置时找到了答案。但是症状(需要加倍 URI,例如/api/1.0/api/1.0 来访问资源)只是出现在 2.0 版本中。
  • 同时,我在应用程序上看到另一个错误,即“502 Bad Gateway”错误,不在位置“/”下。我想知道这两者是否相关。

标签: django nginx routing uri tastypie


【解决方案1】:

问了这个问题大约一周后,一位同事指出了我想要的答案,而且很简单。关键在于 Nginx 为您提供路由的延展性。因为我想访问位于 /api/1.0 的资源,但仍需要在我的配置中区分这两个应用程序,所以我执行以下操作:

服务器{

listen   80;
server_name ec2-54-234-175-21.compute-1.amazonaws.com;

location /api/1.0 {
    ...
    proxy_pass http://localhost:8000/api/1.0;
}
location /api/2.0 {
    ...
    proxy_pass http://localhost:8080/api/2.0;
}

正如我在上面所写的那样,这实际上使 URL “非消耗”,因为我使用所需的资源 URL 进行路由,然后在引用特定应用程序中的实际位置时复制它。

也许这对其他人有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多