在 AWS EC2 服务器上托管一个 Angular 应用程序、ExpressJS 端点

Host an Angular App, ExpressJS endpoint on a AWS EC2 server

首先,我要告诉读者我是 NodeJS、Angular 和 Express 的新手。

我已经部分完成了一个项目,我需要用 AngularJS 和服务器端逻辑 (ExpressJS) 创建一个网站。

但在开发过程中,我意识到托管或部署 MEAN 堆栈并不像 LAMP 堆栈那样简单。 所以我请求解决以下问题,

我想托管一个在 Angular 中开发的网站,端点在 ExpressJS 中,数据库在 MySQL 中。

我试图找到解决这个问题的方法。但是 none 他们在我面前描绘了一幅清晰的画面。 遗憾的是,由于预算限制,我拥有的服务器是免费层,而且它非常简单 Ubuntu 18.04 System。 这是一个 link,我试图理解,但它是天蓝色的。

这个 one 更有帮助,但也提出了很多问题。

由于我是这项技术的新手,如果有人能帮助我在同一台服务器上完成 Angular 和 Express 的部署过程,我将不胜感激。

我会选择 Docker。一个容器 运行ning 一个节点图像,另一个容器 运行ning mysql 图像。节点容器将 运行 您的 angular 和 express 应用程序。同样使用 Docker,您的开发环境和生产环境之间没有区别。

你有安装Docker吗?您正在使用哪个 OS?

从 Docker 集线器下载节点图像:

docker pull node

然后我会创建一个 Docker 文件来从节点图像生成图像,同时复制它上面的所有源代码。

FROM node:latest
LABEL author="Your Name" 
ENV NODE_ENV=production PORT=3000
COPY . /app
WORKDIR  /app
RUN npm install 
EXPOSE $PORT
ENTRYPOINT ["npm", "start"]

COPY命令会把你当前目录(.)的源代码拷贝到容器内的app目录下。 WORKDIR 将设置您的命令将在容器内执行的上下文,因此您可以 运行 npm install 在 package.json 所在的位置。 运行 将下载容器内的所有应用程序依赖项。 ENTRYPOINT 将按照 package.json 文件中指定的方式执行启动应用程序的文件,如下所示:

"name": "app",
"version": "1.0.0",
"scripts": {
   "test": "echo \"Error: no test specified\" && exit 1",
   "start": "node index.js"
},
"license": "ISC",
"dependencies": { ... }

.docker忽略文件(这样你就不会在你的容器中复制你的节点模块,Docker文件等):

node_modules
npm-debug.log
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode

要根据上面的Docker文件创建镜像(你需要将Docker文件和运行dockerbuild放在你的app容器的同一个文件夹中):

docker build -t image_name .

到 运行 您在 Docker 容器中的图像:

docker run -d -p 3000:3000 image_name

运行 这样的容器您可以使用 DOCKER_HOST_IP:PORT 在浏览器中打开您的应用程序,它将 运行 您的应用程序。

假设您运行在 PORT 3000 中连接您的应用程序,我们正在将外部 3000 端口映射到您的应用程序所在的容器内的内部端口 3000。运行ning。

快递

为了让 Express 为您的文件提供服务,您需要设置 express.static:

// serve client side code.
app.use('/', express.static('app_folder'));

您可以 git 在 EC2 实例上克隆您的应用程序,然后安装 systemd service,这是一个服务文件示例:

[Unit]
Description=My App
After=syslog.target network.target

[Service]
Environment=NODE_ENV=production
ExecStart=/usr/bin/node /home/appuser/repo-app/index.js
WorkingDirectory=/home/appuser/repo-app/
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
User=appuser
Group=appuser

[Install]
WantedBy=multi-user.target

您还可以在 express 端点前充分利用 haproxy