大多数教程都说您必须将angular集成到django中,但我不想这样做。 我想使用node-express和django使用gunicorn将它们部署在同一台服务器上。 但是我不知道该怎么做。我知道如何仅在单独的服务器上部署angular ssr和django,但不能同时部署。 预先感谢
答案 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服务器上运行了代码,则很有可能安装软件包的方式有所不同,并非所有软件包都可以在所有操作系统上正常工作。系统,导致您编写的代码突然中断。
现在,每当更新代码时,您都不会与已经在生产中的服务器搞混,因此您将需要启动新服务器,再次安装所有要求,等等。 ,这是很多工作。
我无法表达足够的码头工人的魅力和实用性!。如果您没有使用过它,则基本上可以使您的代码在运行于Mac,Windows或Linux上的容器中运行。在几乎所有方面,容器都可以像没有容器时运行容器一样快。
现在这很好,您可以执行与上面完全相同的操作,但是将DRF代码容器化,将Angular代码容器化,然后对NGINX代理容器化,然后让NGINX容器将请求路由到不同的容器或服务器,例如为:
location / {
proxy_pass http://drf-container:8000;
现在,这意味着您现在可以在开发,登台和生产中运行相同的代码,并且知道结果将是相同的,并且在部署时不会有任何意外的惊喜。
我在AWS和Digitalocean上都维护过服务器。
AWS允许您启动服务器集群,然后可以将docker映像上载到其存储库。完成后,您可以启动具有预先分配的资源限制的Docker容器实例,然后AWS我们将它们自动部署到集群中。这样做非常好,因为AWS还允许以无缝方式更新正在运行的容器,并且如果新容器运行状况良好,AWS将自动清空旧容器与新容器之间的连接,然后删除旧容器。这意味着非常快速,安全和高效的部署。
Digitalocean现在提供了类似的功能,2019年其Kubernetes功能从beta变为完全受支持。 Kubernetes的功能与我上面描述的AWS完全相同,只是多了一些手动设置。
我希望以上内容有助于清理Django和Angular的部署。本质上,以最简单的方式归结为拥有以下docker容器;
.conf
文件,该文件包含用于代理传递给Django容器的配置。)然后将这些容器部署到服务器或群集
注释
近来,随着无服务器的发展,我喜欢的个人设置是我的后端微服务(某些在python中,有些在使用中)提供graphql api,并且位于上述集群上。 Apollo联合可以在无服务器或服务器上运行,并将所有微服务graphql api组合成一个统一的统一API。然后我的前端客户端就可以只查询一个网址。无需Nginx,非常可扩展的无服务器graphql api和集群上非常可扩展的docker实例,并且由于它使用的是docker,因此非常易于开发。