【问题标题】:Host an Angular App, ExpressJS endpoint on a AWS EC2 server在 AWS EC2 服务器上托管 Angular App、ExpressJS 端点
【发布时间】:2019-05-28 13:35:31
【问题描述】:

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

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

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

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

我试图找到解决方案。但他们都没有在我面前描绘出清晰的画面。 可悲的是,由于预算限制,我拥有的服务器是免费套餐,而且它很简单Ubuntu 18.04 System。 这是我试图理解但适用于天蓝色的link

这个one 有点帮助,但它再次提出了很多问题。

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

【问题讨论】:

    标签: angularjs node.js amazon-web-services express web-deployment


    【解决方案1】:

    我会选择 Docker。一个容器运行节点映像,另一个容器运行 mysql 映像。节点容器将运行您的 Angular 和 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'));
    

    【讨论】:

    • 我使用 Ubuntu 16.04MacOS 10.14.2 作为我的开发环境。我的网络服务器是 Amazon EC2 AMI Linux 2。非常感谢您提供这个详细的解决方案。我现在正在尝试。会告诉你结果
    • 好消息,Siddhant!如果您有任何疑问,请告诉我!
    • 嗨,我接受了你的建议并继续前进。我还没有弄清楚整个过程,但我制作了一个演示应用程序并将我的服务器放在了我的服务器上,它工作了!我正在写下整个过程,并将其放在这里。再次感谢您的帮助。
    【解决方案2】:

    您可以在 EC2 实例上 git 克隆您的应用,然后安装 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

    【讨论】:

    • 感谢您抽出宝贵时间,但您的解决方案并未说明我如何同时管理 2 个不同的 NodeJS 应用程序。你能解释一下吗?可能是我错过了什么。
    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2020-08-09
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多