워드프레스 배포: 도커, Nginx, 아파치 및 SSL

당신의 WordPress 웹사이트 배포를 간소화하세요. 우리의 쉽게 따라갈 수 있는 안내서를 통해 Docker Compose, Nginx, Apache, SSL을 사용하여 원활한 설치 과정을 경험하세요.

또한 볼륨을 생성하여 컨테이너가 재시작되더라도 변경 사항이나 업데이트가 보존되도록 할 것입니다.

이 설정은 Google 클라우드에서 Ubuntu 22.04 OS를 실행하는 인스턴스에서 테스트되었습니다. 이 설정을 AWS, Azure, DigitalOcean 또는 어떤 전용 서버나 VPS 서버에서도 구축할 수 있습니다.

사전 준비

  1. Ubuntu 22.04에 Docker 설치
  2. Ubuntu 22.04에 Docker Compose 설치.

위에서 언급한 모든 단계를 완료했는지 확인하세요.

  • 도메인을 서버 IP 주소로 포인팅했는지 확인하세요.
  • Docker가 설치되어 구성되었는지 확인하세요.
  • Docker Compose가 설치되어 구성되었는지 확인하세요.

모든 사전 준비가 완료되면 WordPress 설정 및 구성을 진행할 수 있습니다.

프로젝트 디렉토리 생성

서버에 SSH로 접속하여 wp-project라는 이름의 새 프로젝트 디렉토리를 시작합니다. 필요에 따라 이름을 임의로 변경할 수 있습니다.

 
mkdir wp-project

Docker Compose YML 파일 생성

이제 프로젝트 디렉토리 내부로 이동하여 다음과 같은 구성으로 새 docker-compose.yml 파일을 생성하세요.

 
cd wp-project

docker-compose.yml 파일을 생성하세요.

 
nano docker-compose.yml

파일에 아래 내용을 전체 복사하여 붙여넣으세요.

도커 컴포즈 설정

다음에 언급된 환경 변수를 반드시 교체하십시오.

 

docker-compose.ymlversion: "3.9"
services:
    wordpress:
        container_name: wordpress
        image: wordpress:php8.2-apache
        restart: always
        stdin_open: true
        tty: true
        environment:
            WORDPRESS_DB_HOST: mariadb
            WORDPRESS_DB_USER: db_user
            WORDPRESS_DB_PASSWORD: db_user_pass
            WORDPRESS_DB_NAME: db_name
        volumes:
            - wordpress_data:/var/www/html
    mariadb:
        container_name: mariadb
        image: mariadb
        restart: always
        environment:
            MYSQL_DATABASE: db_name
            MYSQL_USER: db_user
            MYSQL_PASSWORD: db_user_pass
            MYSQL_RANDOM_ROOT_PASSWORD: 'root_pass'
        volumes:
            - db_data:/var/lib/mysql
    nginx:
        container_name: nginx
        image: nginx:latest
        restart: unless-stopped
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./nginx/conf:/etc/nginx/conf.d
            - ./certbot/conf:/etc/nginx/ssl
            - ./certbot/data:/var/www/html
    certbot:
        container_name: certbot
        image: certbot/certbot:latest
        command: certonly --webroot --webroot-path=/var/www/html --email [email protected] --agree-tos --no-eff-email -d domain.com -d www.domain.com
        volumes:
            - ./certbot/conf:/etc/letsencrypt
            - ./certbot/logs:/var/log/letsencrypt
            - ./certbot/data:/var/www/html
volumes:
    db_data:
    wordpress_data:

파일을 저장하고 종료하려면 CTRL-X를 누른 후 YENTER를 누르세요.

도커 컴포즈 설정: 설명

여기 설정 상세가 있습니다:

  • 버전: 도커 엔진과 호환되는 컴포즈 파일 버전을 작성하십시오. 호환성을 확인할 수 있습니다 여기.
  • 서비스: 여기서 우리는 WordPress, MariaDB, nginx, 그리고 certbot이라는 네 가지 서비스를 갖습니다.
  • 이미지: 우리는 Docker 허브에서 사용 가능한 최신 WordPress와 PHP 8.2, Apache, Mariadb, Nginx, 그리고 Certbot 이미지를 사용합니다.
  • 볼륨:
    • wordpress_data: 이 디렉토리를 컨테이너 내부에서 웹 루트로 사용하고자 하는 디렉토리와 동기화하도록 설정했습니다.
    • conf: 여기에 Nginx 구성 파일을 배치하여 컨테이너 내부의 기본 Nginx conf.d 폴더와 동기화할 것입니다.
    • cedtbot/conf: 이곳에 SSL 인증서를 받아들이고, 이것을 컨테이너 내부에서 원하는 폴더와 동기화할 것입니다.
    • ports: 컨테이너가 나열된 포트에서 수신 대기하도록 구성합니다.
    • command: SSL 인증서를 받아들이는 데 사용되는 명령어입니다.
  • 환경: 여기에서는 WordPress 이미지에 사용 가능한 모든 환경 변수를 나열합니다.
    • WORDPRESS_DB_HOST: 여기서는 MariaDB 컨테이너의 서비스 이름을 사용합니다.
    • WORDPRESS_DB_USER: mariadb 서비스에서 구성한 것과 동일합니다.
    • WORDPRESS_DB_PASSWORD: mariadb 서비스에서 구성한 것과 동일합니다.
    • WORDPRESS_DB_NAME: mariadb 서비스에서 구성한 것과 동일합니다.

Nginx 구성

docker-compose.yml 구성에 따라 nginx/conf 디렉토리 내에 default.conf 파일을 생성해야 합니다.

docker-compose.yml 파일 옆에 구성 파일을 보관할 디렉토리를 생성합니다.

 
mkdir -p nginx/conf

default.conf라는 이름의 파일을 생성합니다.

 
nano nginx/conf/default.conf

다음 구성을 넣으십시오. 여기서는 Apache를 실행하는 wordpress 컨테이너에 역방향 프록시 구성을 사용합니다.

 

nginx/conf/default.conf server {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain.com;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
        allow all; 
        root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }
} 

CTRL-X를 누른 후 YENTER를 눌러 파일을 저장하고 종료합니다.

이제 도커 컴포즈 구성과 Nginx 구성을 준비했습니다.

도커 컴포즈로 WordPress 배포하기

다음 명령어를 사용하여 컨테이너를 시작하세요. 컨테이너가 시작되면 SSL 인증서를 받게 됩니다.

 
docker-compose up -d

모든 컨테이너가 시작되면 certbotWordPress라는 두 개의 추가 디렉토리가 docker-compose.yml 파일 옆에 생성됩니다.

wordpress 디렉토리는 모든 WordPress 웹사이트 소스 코드를 보관합니다.

certbot 디렉토리는 SSL 인증서와 관련된 모든 파일을 보관합니다.

컨테이너를 보려면 다음 명령을 실행하세요.

 
docker-compose ps

Nginx로 Let’s Encrypt SSL 구성하기

Let’s Encrypt SSL 인증서를 받았으니 HTTPS를 구성하고 HTTPS로 리디렉션을 설정할 수 있습니다.

default.conf를 수정하여 다음과 같이 변경하세요.

 
nano nginx/conf/default.conf

 

nginx/conf/default.confserver {
    listen [::]:80;
    listen 80;

    server_name domain.com www.domain;

    return 301 https://www.domain.com$request_uri;
}

 server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    return 301 https://www.domain.com$request_uri; 
}

server {
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    server_name www.domain.com;

    ssl_certificate /etc/nginx/ssl/live/domain.com/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/live/domain.com/privkey.pem;

    root /var/www/html;
    index index.php;

    location ~ /.well-known/acme-challenge {
         allow all; 
         root /var/www/html;
    }

    location / {
        try_files $uri @apache;
    }

    location ~ ^/.user.ini {
        deny all;
    }

    location ~*  .(svg|svgz)$ {
        types {}
        default_type image/svg+xml;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location @apache {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~[^?]*/$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }

    location ~ .php$ {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://wordpress:80;
    }
} 

파일을 저장하고 종료하려면 CTRL-X를 누른 다음 YENTER를 누르세요.

이제 새 구성을 로드하기 위해 Nginx 서비스를 다시 시작할 수 있습니다.

 
docker-compose restart nginx

이제 브라우저에서 도메인 이름을 확인할 수 있습니다. HTTPS로 리디렉션되며 WordPress 설치 페이지가 표시되어 설치를 완료할 수 있습니다.

문제 해결

컨테이너에 SSH로 접근하여 에러 로그를 확인하기 위한 몇 가지 팁입니다.

도커 컨테이너에 SSH 접속하기

wordpress 컨테이너에 SSH로 접속하려면 아래 명령어를 사용하세요.

 
docker-compose exec wordpress /bin/bash

SSH로 nginx 컨테이너에 접속하려면 아래 명령어를 사용하십시오.

 
docker-compose exec nginx /bin/bash

컨테이너 로그 확인

docker-compose를 사용하여 컨테이너의 로그를 확인하려면 아래 명령어를 사용하십시오.

 
docker-compose logs -f

컨테이너 재시작

restart 명령어를 쉽게 사용하여 컨테이너를 재시작할 수 있습니다.

 
docker-compose restart container_name

container_name을 사용자의 컨테이너 이름(wordpress, nginx, certbot)으로 교체하십시오.

모든 Docker 컨테이너 중지

아래 명령어를 사용하여 모든 Docker 컨테이너를 중지할 수 있습니다.

docker-compose down

모든 컨테이너 및 볼륨 제거

아래 명령어를 사용하여 docker-compose로 모든 컨테이너와 그 볼륨을 제거할 수 있습니다.

 
docker compose rm -fv

모든 Docker 컨테이너 제거

다음 명령어를 사용하여 모든 컨테이너를 제거하십시오.

 
docker rm -f $(docker ps -a -q)

모든 볼륨 삭제

아래 명령어를 사용하여 모든 볼륨을 삭제할 수도 있습니다.

 
docker volume rm $(docker volume ls -q)

모든 컨테이너 시작

단일 Docker compose 명령어로 모든 컨테이너를 시작할 수 있습니다.

 
docker-compose up -d

결론

이제 Ubuntu 22.04에서 Docker 및 Docker Compose로 WordPress와 Nginx, Apache, PHP 8.2, MariaDB, Let’s Encrypt를 설치 및 설정하는 방법을 배웠습니다.

시간 내어 주셔서 감사합니다.

Source:
https://dzone.com/articles/wordpress-deployment-docker-nginx-apache-ssl