使用Docker尝试了基于Node.js设计模式的nginx负载均衡的备忘录

总结

《Node.js 设计模式 第2版》

    • 10章 スケーラビリティとアーキテクチャ

10.2 クローニングと負荷分散

由於使用了 Docker 來測試上面提供的程式碼,遇到了一些小問題,因此寫下了這個筆記。

环境

    • Windows 10

 

    • Vagrant 2.2.5

 

    • virtualbox 6.0.8

 

    • Ubuntu 18.04 LTS (Bionic Beaver)

 

    • Docker version 18.09.5, build e8ff056

 

    docker-compose version 1.24.0, build 0aa59064

构成

- app
  - app.js
- docker
  - docker-compose.yml
  - nodejs
    - Dockerfile
  - nginx
    - Dockerfile
    - default.conf
    - upstream.conf

在这个例题的Github页面中,只有以下内容,且显得相当冗长。

- app.js
- nginx.patch.conf

醬汁

version: '3'
services:
  nodejs:
    build: ./nodejs
    volumes:
      - ../app:/app/app
    command: [npm,run,run]
  nginx:
    build: ./nginx
    ports:
      - 80:80

在创建node.js容器时,进行所需模块的安装。
然后,在package.json中将要执行的命令注册到脚本中。


FROM node:12.5.0
WORKDIR /app
RUN npm init -y
RUN yarn add forever
RUN sed -i -e "s/\(\"scripts\": {\)/\1\n    \"run\": \"forever start app\/app.js 8081 \&\& forever start app\/app.js 8082 \&\& forever start app\/app.js 8083 \&\& forever start app\/app.js 8084 \&\& forever list \&\& forever --fifo logs 0 \",/g" /app/package.json

在这里运行的脚本如下所示:
仅使用forever将导致容器在执行后终止。
为了继续保持容器,我们需要输出日志。使用forever –fifo logs 0。

forever start app/app.js 8081 
forever start app/app.js 8082 
forever start app/app.js 8083 
forever start app/app.js 8084
forever list 
forever --fifo logs 0

Nginx将配置文件加载到容器中。

FROM nginx
COPY default.conf /etc/nginx/conf.d/default.conf
COPY upstream.conf /etc/nginx/conf.d/upstream.conf
server {
  listen 80;
  location / {
    proxy_pass http://nodejs_design_patterns_app;
  }
}

在示例中,将”127.0.0.1″替换为容器的名称(nodejs)。

  upstream nodejs_design_patterns_app {
    server nodejs:8081;
    server nodejs:8082;
    server nodejs:8083;
    server nodejs:8084;
  }

app.js并没有从例子中发生任何更改。

"use strict";

const http = require('http');
const pid = process.pid;

http.createServer((req, res) => {
  //  1e7: 10の累乗を指数で指定*1
  for (let i = 1e7; i > 0; i--) {}
  console.log(`Handling request from ${pid}`);
  res.end(`Hello from ${pid}\n`);
}).listen(process.env.PORT || process.argv[2] || 8080, () => {
  console.log(`Started ${pid}`);
});

请提供以下信息的中文本地语言释义,只需提供一个选项:

1. Could you please explain the concept of artificial intelligence to me?

请使用自己编写的源代码作为参考。

可以查阅

Node.js设计模式 第二版
支持页面
使用Docker快速运行Apache Bench
将node.js express forever应用容器化为Docker容器
实战篇 – 使用Docker在nginx上设置反向代理

广告
将在 10 秒后关闭
bannerAds