大多数教程都说您必须将 angular 集成到 django 中,但我不想这样做。我想使用 node-express 和 django 使用 gunicorn 将两者部署在具有角度的同一台服务器上。但我不知道该怎么做。我知道如何仅在同一台服务器上部署 angular ssr 和 django,但不能同时部署两者。提前致谢
我将回答你关于如何做你所问的问题,但我也会为你指出一个我认为更有效、更稳定和更快的方法的方向。
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)
有几种方法可以做到这一点:
这是更传统的,但本质上归结为在一个或多个服务器上安装 Node、Python 等的依赖项,这很可能与开发/登台环境不同。我的意思是,如果你在 Macbook 上开发了所有代码,然后在 Linux 服务器上运行代码,很可能你安装包的方式不同,并不是所有的包都可以在所有操作系统上运行系统,导致您编写的代码突然中断。
现在,每当您更新代码时,您都不想弄乱已经在生产中的服务器,因此您需要启动一个新服务器,再次安装所有要求,等等......,这是很多工作。
我无法表达docker 是多么的神奇和有用!!. 如果你还没有使用过它,它基本上允许你在容器中运行你的代码,无论你是在 Mac、Windows 还是 Linux 上运行都一样。容器几乎在所有方面都与在没有容器的情况下运行它们一样快。
现在这很好,你可以和上面完全一样,但是容器化 DRF 代码,容器化 Angular 代码,然后容器化一个 NGINX 代理,然后让 NGINX 容器将请求路由到不同的容器或服务器,例如:
location / {
proxy_pass http://drf-container:8000;
Run Code Online (Sandbox Code Playgroud)
现在这意味着,您现在可以在开发、暂存和生产中运行相同的代码,知道结果将是相同的,部署时没有隐藏的惊喜。
我在 AWS 和 Digitalocean 上都维护过服务器。
AWS 允许您启动服务器集群,然后您可以将 docker 图像上传到他们的存储库。完成后,您就可以启动具有预先分配资源限制的 docker 容器实例,然后 AWS 我们会自动将它们部署到集群中。这很棒,因为 AWS 还允许以无缝方式更新正在运行的容器,如果新容器运行状况良好,AWS 会自动将连接从旧容器排空到新容器,然后删除旧容器。这意味着极其快速、安全和高效的部署。
Digitalocean 现在提供了类似的功能,2019 年他们的 Kubernetes 功能从测试版变为完全支持。Kubernetes 可以做的和我在上面描述的 AWS 做的完全一样,只是多一点手动设置。
我希望以上内容有助于清理 Django 和 Angular 的部署。本质上,以最简单的方式归结为以下 docker 容器;
.conf包含代理传递到 Django 容器的配置的文件。)然后将这些容器部署到服务器或集群
笔记
随着这些天无服务器变得越来越大,我喜欢的个人设置是我的后端微服务(一些在 python 中,一些在 go 中)提供 graphql api,并且位于上述集群上。Apollo federation 可以无服务器运行或在服务器中运行,并将所有微服务 graphql api 组合成一个统一的。然后我的前端客户端可以只查询一个 url。不需要 Nginx,非常可扩展的 serverless graphql api,以及集群上非常可扩展的 docker 实例,并且因为它使用 docker,所以开发起来非常容易。
| 归档时间: |
|
| 查看次数: |
1463 次 |
| 最近记录: |