[Docker][Web] Nginx의 Reverse Proxy를 이용한 분산처리(3)

이수진·2022년 2월 16일
0

이번에도 저번에 공부했던 것 복습 겸 Nginx의 Reverse Proxy를 이용하여 포워딩을 해보겠습니다.

먼저 아키텍처 구조는 다음과 같습니다.

1. 아키텍처

URL로 포워딩을 했습니다!
뭔가 더 예쁘게 아키텍처 그려보고싶은데, 맘대로 잘 안되네용

구성은 다음과 같습니다.
앞단에 nginx_proxy 서버를 이용하여 뒷단의 두 서버로 URL 포워딩을 합니다.

도커 컨테이너는 nginx_proxy, app1, app2, mysql 총 4개입니다.
그리고 app2의 서버는 wordpress를 이용했는데,
wordpress는 db로 mysql 또는 마리아DB가 주로 사용되는데, 저는 제가 자주쓰는 mysql을 이용했습니다.


2. 파일구조

  • 파일구조
root
│
└───docker-compose.yml
│
└───nginx
    └───nginx.conf

3. docker-compose.yml, nginx.conf 설정

  • docker-compose.yml
version: "3"

services:
  nginx_proxy: # 컨테이너1
    depends_on:
      - nginx
      - db
      - wordpress
    image: nginx:latest
    ports:
      - "80:80"
    restart: always
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"

  nginx: # 컨테이너2
    image: nginx:latest
    restart: always

  db: # 컨테이너3
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: sujin
      MYSQL_DATABASE: mydb
      MYSQL_USER: sujin
      MYSQL_PASSWORD: sujin

  wordpress: # 컨테이너4
    depends_on:
      - db # 종속성: db -> wordpress
    image: wordpress:5.7.0
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: mydb
      WORDPRESS_DB_USER: sujin
      WORDPRESS_DB_PASSWORD: sujin

wordpress는 db가 먼저 실행된 뒤에 실행해야하므로,
depends_on 옵션으로 순서를 지정해주었습니다.

  • nginx.conf

추가적으로 설정한 부분은 다음과 같습니다.

.
.
.
    upstream docker-wordpress {
        server wordpress:80;
    }

    upstream docker-web {
        server nginx:80;
    }

    server {
        location /app2/ {
            proxy_pass         http://docker-wordpress;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }

        location /app1/ {
            rewrite            ^/app1(.*)$ $1 break;
            proxy_pass         http://docker-web;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
        }
    }
.
.
.

wordpress도 rewrite옵션을 써서 했었는데,
이게 뭐가 깨지더라구요...?
뜨긴 뜨는데, 깨지는 게 있어서
그냥 rewrite옵션을 제거하구 따로 루트html 디렉토리에 app2파일을 추가하고 여기에 루트html 디렉토리의 모든 파일들을 app2로 이동시켰습니다!
(이 부분은 도커 컨테이너 먼저 띄운 후, 직접 컨테이너에 접속해서 실행하면 됩니다.)


4. 도커 컨테이너 생성 및 실행

docker-compose up -d 명령어를 통해 도커 컨테이너를 띄우면 다음과 같습니다.

ubuntu@ip-172-31-38-68:~$ docker-compose up -d
Building with native build. Learn about native build in Compose here: https://docs.docker.com/go/compose-native-build/
Creating network with the default driver
Pulling nginx (nginx:latest)...
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
Pulling db (mysql:5.7)...
5.7: Pulling from library/mysql
6552179c3509: Pull complete
d69aa66e4482: Pull complete
3b19465b002b: Pull complete
7b0d0cfe99a1: Pull complete
9ccd5a5c8987: Pull complete
2dab00d7d232: Pull complete
64d3afdccd4a: Pull complete
6992e58be0f2: Pull complete
67313986b81d: Pull complete
7c36a23db0a4: Pull complete
d34c396e3198: Pull complete
Digest: sha256:afc453de0d675083ac00d0538521f8a9a67d1cce180d70fab9925ebcc87a0eba
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:5.7.0)...
5.7.0: Pulling from library/wordpress
f7ec5a41d630: Pull complete
941223b59841: Pull complete
a5f2415e5a0c: Pull complete
b9844b87f0e3: Pull complete
5a07de50525b: Pull complete
caeca1337a66: Pull complete
5dbe0d7f8481: Pull complete
a12730739063: Pull complete
fe0592ad29bf: Pull complete
c3e315c20689: Pull complete
8c5f7fdfcedf: Pull complete
8b40a9fa66d5: Pull complete
81830aebb3f8: Pull complete
7b04d4658443: Pull complete
0e596b6c428e: Pull complete
ec84879c7faf: Pull complete
5f211a0d2061: Pull complete
47c48169dcd4: Pull complete
19b34857b097: Pull complete
78810a623bdc: Pull complete
25db262383c2: Pull complete
Digest: sha256:975d87d59a52d806a5049040cbb0867f9988bfecd17342637b70c3811c3dc991
Status: Downloaded newer image for wordpress:5.7.0
Creating db_1    ... done
Creating nginx_1 ... done
Creating wordpress_1 ... done
Creating nginx_proxy_1 ... done

총 4개의 컨테이너가 생성되었음을 확인할 수 있습니다.

ubuntu@ip-172-31-38-68:~$ docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                               NAMES
5a38c61d562d   nginx:latest      "/docker-entrypoint.…"   47 minutes ago   Up 47 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx_proxy_1
b491c5f4c249   wordpress:5.7.0   "docker-entrypoint.s…"   47 minutes ago   Up 47 minutes   80/tcp                              wordpress_1
399794b99e72   nginx:latest      "/docker-entrypoint.…"   48 minutes ago   Up 47 minutes   80/tcp                              nginx_1
3485c5aabde7   mysql:5.7         "docker-entrypoint.s…"   48 minutes ago   Up 47 minutes   3306/tcp, 33060/tcp                 db_1

5. 각 내부 서버 접속 확인

  • ip주소/app1 -> app1서버(nginx)로 포워딩

  • ip주소/app2 -> app2서버(wordpress)로 포워딩

먼저 간단히, 설정을 완료한 이후에 접속하면 다음과 같습니다.

아직 아무것도 안 꾸며서 허접?하지만
나름 제 사이트 블로그가 만들어졌습니다!

profile
꾸준히, 열심히, 그리고 잘하자

0개의 댓글