Skip to content

nodejs-typescript-classroom/nginx-with-docker-sample

Repository files navigation

nginx-with-docker-sample

This repository is for learning how to use nginx with docker

start point

a website sample with nginx

load-balancer-sample

setup docker file

FROM node:20.10.0-alpine
WORKDIR /app
COPY server.js .
COPY index.html .
COPY images ./images
COPY package.json .
RUN npm i --production
EXPOSE 3000
USER node
ENTRYPOINT [ "node", "./server.js" ]

build docker image

docker build -t myapp:1.0 .

check image

docker images | grep myapp

run the myapp with image

docker run -p --name=myapp -e APP_NAME=node-app 3000:3000 myapp:1.0 

setup docker-compose for multiple container

services:

  node-app-1:
    container_name: node-app-1
    build:
      context: .
      dockerfile: ./Dockerfile
    image: node-app
    ports:
      - 3001:3000
    environment:
      - APP_NAME=node-app-1
    networks:
      - node-app

  node-app-2:
    container_name: node-app-2
    build:
      context: .
      dockerfile: ./Dockerfile
    image: node-app
    ports:
      - 3002:3000
    environment:
      - APP_NAME=node-app-2
    networks:
      - node-app

  node-app-3:
    container_name: node-app-3
    build:
      context: .
      dockerfile: ./Dockerfile
    image: node-app
    ports:
      - 3003:3000
    environment:
      - APP_NAME=node-app-3
    networks:
      - node-app
  
networks:
  node-app:
    name: node-app
    driver: bridge

setup nginx load and https encryption

https-encryption-and-load-balancer

setup nginx

concept of nginx

worker_processes

worker_processes

worker_connections

worker_connections

setup concept

directive-context

better correct setup

better-correct-setup

obtain SSL/TLS certification

for demo, we generate self-signed certificate

  1. create certificate folder
mkdir nginx-certs
  1. create certficate
cd nginx-certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt

setup for ssl setup on nginx.conf

worker_processes 1;

events {
  worker_connections 1024;
}

http {
  include mime.types;

  upstream nodejs_cluster {
    least_conn;
    server node-app-1:3000;
    server node-app-2:3000;
    server node-app-3:3000;
  }
  server {
    listen 443 ssl;
    server_name nginx;

    ssl_certificate /nginx-certs/nginx-selfsigned.crt;
    ssl_certificate_key /nginx-certs/nginx-selfsigned.key;

    location / {
      proxy_pass http://nodejs_cluster;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

modify docker-compose file

services:

  node-app-1:
    container_name: node-app-1
    build:
      context: .
      dockerfile: ./Dockerfile
    image: node-app
    environment:
      - APP_NAME=node-app-1
    networks:
      - node-app

  node-app-2:
    container_name: node-app-2
    build:
      context: .
      dockerfile: ./Dockerfile
    image: node-app
    environment:
      - APP_NAME=node-app-2
    networks:
      - node-app

  node-app-3:
    container_name: node-app-3
    build:
      context: .
      dockerfile: ./Dockerfile
    image: node-app
    environment:
      - APP_NAME=node-app-3
    networks:
      - node-app
  
  nginx:
    container_name: nginx
    image: nginx
    ports:
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx-certs:/nginx-certs
    restart: always
    networks:
      - node-app
    depends_on:
      - node-app-1
      - node-app-2
      - node-app-3

networks:
  node-app:
    name: node-app
    driver: bridge

current only could access through https://localhost:443

re-forward to https

port-forwarding

port-forwarding

modify configuration

worker_processes 1;

events {
  worker_connections 1024;
}

http {
  include mime.types;

  upstream nodejs_cluster {
    least_conn;
    server node-app-1:3000;
    server node-app-2:3000;
    server node-app-3:3000;
  }
  server {
    listen 443 ssl;
    server_name nginx;

    ssl_certificate /nginx-certs/nginx-selfsigned.crt;
    ssl_certificate_key /nginx-certs/nginx-selfsigned.key;

    location / {
      proxy_pass http://nodejs_cluster;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }

  server {
    listen 80;
    server_name nginx;

    location / {
      return 301 https://$host$request_uri;
    }
  }
}

reference

nginx-crash-course nginx-crash-course-repo

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published