Drupal은 PHP로 작성된 오픈 소스 콘텐츠 관리 시스템(CMS)입니다. 전 세계의 많은 조직에서 이를 사용하여 블로그, 정부 사이트, 기업 웹사이트 등을 만듭니다. 기능을 확장할 수 있는 기능 및 모듈 세트가 함께 제공되어 원하는 웹 사이트를 만들 수 있습니다.전제 조건
A server running Ubuntu 22.04 with a minimum of 1GB of RAM for smaller communities. To host larger communities, you should get a server with a minimum of 2GB of RAM or more.
A non-root user with sudo privileges.
A fully qualified domain name (FQDN) pointing to your server. For our purposes, we will useexample.comas the domain name.
Make sure everything is updated.
$ sudo apt update
Install basic utility packages. Some of them may already be installed.
Docker 리포지토리 파일을 만듭니다.시스템 저장소 목록을 업데이트하십시오.최신 버전의 Docker를 설치합니다.실행 중인지 확인합니다.기본적으로 Docker에는 루트 권한이 필요합니다.sudo명령을 실행할 때마다sudo를 사용하지 않으려면docker명령에 사용자 이름을 추가하세요. > 그룹.이 변경을 활성화하거나 다음 명령을 사용하려면 서버에서 로그아웃하고 동일한 사용자로 다시 로그인해야 합니다.사용자가 Docker 그룹에 추가되었는지 확인합니다.3단계 - Drupal용 Docker Compose 파일 생성
$ mkdir ~/drupal
디렉터리로 전환합니다.편집을 위해docker-compose.yml파일을 만들고 엽니다.다음 코드를 붙여넣습니다.Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.MySQL 도커 서비스드루팔 서비스엔진엑스 서비스Certbot 서비스4단계 - Nginx 구성 생성
$ mkdir nginx-conf
Nginx용 파일을 만들고 엽니다.다음 코드를 붙여넣습니다.Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.5단계 - SSL 인증서 생성
$ docker compose up -d
서비스의 상태를 확인하십시오.인증서 생성 후 Certbot 컨테이너가 성공적으로 종료됩니다. Nginx 컨테이너에서 인증서 위치를 확인합니다.다음과 같은 결과가 표시됩니다.이것은 모든 것이 성공했음을 확인합니다. 다음 단계는 실제 인증서를 생성하는 것입니다.
$ nano docker-compose.yml
Certbot 서비스 섹션에서--staging플래그를 교체하고--force-renewal플래그로 교체합니다. 이는 Certbot에게 도메인에 대한 새 인증서를 요청하도록 지시합니다. 갱신 플래그는 여기에서 인증서를 갱신하는 데 사용되기 때문에 사용됩니다.Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
$ docker compose up --force-recreate --no-deps certbot
다음과 같은 결과가 표시됩니다.6단계 - SSL용 Nginx 구성Nginx 서버를 중지합니다.SSL 구성을 위한 새 Nginx 파일을 만들고 편집을 위해 엽니다.다음 코드를 붙여넣습니다.Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.다음 단계는 Nginx 컨테이너가 포트 443을 수신하는지 확인하는 것입니다. 편집을 위해docker-compose.yml파일을 엽니다.파일의 Nginx 섹션에서 아래와 같이 443을 노출하고 SSL을 활성화하도록 변경합니다.Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
$ rm nginx-conf/drupal.conf
Nginx를 다시 시작하기 전에 위에서 이미 구성한 Diffie-Hellman 그룹 인증서를 생성해야 합니다.Nginx 컨테이너를 다시 만듭니다.컨테이너의 상태를 확인합니다.7단계 - Drupal 웹 설치 프로그램 시작
저장하고 계속하기 버튼을 클릭하여 설치 프로필 페이지로 이동합니다.우리는 표준 프로필을 고수할 것입니다. 저장하고 계속하기 버튼을 클릭하여 데이터베이스 구성 페이지로 이동합니다.환경 파일에서 사용한 데이터베이스 자격 증명을 입력하고 고급 옵션 섹션을 확장한 다음mysql을 데이터베이스 호스트로 입력합니다. 이는 Drupal이 연결해야 하는 Docker 작성 파일의 MySQL 서비스 이름과 일치합니다.
다음으로 Drupal 구성 페이지로 이동합니다. 사이트 이름, 이메일, 사용자 이름, 비밀번호 및 지역 설정을 입력합니다. 완료되면 저장하고 계속하기 버튼을 클릭합니다.마지막으로 Drupal 대시보드로 이동합니다. 웹 사이트를 만들기 위해 Drupal을 사용할 수 있습니다.8단계 - Drupal 구성MySQL 컨테이너 SSH 셸에 로그인합니다.루트 사용자를 사용하여 MySQL 셸을 엽니다.다음 명령을 실행하여 전역적으로 트랜잭션 수준을 변경합니다.exit를 두 번 입력하여 MySQL 셸과 컨테이너를 종료합니다.컨테이너에서 호스트로 설정 파일을 복사합니다.파일이 읽기 전용 모드입니다. 쓰기 권한을 부여하십시오.편집할 파일을 엽니다.파일에서 다음 섹션을 찾으십시오.아래와 같이 해시 기호를 제거하고 Drupal 도메인을 추가하여 주석 처리를 해제하십시오.Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
$ chmod -w settings.php
컨테이너 내부에 파일을 다시 복사합니다.9단계 - Drupal 백업
$ cd ~/drupal
백업용 디렉터리를 생성합니다.다음 명령을 사용하여 Drupal 데이터베이스를 백업하십시오. MySQL 루트 암호를 묻는 메시지가 표시됩니다.위의 명령은~/drupal/backup-data디렉토리에 SQL 백업을 생성합니다.
$ ls -al backup-data
total 6716
drwxrwxr-x 2 navjot navjot 4096 Jan 19 13:59 .
drwxrwxr-x 4 navjot navjot 4096 Jan 19 13:35 ..
-rw-rw-r-- 1 navjot navjot 6868325 Jan 19 13:37 data_19-01-2023_13_36_58.sql
디렉터리에 백업된 데이터베이스를 볼 수 있습니다. phpMyAdmin 도구 또는 다음 명령을 사용하여 이 데이터베이스를 복원할 수 있습니다.크론 작업을 생성하여 데이터베이스를 정기적으로 백업할 수 있습니다.
$ sudo nano /etc/cron.daily/drupalbackup.sh
다음 코드를 붙여넣습니다.Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.
$ sudo chmod +x /etc/cron.daily/drupalbackup.sh
이제 데이터베이스가 매일 백업됩니다.Drupal 업그레이드의 첫 번째 단계는 9단계의 명령을 사용하여 Drupal 데이터베이스를 백업하는 것입니다.
$ cd ~/drupal
컨테이너를 중지합니다.최신 컨테이너 이미지를 가져옵니다.다음 주 버전으로 업그레이드하려면 그에 따라 이미지 이름을 조정하고 Drupals 릴리스 정보를 검토하여 문제가 있는지 확인해야 합니다.Drupal 컨테이너를 다시 시작하십시오. 또한 다른 패키지의 부 버전에 대한 최신 이미지를 가져옵니다.결론
이것으로 Ubuntu 22.04 서버에서 Docker를 사용하여 Drupal을 설치하는 방법에 대한 자습서를 마칩니다. 질문이 있으시면 아래 의견에 게시하십시오.
$ docker compose up -d
원하는 경우docker-compose.yml에서 필요한 사항을 변경합니다. 나머지 이미지는 Docker 작성 파일에서 해당 정의를 변경하여 업데이트할 수 있습니다.
$ docker compose pull drupal:10-fpm-alpine
$ docker compose down
그런 다음 디렉터리로 전환합니다.
10단계 - Drupal 업그레이드
스크립트를 실행 가능하게 만드십시오.
#!/bin/bash cd /home/navjot/drupal/ /usr/bin/docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null
/etc/cron.daily디렉터리에 백업 스크립트를 생성하고 편집을 위해 엽니다.
$ docker compose exec mysql sh -c "exec mysql -uroot -p" < backup-data/data_19-01-2023_13_36_58.sql
디렉토리 내용을 확인하십시오.
$ docker compose exec mysql sh -c "exec mysqldump drupal -uroot -p" | tee backup-data/data_`date +%d-%m-%Y"_"%H_%M_%S`.sql >/dev/null Enter password: root_password
$ mkdir backup-data
명령줄을 사용하여 Drupal 데이터베이스를 백업합니다. Drupal 디렉터리로 전환합니다.
다음 단계는 HTTP HOST 헤더 공격으로부터 보호하기 위해 도메인을 신뢰할 수 있는 호스트로 입력하는 것입니다. 이를 위해 Drupal 컨테이너 내부의/var/www/html/sites/default/settings.php파일을 편집해야 합니다. Drupal 파일에 대해 이름이 지정된 볼륨을 사용하고 있으므로 변경하는 데 권장되는 방법은 파일을 컨테이너에서 호스트로 복사하고 편집한 다음 다시 컨테이너에 복사하는 것입니다. Drupal 설치 내에서 변경해야 하는 모든 파일에 대해 이 작업을 수행할 수 있습니다.
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
bash-4.4# mysql -u root -p Enter password:
$ docker exec -it mysql bash
이 단계는 선택 사항이지만 Drupal의 성능을 개선하는 데 도움이 됩니다. 첫 번째 단계는 MySQL 트랜잭션 격리 수준을 설정하는 것입니다. MySQL, MariaDB 및 동급 데이터베이스의 기본 트랜잭션 격리 수준은 \REPEATABLE READ\입니다. Drupal에서 이 설정을 사용하면 테이블에 교착 상태가 발생하여 사이트가 매우 느려지거나 전혀 응답하지 않을 수 있습니다. Drupal 사이트에 권장되는 트랜잭션 격리 수준은 READ COMMITTED입니다.
계속하려면 저장하고 계속하기 버튼을 클릭하십시오. Drupal은 기본 모듈 및 테마 설치를 시작합니다.
$ docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS certbot certbot/certbot "certbot certonly --…" certbot 3 hours ago Exited (0) 3 hours ago drupal drupal:10-fpm-alpine "docker-php-entrypoi…" drupal 3 hours ago Up 3 hours 9000/tcp mysql mysql:8.0 "docker-entrypoint.s…" mysql 3 hours ago Up 3 hours 3306/tcp, 33060/tcp webserver nginx:1.22.1-alpine "/docker-entrypoint.…" webserver 15 seconds ago Up 13 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp
$ docker compose up -d --force-recreate --no-deps webserver
total 16 drwx------ 3 root root 4096 Jan 17 09:15 . drwxr-xr-x 9 root root 4096 Jan 17 09:15 .. -rw-r--r-- 1 root root 740 Jan 17 09:15 README drwxr-xr-x 2 root root 4096 Jan 17 09:15 drupal.example.com
$ docker compose exec webserver ls -la /etc/letsencrypt/live
$ docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS certbot certbot/certbot "certbot certonly --…" certbot 6 minutes ago Exited (1) 5 minutes ago drupal drupal:10-fpm-alpine "docker-php-entrypoi…" drupal 6 minutes ago Up 6 minutes 9000/tcp mysql mysql:8.0 "docker-entrypoint.s…" mysql 6 minutes ago Up 6 minutes 3306/tcp, 33060/tcp webserver nginx:1.22.1-alpine "/docker-entrypoint.…" webserver 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp, :::80->80/tcp
SSL 인증서를 생성하기 위해 컨테이너를 시작합니다. 올바른 스테이징 인증서는 Nginx 컨테이너의/etc/letsencrypt/live폴더에서 사용할 수 있습니다.
이 파일에서 서버 이름 및 문서 루트에 대한 지시문이 있는 서버 블록과 인증서, PHP 처리 및 정적 자산 요청에 대한 Certbot 클라이언트의 요청을 지시하는 위치 블록을 추가합니다. 현재 Nginx는 포트 80에서만 수신 대기하여 Certbot이 임시 파일을/var/www/html/.well-known/acme-challenge디렉터리를 사용하여 DNS의 유효성을 검사합니다. 이를 통해 webroot 플러그인과 함께 Certbot을 사용할 수 있습니다.
마지막으로 SSL 인증서를 설치하기 위해 Certbot 이미지를 가져옵니다. 인증서 및 웹 루트 정의를 위해 Nginx 서비스와 볼륨을 공유합니다. 컨테이너가 생성될 때 실행할 명령도 포함했습니다. 여기서 명령은--staging플래그를 사용하여 처음으로 테스트 서버를 가져옵니다. 인증서를 확인하려면 nginx가 필요하지만 인증서가 없으면 Nginx가 시작되지 않습니다. 이것이 우리가 스테이징 인증서를 생성하고 이를 사용하여 Nginx를 시작한 다음 실제 인증서를 생성하는 이유입니다.
우리는 Nginx에 Alpine 이미지를 사용하고 있습니다. 포트 80을 호스트에 노출합니다. 명명된 볼륨 두 개를 사용합니다. 하나는 Drupals 공용 디렉터리용이고 다른 하나는 Lets Encrypt SSL 인증서 저장용입니다. 세 번째 볼륨은 나중에 정의할 호스트의 Nginx 구성 디렉터리에 대한 바인딩 마운트입니다. Nginx는 또한 Drupal 사이트가 작동하도록 외부 Docker 네트워크에 연결합니다.
Drupal 10 Alpine 이미지를 사용하고 있습니다. 알파인 도커 이미지는 크기가 더 작습니다. 이 이미지에는 PHP 처리를 처리하기 위한 PHP-FPM도 포함되어 있습니다. 이것은 사이트를 제공하기 위해 Nginx와 함께 작동합니다.depends_on옵션은 Drupal이 MySQL 서비스에 연결하도록 지시합니다. 또한 Drupal 컨테이너가 항상 MySQL 컨테이너 다음에 시작되도록 합니다. Drupal은 내부 네트워크를 사용하여 MySQL과 연결하고 외부 네트워크를 사용하여 다른 컨테이너에 노출합니다. 또한 Drupal이 컨테이너의/var/www/html디렉토리를 가리키도록 명명된 볼륨을 만들었습니다.
여기서는 Docker 허브에서 최신 mysql:8.0 이미지를 가져옵니다. 우리는 최신 태그를 사용하는 대신 8.x 버전을 사용하고 있습니다. 이렇게 하면 Drupal과 함께 작동하는 안정적이고 테스트된 MySQL 버전을 사용할 수 있습니다. 로그를 중지, 시작 및 보기 위해 Docker 명령과 함께 사용할 수 있는 컨테이너의 이름을 설정했습니다. 컨테이너는 수동으로 중지하지 않는 한 계속 실행됩니다. MySQL 자격 증명으로 채울.env파일을 정의했습니다. 또한 명명된 볼륨db-data를 컨테이너의/var/lib/mysql디렉토리에 마운트했습니다. MySQL 서비스는 내부 네트워크를 사용하여 drupal과 연결합니다.
$ sudo ufw enable Command may disrupt existing ssh connections. Proceed with operation (y|n)? y Firewall is active and enabled on system startup
$ sudo ufw allow http $ sudo ufw allow https
$ sudo ufw allow OpenSSH
Status: inactive
$ sudo ufw status
첫 번째 단계는 방화벽을 구성하는 것입니다. 우분투는 기본적으로 ufw(복잡하지 않은 방화벽)와 함께 제공됩니다.
이 튜토리얼은 Ubuntu 22.04 서버에서 Docker를 사용하여 Drupal을 설치하는 방법을 알려줍니다. Drupal은 PHP 8.2 및 MySQL과 함께 작동합니다. 버전 9부터 PostgreSQL도 지원하지만 몇 가지 버그가 있습니다. 따라서 튜토리얼에서는 MySQL을 계속 사용할 것입니다. Docker Compose를 사용하여 Drupal을 Nginx 및 Certbot 도구와 통합하여 안전한 HTTPS 프로토콜에서 사이트 Drupal 웹 사이트를 서버로 만들 것입니다.