【问题标题】:Deploy one django project with multiple app on multiple subdomains on AWS EC2在 AWS EC2 上的多个子域上部署一个具有多个应用程序的 django 项目
【发布时间】:2019-01-22 13:20:38
【问题描述】:

我有一个 django 项目,其中包含 2 个应用程序,即 adminapi。 管理应用依赖于api 应用来访问模型。

我有 2 个子域,例如:admin.xxxx.comapi.xxxx.com

该项目目前使用 gunicorn + nginx 部署在 AWS EC2 中。

更新

所有admin请求都通过some.ip.address.0:8000/admin/,所有api请求都通过some.ip.address.0:8000/

有什么方法可以将我的 some.ip.address.0:8000/admin/ 指向 admin.xxxx.comsome.ip .address.0:8000/api.xxxx.com

更新 2:

myproject_nginx.conf 文件:

upstream myproject_backend_server {
  # fail_timeout=0 means we always retry an upstream even if it failed
  # to return a good HTTP response (in case the Unicorn master nukes a
  # single worker for timing out).
  server unix:/home/ubuntu/myproject_backend/myproject_backend.sock fail_timeout=0;

}

server{
    listen 80;
    listen [::]:80;
    server_name admin.mydomain.in;

    location / {
      proxy_pass http://13.***.***.***:8000/admin/;
    }
    location /static/ {
       alias   /home/ubuntu/myproject_backend/static/;
     }

    location /media/ {
       alias   /home/ubuntu/myproject_backend/media/;
     }

 }


server {

    listen 80;

    server_name 13.***.***.***:8000  api.mydomain.in www.api.mydomain.in;

    client_max_body_size 4G;

    location /static/ {
        alias   /home/ubuntu/myproject_backend/static/;
    }

    location /media/ {
        alias   /home/ubuntu/myproject_backend/media/;
    }

    location / {

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header Host $http_host;

        proxy_redirect off;

        # Try to serve static files from nginx, no point in making an
        # *application* server like Unicorn/Rainbows! serve static files.
        if (!-f $request_filename) {
            proxy_pass http://myproject_backend_server;
            break;
        }
    }

}

我的项目 urls.py 文件:

from django.urls import path, re_path, include
from django.conf.urls.static import static
from django.conf import settings
from django.views.static import serve

urlpatterns = [
    re_path(r'^', include('api_app.urls')),
    ...
    path('admin/', include('admin_app.urls')),

    ...

    re_path(r'^static/(?P<path>.*)$', serve,
            {'document_root': settings.STATIC_ROOT}),
    re_path(r'^media/(?P<path>.*)$', serve,
            {'document_root': settings.MEDIA_ROOT}),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

它打开我的管理员登录页面,但我尝试登录它说:/admin/admin not found on this server.

请提出问题所在?

【问题讨论】:

标签: django amazon-web-services subdomain


【解决方案1】:

据我所知,当用户在浏览器中键入此地址 http://admin.mydomain.in 并且此管理页面由您的 django 应用程序处理时,您希望显示一个管理页面,因此您使用 nginx 代理到您所在的 http://13.***.***.***:8000/admin/可以访问管理页面。

但这里的问题是您的应用不知道如何做到这一点。所以它需要一个专门为此目的的中间人(在你的情况下是 Gunicorn )。此外,nginx 不能直接与您的 django 应用程序通信,因为它不打算提供动态内容。

所以要解决这个问题,你需要配置 gunicorn 让它监听地址 http://13.***.***.***:8000 到 nginx 转发请求的地方。然后在此地址上运行 gunicorn,参数为您的应用名称。您可以阅读serving a request from gunicorn 帖子的第二个答案来配置您的 gunicorn 文件。

【讨论】:

    【解决方案2】:

    是的,为了做到这一点,您必须将其中两个域指向托管您的 django 应用程序(或 ELB,如果您正在使用一个)的 EC2 实例并配置 Nginx,以便它将请求从一个域重定向到 admin 和从其他到api 路径。

    【讨论】:

    • 能否请您写一个重定向示例代码。我无法弄清楚重定向过程?我只有一个项目有 2 个应用程序。重定向将在哪里发生? (我的管理员现在指向some.ip.address.0:8000/admin 并且所有api 调用都是从some.ip.address.0:8000/ 触发的)
    • 请参考serverfault.com/questions/832456/… - 这是一个关于如何根据域进行重写/重定向的示例。
    • 感谢您的回答。我在上面尝试过,并在我的问题中添加了 nginx conf,请您参考并告诉我缺少什么?
    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2019-09-14
    相关资源
    最近更新 更多