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

时间:2019-08-21 19:49:20

标签: django angular8

大多数教程都说您必须将angular集成到django中,但我不想这样做。 我想使用node-express和django使用gunicorn将它们部署在同一台服务器上。 但是我不知道该怎么做。我知道如何仅在单独的服务器上部署angular ssr和django,但不能同时部署。 预先感谢

1 个答案:

答案 0 :(得分:3)

我将回答您有关如何处理您的问题的问题,但我也会向您指出一个我认为是更有效,稳定和更快的方法的方向。

TLDR :转到注释

下的底部
  

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

我不太确定这些教程为何或在何处表明您需要集成 与Django形成角度,因为它们不是可以集成的东西,而是它们可以一起工作。前端应用程序(在本例中为Angular)通常会向后端(在本例中为DRF)发出请求,它们不作为单个代码库一起存在。

  

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

在开始之前,我应该说我在维护生产服务方面具有丰富的行业经验。尽管您希望部署在同一台服务器上,但我建议您这样做,因为通常情况下,每个服务通常都位于负载平衡器之后,因为运行后端代码与交付前端包相比,资源的负担要大得多。

现在,您既可以在同一台服务器上也可以在不同的服务器上使用Angular和DRF,但实际上归结为在服务器上拥有NGINX之类的东西,它可以为客户提供您创建的Angular捆绑包,或来自DRF后端的数据,以及Nginx中的两个配置文件。

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

# 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;
    }
}

以下内容可用于允许来自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;
    }
}

部署

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

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

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

现在,每当更新代码时,您都不会与已经在生产中的服务器搞混,因此您将需要启动新服务器,再次安装所有要求,等等。 ,这是很多工作。

在服务器上运行服务...使用DOCKER:D

我无法表达足够的码头工人的魅力和实用性!。如果您没有使用过它,则基本上可以使您的代码在运行于Mac,Windows或Linux上的容器中运行。在几乎所有方面,容器都可以像没有容器时运行容器一样快。

现在这很好,您可以执行与上面完全相同的操作,但是将DRF代码容器化,将Angular代码容器化,然后对NGINX代理容器化,然后让NGINX容器将请求路由到不同的容器或服务器,例如为:

    location / {
        proxy_pass http://drf-container:8000;

现在,这意味着您现在可以在开发,登台和生产中运行相同的代码,并且知道结果将是相同的,并且在部署时不会有任何意外的惊喜。

在具有docker的集群上运行服务(最受欢迎)

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

AWS允许您启动服务器集群,然后可以将docker映像上载到其存储库。完成后,您可以启动具有预先分配的资源限制的Docker容器实例,然后AWS我们将它们自动部署到集群中。这样做非常好,因为AWS还允许以无缝方式更新正在运行的容器,并且如果新容器运行状况良好,AWS将自动清空旧容器与新容器之间的连接,然后删除旧容器。这意味着非常快速,安全和高效的部署。

Digitalocean现在提供了类似的功能,2019年其Kubernetes功能从beta变为完全受支持。 Kubernetes的功能与我上面描述的AWS完全相同,只是多了一些手动设置。

摘要

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

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

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

注释

近来,随着无服务器的发展,我喜欢的个人设置是我的后端微服务(某些在python中,有些在使用中)提供graphql api,并且位于上述集群上。 Apollo联合可以在无服务器或服务器上运行,并将所有微服务graphql api组合成一个统一的统一API。然后我的前端客户端就可以只查询一个网址。无需Nginx,非常可扩展的无服务器graphql api和集群上非常可扩展的docker实例,并且由于它使用的是docker,因此非常易于开发。