Nginx Reverse Proxy Example with Node.js Express

   - reverse proxy 관련 도커 이미지는 jwilder/nginx-proxy 와 JrCs/docker-letsencrypt-nginx-proxy-companion 를 사용했습니다.
   - https://github.com/jwilder/nginx-proxy
   - https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion

  • https://github.com/jmyoon4488/docker-nginx-reverse-proxy
  • docker-compose 사용
  1. nginx-proxy 컨테이너 실행
  2. Dockerfile 로 Node.js 이미지 파일 빌드
  3. 빌드한 이미지로 Node.js 웹서버 실행
  4. 잘 적용되었는지 확인!

  1. nginx-proxy container 실행해줍니다.

    • /your/path/nginx-proxy - 해당 부분은 자신의 서버에 맞는 경로로 바꿔주세요.
    • proxy/nginx-proxy-letsencrypt.yml

    version: '3' services: nginx-proxy: container_name: nginx-proxy image: jwilder/nginx-proxy ports: - 80:80 - 443:443 restart: always volumes: - /your/path/nginx-proxy/log:/var/log/nginx  - /your/path/nginx-proxy/html:/usr/share/nginx/html - /your/path/nginx-proxy/certs:/etc/nginx/certs         - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/config:/etc/nginx/conf.d - /var/run/docker.sock:/tmp/docker.sock:ro labels: - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy etsencrypt-nginx-proxy: container_name: leten-nginx-proxy image: jrcs/letsencrypt-nginx-proxy-companion restart: always depends_on: - nginx-proxy volumes: - /your/path/nginx-proxy/certs:/etc/nginx/certs - /your/path/nginx-proxy/vhost.d:/etc/nginx/vhost.d - /your/path/nginx-proxy/html:/usr/share/nginx/html - /var/run/docker.sock:/var/run/docker.sock:ro networks: default: external: name: nginx-proxy

    $ docker-compose -f nginx-proxy-letsencrypt.yml up -d
    
    • $ docker ps 명령어로 컨테이너가 정상적으로 실행되고 있는지 확인.
  2. Dockerfile 로 Node.js 이미지 빌드

    • node/Dockerfile
    FROM node:carbon
    
    ENV SRCDIR /src
    RUN mkdir -p $SRCDIR/app && chown -R node:node $SRCDIR
    
    WORKDIR $SRCDIR
    COPY ./package.json $SRCDIR
    
    RUN npm install
    
    COPY . $SRCDIR
    
    EXPOSE 3000
    WORKDIR $SRCDIR/app
    
    CMD ["node", "app.js"]
    • package.json
    {
        "name": "node",
        "version": "0.0.0",
        "private": true,
        "scripts": {
            "start": "node ./app/app.js"
        },
        "dependencies": {
            "debug": "~2.6.9",
            "ejs": "~2.5.7",
            "express": "~4.16.0",
            "request": "^2.88.0",
            "uuid": "^2.0.2"
        }
    }
    • build image
    $ docker build --tag nodejs:test .
    
    • $ docker images  로  이미지 확인
    REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
    nodejs                                   test                000000000000        24 minutes ago      902 MB
    
  3. 빌드한 이미지로 Node.js 컨테이너 실행

    • 4개 항목은 꼭 자신에게 맞는 값으로 변경 - VIRTUAL_HOST, VIRTUAL_PORT, LETSENCRYPT_HOST, LETSCRYPT_EMAIL
    • 포트를 변경하려면 Dockerfile 에서 EXPOSE 포트를 변경하고 다시 빌드해 줍니다.
    • node/node-test.yml
    version: '3'
    
    services:
      nodejs-test:
        container_name: node-test
        image: nodejs:test
        volumes:
          - ./app:/src/app
        environment:
          - VIRTUAL_HOST=sub.domain.com
          - VIRTUAL_PORT=3000
          - LETSENCRYPT_HOST=sub.domain.com
          - LETSCRYPT_EMAIL=your@email.com
    
    networks:
      default:
        external:
          name: nginx-proxy
    • 컨테이너 확인
    $ docker ps
    
  4. 프록시 및 letsencrypt 적용 확인

    • 브라우저를 통해 설정에 적용한 서브도메인으로 접속해봅니다.
    • nginx 설정파일을 확인해 봅니다.
    $ docker exec nginx-proxy cat /etc/nginx/conf.d/default.conf
    

    or

    $ sudo cat ./config/default.conf
    
    • default.conf
    ~~~~~~~
    # sub.domain.com
    upstream sub.domain.com {
                    ## Can be connected with "nginx-proxy" network
                # node-test
                server 172.5.0.1:3000;
    }
    server {
        server_name sub.domain.com;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        return 301 https://$host$request_uri;
    }
    server {
        server_name sub.domain.com;
        listen 443 ssl http2 ;
        access_log /var/log/nginx/access.log vhost;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers 'CODE~~~~~~~~~~~~~';
        ssl_prefer_server_ciphers on;
        ~~~ many options 
        include /etc/nginx/vhost.d/default;
        location / {
            proxy_pass http://sub.domain.com;
        }
    }
  5. 만약 다른 웹서버 컨테이너를 추가하고 싶다면...

    • 추가할 웹서버는 도커를 이용해 실행해야 합니다.
    • 컨테이너는 반드시 프록시 컨테이너와 같은 도커 네트워크 상에 위치해야 합니다. (nginx-proxy)
    • 위에서 지정한 4가지 옵션을 꼭 입력해 주세요.


+ Recent posts