如何在同一台服务器(heroku 或 digitalocean)上分别部署 angular 8 ssr 和 django rest 框架)

use*_*967 2 django angular8

大多数教程都说您必须将 angular 集成到 django 中,但我不想这样做。我想使用 node-express 和 django 使用 gunicorn 将两者部署在具有角度的同一台服务器上。但我不知道该怎么做。我知道如何仅在同一台服务器上部署 angular ssr 和 django,但不能同时部署两者。提前致谢

jup*_*iar 5

我将回答你关于如何做你所问的问题,但我也会为你指出一个我认为更有效、更稳定和更快的方法的方向。

TLDR:转到注释下的底部

大多数教程都说你必须将angular集成到django中

我不太确定这些教程为什么或在哪里说您需要将 Angular 集成到 Django 中,因为它们不是可以集成的东西,但它们可以协同工作。前端应用程序(在本例中为 Angular)通常会向后端(在本例中为 DRF)发出请求,它们不作为单个代码库一起存在。

我想将两者部署在同一台服务器上

在开始之前,我应该说我在维护生产服务方面有很多行业经验。尽管您希望部署在同一台服务器上,但我建议您不要这样做,因为您通常会将每个服务置于负载均衡器之后,因为运行后端代码与交付前端包相比,资源压力要高得多。

现在,您可以在同一台服务器上或不同的服务器上安装 Angular 和 DRF,但本质上归结为在服务器上安装NGINX 之类的东西,它可以向客户端提供您创建的 Angular 包,或来自 DRF 后端的数据,在Nginx中有两个配置文件。

如果客户端连接到example.com,以下配置将返回位于 中的 Angular 包(特别是包的 index.html)/var/www/example

# example.com.conf
server {
    root /var/www/example;
    index index.html;

    server_name example.com;
    location / {
        try_files $uri $uri/ = 404;
    }

    listen 443 ssl;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    include /path/to/options-ssl-nginx.conf;
}

server {
    listen       80;
    listen [::]:80;
    server_name  example.com;

    include /path/to/encrypt.conf;

    location / {
        return 301 https://example.com$request_uri;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下内容可用于允许来自 Angular 应用程序的请求通过向 发出请求从后端获取数据api.example.com

# api.example.com.conf
server {
    server_name api.example.com;

    listen 443 ssl;
    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;
    include /path/to/options-ssl-nginx.conf;

    location / {
        proxy_pass http://0.0.0.0:8000;
        proxy_set_header Host $myhost;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect off;
    }
}

server {
    listen       80;
    listen [::]:80;
    server_name  api.example.com;

    include /path/to/encrypt.conf;

    location / {
        return 301 https://api.example/com$request_uri;
    }
}
Run Code Online (Sandbox Code Playgroud)

部署

有几种方法可以做到这一点:

您在服务器上运行服务...没有 DOCKER :'(

这是更传统的,但本质上归结为在一个或多个服务器上安装 Node、Python 等的依赖项,这很可能与开发/登台环境不同。我的意思是,如果你在 Macbook 上开发了所有代码,然后在 Linux 服务器上运行代码,很可能你安装包的方式不同,并不是所有的包都可以在所有操作系统上运行系统,导致您编写的代码突然中断。

现在,每当您更新代码时,您都不想弄乱已经在生产中的服务器,因此您需要启动一个新服务器,再次安装所有要求,等等......,这是很多工作。

在服务器上运行服务... WITH DOCKER :D

我无法表达docker 是多么的神奇和有用!!. 如果你还没有使用过它,它基本上允许你在容器中运行你的代码,无论你是在 Mac、Windows 还是 Linux 上运行都一样。容器几乎在所有方面都与在没有容器的情况下运行它们一样快。

现在这很好,你可以和上面完全一样,但是容器化 DRF 代码,容器化 Angular 代码,然后容器化一个 NGINX 代理,然后让 NGINX 容器将请求路由到不同的容器或服务器,例如:

    location / {
        proxy_pass http://drf-container:8000;
Run Code Online (Sandbox Code Playgroud)

现在这意味着,您现在可以在开发、暂存和生产中运行相同的代码,知道结果将是相同的,部署时没有隐藏的惊喜。

使用 docker(最流行)在集群上运行服务

我在 AWS 和 Digitalocean 上都维护过服务器。

AWS 允许您启动服务器集群,然后您可以将 docker 图像上传到他们的存储库。完成后,您就可以启动具有预先分配资源限制的 docker 容器实例,然后 AWS 我们会自动将它们部署到集群中。这很棒,因为 AWS 还允许以无缝方式更新正在运行的容器,如果新容器运行状况良好,AWS 会自动将连接从旧容器排空到新容器,然后删除旧容器。这意味着极其快速、安全和高效的部署。

Digitalocean 现在提供了类似的功能,2019 年他们的 Kubernetes 功能从测试版变为完全支持。Kubernetes 可以做的和我在上面描述的 AWS 做的完全一样,只是多一点手动设置。

概括

我希望以上内容有助于清理 Django 和 Angular 的部署。本质上,以最简单的方式归结为以下 docker 容器;

  1. Angular 容器(包含开发 Angular 应用程序的依赖项)
  2. Django 容器(包含依赖项和 Django 代码库)
  3. Nginx 容器(包含来自 Angular 容器的生产包,以及一个.conf包含代理传递到 Django 容器的配置的文件。)

然后将这些容器部署到服务器或集群

笔记

随着这些天无服务器变得越来越大,我喜欢的个人设置是我的后端微服务(一些在 python 中,一些在 go 中)提供 graphql api,并且位于上述集群上。Apollo federation 可以无服务器运行或在服务器中运行,并将所有微服务 graphql api 组合成一个统一的。然后我的前端客户端可以只查询一个 url。不需要 Nginx,非常可扩展的 serverless graphql api,以及集群上非常可扩展的 docker 实例,并且因为它使用 docker,所以开发起来非常容易。