Я запускаю свое приложение nodejs в aws ecs.
Я создаю в ecs кластер. в кластере запущена служба, которая запускает задачу. Внутри задачи у меня есть nginx (portMapping: 0:80 - динамический c порт для ALB) и nodejs изображения.
Файлы Docker просты (ничего особенного):
dockerfile nginx:
FROM nginx:latest
WORKDIR /
RUN echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list
RUN apt-get -y update && \
apt-get -y install apt-utils && \
apt-get -y upgrade && \
apt-get -y install nano && \
apt-get -y clean
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
Dockerfile nodejs приложение:
FROM node:latest
WORKDIR /usr/src/app
COPY ./package.json .
COPY ./app-prod-www.js .
RUN npm install
EXPOSE 3000
CMD [ "npm", "start" ]
и nginx .conf:
user nginx;
worker_processes 4;
events { worker_connections 1024; }
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-available/*.conf;
upstream prodwww {
least_conn;
server prod-www:3000 weight=10 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
location / {
proxy_pass http://prodwww;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
Кластер имеет два экземпляра ec2.
Служба выполняет 4 задачи.
Я установил ALB, который должен перенаправить трафик c к этим экземплярам ec2.
Но когда у меня 100% ЦП в одном из контейнеров, ALB не перенаправляет трафик c на свободный компьютер ec2.
Я пишу код Фибоначчи, когда я получаю доступ к / тестовый маршрут. это приведет к 100% процессору. и приложение nodejs не может получать запросы до тех пор, пока оно не будет завершено (а Фибоначчи (100) займет много времени).
Так что после доступа к маршруту /test
я вижу, что это занимает много времени завершить. тем временем я открываю новую вкладку в браузере и пытаюсь получить доступ к маршруту root (/
), который должен обслуживать текст App Prod WWW
.
Но я вижу, что он не отвечает. что означает, что ALB все еще перенаправляет меня на этот nodejs экземпляр приложения.
Почему это так? Если я пропущу информацию здесь, пожалуйста, дайте мне знать, и я обновлю свой вопрос.
Вот мое заявление:
const express = require('express');
const app = express();
const port = 3000;
console.log('app prod www nodejs started');
app.get('/', (req, res) => res.send(`App Prod WWW! ${process.pid}/${process.env.NAME}`));
app.get('/test', (req, res) => {
console.log('in test');
function fibonacci(n) {
return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
}
const x = fibonacci(100);
console.log('after x');
res.json({ x });
});
app.get('/api', (req, res) => {
console.log('in api');
res.json({ ok: true });
});
app.listen(port, () => console.log(`Example app listening on port ${port}!`));