首先,我想告诉读者我在NodeJS,Angular和Express方面还很新。
我已经部分完成了一个项目,需要在其中使用服务器端逻辑(ExpressJS)在AngularJS中创建网站。
但是在开发时,我意识到托管或部署MEAN堆栈并不像LAMP堆栈那么简单。 因此,我要求解决以下问题,
我想托管一个用Angular开发的网站,其端点在ExpressJS中,而数据库在MySQL中。
我试图找到解决方案。但是他们没有一个在我面前描绘出清晰的画面。 不幸的是,由于预算限制,我拥有的服务器是免费的,并且它很简单Ubuntu 18.04 System。 这是我尝试理解的link,但出于天蓝色。
此one更有帮助,但再次引发了许多问题。
由于我是这项技术的新手,如果有人能帮助我在同一台服务器上一起完成Angular和Express的部署过程,我将不胜感激。
答案 0 :(得分:3)
我会选择Docker。一个运行节点映像的容器,另一个运行mysql映像的容器。节点容器将运行您的angular and express应用程序。同样,使用Docker,您在开发环境和生产环境之间也不会有任何区别。
您是否已安装Docker?您正在使用哪个操作系统?
从Docker Hub下载节点映像:
docker pull node
然后我将创建一个Dockerfile,以在复制所有源代码的同时从节点映像生成映像。
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将设置在容器内执行命令的上下文,以便您可以在package.json所在的位置运行npm install。 RUN将下载容器内的所有应用程序依赖项。 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": { ... }
.dockerignore文件(因此,请勿在容器内复制节点模块,Dockerfile等):
node_modules
npm-debug.log
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
要基于上述Dockerfile创建映像(您需要将Dockerfile放置并在应用程序容器的同一文件夹中运行docker build):
docker build -t image_name .
要在Docker容器中运行映像,请执行以下操作:
docker run -d -p 3000:3000 image_name
像这样运行容器,您可以使用DOCKER_HOST_IP:PORT在浏览器中打开您的应用程序,它将运行您的应用程序。
假设您在PORT 3000中运行您的应用程序,我们会将外部3000端口映射到运行您的应用程序的容器内部的内部端口3000。
表达
为了使express服务您的文件,您需要设置express.static:
// serve client side code.
app.use('/', express.static('app_folder'));
答案 1 :(得分:0)
您可以在EC2实例上git clone您的应用,然后安装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
您还可以在快速终点之前充分利用haproxy。