Nginx 설치 - CentOS 7

  • add nginx repository

    # vi /etc/yum.repos.d/nginx.repo
    [nginx]
    name=Nginx Repository
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgchecl=0
    enabled=1
  • install nginx

    # yum install -y nginx
  • if not use 80 port, setting firewall and modify nginx conf file

    # firewall-cmd --permanent --zone=public --add-port=81/tcp
    # firewall-cmd --reload
    # firewall-cmd --list-ports
    ...
    # vi /etc/nginx/conf.d/default.conf
    ...
      listen 81;
    ...

'Programming > Server' 카테고리의 다른 글

[CentOS 7] mongoDB 설치  (0) 2019.04.29
[Network] OSI 7계층  (0) 2019.04.03
[Linux] 자주 사용하는 명령어 (grep, find, exec, xargs, awk)  (1) 2019.02.26
[Linux] nohup 사용  (0) 2019.02.01
[Ubuntu] AWS - Ubuntu locale 한글 변경  (0) 2019.01.14

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가지 옵션을 꼭 입력해 주세요.


[Nginx-proxy 이미지 사용]

- docker-compose 를 통한 컨테이너 구축


- 서브도메인을 분기 시켜줄 프록시 컨테이너

* nginx-proxy.yaml


version: '2'
services:
nginx-proxy:
container_name: nginx-proxy
image: jwilder/nginx-proxy
ports:
- "80:80"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /home/test/nginx-proxy/log:/var/log/nginx

networks:
default:
external:
name: nginx-proxy



- 기본 웹서버 컨테이너

* nginx-www.yaml


version: '2'
services:
nginx-www:
image: nginx:latest
environment:
- VIRTUAL_HOST=www.domain.com
container_name: nginx-www

networks:
default:
external:
name: nginx-proxy



- 서브도메인을 테스트 할 test 컨테이너 (test 대신 다른 웹서버 이미지를 사용해서 테스트 해야합니다.)

* test.yaml


version: '2'
services:
test-container:
image: test
container_name: test
environment:
- VIRTUAL_HOST=sub.domain.com
- VIRTUAL_PORT=3000

networks:
default:
external:
name: nginx-proxy



- 프록시 컨테이너 내 nginx 설정 파일 확인

/etc/nginx/conf.d/default.conf

~~~
server {
    server_name _; # This is just an invalid value which will never trigger on a real hostname.
    listen 80;
    access_log /var/log/nginx/access.log vhost;
    return 503;
version: '2'
}
# www.domain.com
upstream www.domain.com {
                ## Can be connected with "nginx-proxy" network
            # nginx-www
            server 192.0.0.1:80;
}
server {
    server_name www.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://www.domain.com;
    }
}
# test.domain.com
upstream test.domain.com {
            ## Can be connected with "nginx-proxy" network
            # test web server container
            server 192.0.0.2:3000;
}
server {
    server_name test.domain.com;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://test.domain.com;
    }
}



---------------

+ Recent posts