代码之家  ›  专栏  ›  技术社区  ›  TechSavy

在AWS EC2的多个子域上使用多个应用程序部署一个Django项目

  •  3
  • TechSavy  · 技术社区  · 6 年前

    我有一个Django项目,包含2个应用程序,即, admin api . 管理应用程序依赖于 应用程序编程接口 应用程序访问模型。

    我有两个子域,比如: admin.xxxx.com api.xxxx.com .

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

    更新

    所有管理请求传递到: some.ip.address.0:8000/admin/ ,所有API请求都将通过 some.ip.address.0:8000/

    我能指出我的 一些.ip.address.0:8000/admin/ 管理员XXXX.com 一些.ip.地址.0:8000/ Ap.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;
            }
        }
    
    }
    

    myproject 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。

    请告诉我怎么了?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ahtisham    6 年前

    据我所知,当用户键入此地址时,您希望显示一个管理页面 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
  •  1
  •   pgrzesik    6 年前

    是的,为了做到这一点,您必须将两个域指向承载Django应用程序的EC2实例(如果使用的是ELB),并配置nginx,以便将请求从一个域重定向到 admin 从另一个到 api 路径。