Drupal là một hệ thống quản lý nội dung (CMS) mã nguồn mở được viết bằng PHP. Nhiều tổ chức trên toàn thế giới sử dụng nó để tạo blog, trang web chính phủ, trang web công ty, v.v. Nó đi kèm với một bộ tính năng và mô-đun ngày càng tăng để mở rộng chức năng của nó, cho phép bạn tạo bất kỳ trang web nào bạn muốn.
Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt Drupal bằng Docker trên máy chủ Ubuntu 22.04. Drupal hoạt động với PHP 8.2 và MySQL. Nó cũng hỗ trợ PostgreSQL kể từ phiên bản 9 nhưng có một số lỗi. Do đó, chúng tôi sẽ sử dụng MySQL cho hướng dẫn của mình. Chúng tôi sẽ sử dụng Docker Compose để tích hợp Drupal với Nginx và công cụ Certbot để phục vụ một trang web Drupal trên giao thức HTTPS an toàn.
[*]
Cài đặt các gói tiện ích cơ bản. Một số trong số chúng có thể đã được cài đặt.
Kiểm tra xem tường lửa có đang chạy không.
Bạn sẽ nhận được kết quả sau.
Cho phép cổng SSH để tường lửa không làm gián đoạn kết nối hiện tại khi bật nó.
Cũng cho phép các cổng HTTP và HTTPS.
Bật Tường lửa
Kiểm tra trạng thái của tường lửa một lần nữa.
Bạn sẽ thấy đầu ra tương tự.
Tạo tệp kho lưu trữ Docker.
Cập nhật kho lưu trữ hệ thống danh sách.
Cài đặt phiên bản mới nhất của Docker.
Xác minh rằng đó là đang chạy.
Theo mặc định, Docker yêu cầu quyền root. Nếu bạn muốn tránh sử dụng
Bạn sẽ cần phải đăng xuất khỏi máy chủ và đăng nhập lại với cùng một người dùng để kích hoạt thay đổi này hoặc sử dụng lệnh sau lệnh.
Xác nhận rằng người dùng của bạn đã được thêm vào nhóm Docker.
Chuyển sang thư mục.
Tạo và mở
Dán mã sau vào nó.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Chúng ta hãy xem qua từng dịch vụ được xác định trong tệp trên.
Tạo và mở tệp cho Nginx.
Dán mã sau vào đó.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Trong tệp này, chúng tôi sẽ thêm một khối máy chủ có các chỉ thị cho tên máy chủ và gốc tài liệu của chúng tôi, cùng với các khối vị trí để hướng yêu cầu của máy khách Certbot về chứng chỉ, xử lý PHP và yêu cầu tài sản tĩnh. Hiện tại, Nginx sẽ chỉ lắng nghe trên cổng 80 để cho phép Certbot yêu cầu chứng chỉ dàn dựng bằng cách đặt một tệp tạm thời trong thư mục
Kiểm tra trạng thái của dịch vụ.
Bộ chứa Certbot thoát thành công sau khi tạo chứng chỉ. Kiểm tra vị trí của các chứng chỉ trong vùng chứa Nginx.
Bạn sẽ nhận được kết quả đầu ra sau.
Điều này xác nhận rằng mọi thứ đều thành công. Bước tiếp theo là tạo chứng chỉ thực tế.
Mở tệp
Thay thế Cờ
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Chạy lại lệnh
Bạn sẽ nhận được kết quả sau.
Dừng Nginx máy chủ.
Tạo tệp Nginx mới để cấu hình SSL và mở tệp đó để chỉnh sửa.
Dán mã sau vào nó.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Khối HTTP chỉ định vị trí cho plugin webroot của Certbot và chuyển hướng bất kỳ yêu cầu HTTP nào sang HTTPS.
Bước tiếp theo là đảm bảo rằng vùng chứa Nginx lắng nghe cổng 443. Mở
Trong phần Nginx của tệp, hãy thực hiện các thay đổi để hiển thị 443 và bật SSL như được hiển thị bên dưới.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Bây giờ chúng ta đã bật và thêm cấu hình SSL cho Nginx, bạn có thể xóa tệp cấu hình HTTP cũ hơn.
Trước khi khởi động lại Nginx, chúng ta cần tạo chứng chỉ nhóm Diffie-Hellman mà chúng ta đã cấu hình ở trên.
Tạo lại Nginx container.
Kiểm tra trạng thái của các container.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22417%22%3E%3C/svg%3E
Nhấp vào nút Lưu và tiếp tục để tiếp tục đến trang hồ sơ Cài đặt.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22413%22%3E%3C/svg%3E
Chúng tôi sẽ tuân thủ theo cấu hình Chuẩn. Nhấp vào nút Lưu và tiếp tục để chuyển đến trang cấu hình cơ sở dữ liệu.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22682%22%20height=%22750%22%3E%3C/svg%3E
Điền thông tin xác thực cơ sở dữ liệu mà chúng tôi đã sử dụng trong tệp môi trường, mở rộng phần Tùy chọn nâng cao và nhập
Nhấp vào nút Lưu và tiếp tục để tiếp tục. Drupal sẽ bắt đầu cài đặt các mô-đun và chủ đề mặc định.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22398%22%3E%3C/svg%3E
Tiếp theo, bạn sẽ được đưa đến trang cấu hình Drupal. Điền tên trang web, email, tên người dùng, mật khẩu và cài đặt khu vực. Nhấp vào nút Lưu và tiếp tục khi bạn hoàn tất.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22455%22%20height=%22750%22%3E%3C/svg%3E
Cuối cùng, bạn sẽ được đưa đến bảng điều khiển Drupal. Bạn có thể bắt đầu sử dụng Drupal để tạo trang web của mình.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22362%22%3E%3C/svg%3E
Đăng nhập vào shell SSH của vùng chứa MySQL.
Mở shell MySQL bằng người dùng root.
Chạy lệnh sau để thay đổi mức độ giao dịch trên toàn cầu.
Thoát khỏi shell MySQL và vùng chứa bằng cách nhập
Bước tiếp theo là nhập tên miền của bạn làm máy chủ đáng tin cậy để bảo vệ chống lại các cuộc tấn công HTTP HOST Header. Để thực hiện việc này, chúng ta cần chỉnh sửa tệp
Sao chép tệp cài đặt từ vùng chứa vào máy chủ.
Tệp ở chế độ chỉ đọc. Cấp quyền ghi cho nó.
Mở tệp để chỉnh sửa.
Tìm phần sau trong tệp.
Bỏ chú thích bằng cách xóa dấu thăng và thêm tên miền Drupal của bạn như hiển thị bên dưới.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Xóa quyền ghi một lần nữa.
Sao chép tệp trở lại bên trong vùng chứa.
Tạo thư mục để sao lưu.
Sử dụng lệnh sau để sao lưu cơ sở dữ liệu Drupal. Bạn sẽ được yêu cầu nhập mật khẩu gốc MySQL của mình.
Lệnh trên sẽ tạo bản sao lưu SQL trong thư mục
Kiểm tra thư mục nội dung.
Bạn có thể thấy cơ sở dữ liệu được sao lưu trong thư mục. Bạn có thể khôi phục cơ sở dữ liệu này bằng công cụ phpMyAdmin hoặc bằng lệnh sau.
Bạn có thể tạo một công việc cron để sao lưu cơ sở dữ liệu thường xuyên.
Tạo tập lệnh sao lưu trong thư mục
Dán mã sau vào đó.
Lưu tệp bằng cách nhấn Ctrl + X và nhập Y khi được nhắc.
Tạo tập lệnh có thể thực thi.
Bây giờ, cơ sở dữ liệu của bạn sẽ được sao lưu hàng ngày.
Sau đó, chuyển sang thư mục.
Dừng Container.
Kéo container mới nhất images.
Nếu bạn muốn nâng cấp lên phiên bản chính tiếp theo, bạn sẽ cần điều chỉnh tên image cho phù hợp và xem qua các ghi chú phát hành của Drupal để kiểm tra mọi sự cố.
Thực hiện bất kỳ thay đổi nào bạn cần trong
Khởi động lại các container Drupal. Thao tác này cũng sẽ kéo các hình ảnh mới nhất cho các phiên bản nhỏ hơn của các gói khác.
Hướng dẫn này sẽ hướng dẫn bạn cách cài đặt Drupal bằng Docker trên máy chủ Ubuntu 22.04. Drupal hoạt động với PHP 8.2 và MySQL. Nó cũng hỗ trợ PostgreSQL kể từ phiên bản 9 nhưng có một số lỗi. Do đó, chúng tôi sẽ sử dụng MySQL cho hướng dẫn của mình. Chúng tôi sẽ sử dụng Docker Compose để tích hợp Drupal với Nginx và công cụ Certbot để phục vụ một trang web Drupal trên giao thức HTTPS an toàn.
Điều kiện tiên quyết
-
Một máy chủ chạy Ubuntu 22.04 với tối thiểu 1GB RAM cho các cộng đồng nhỏ hơn. Để lưu trữ các cộng đồng lớn hơn, bạn nên có một máy chủ có ít nhất 2GB RAM trở lên.
-
Người dùng không phải root có quyền sudo.
-
Tên miền đủ điều kiện (FQDN) trỏ đến máy chủ của bạn. Đối với mục đích của chúng tôi, chúng tôi sẽ sử dụngexample.com
làm tên miền.
-
Đảm bảo mọi thứ đã được cập nhật.
Mã:
$ sudo apt update
Cài đặt các gói tiện ích cơ bản. Một số trong số chúng có thể đã được cài đặt.
Mã:
$ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y
Bước 1 - Cấu hình Tường lửa
Bước đầu tiên là cấu hình tường lửa. Ubuntu đi kèm với ufw (Uncomplicated Firewall) theo mặc định.Kiểm tra xem tường lửa có đang chạy không.
Mã:
$ sudo ufw status
Mã:
Status: inactive
Mã:
$ sudo ufw allow OpenSSH
Mã:
$ sudo ufw allow http
$ sudo ufw allow https
Mã:
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Mã:
$ sudo ufw status
Mã:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80/tcp ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80/tcp (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
Bước 2 - Cài đặt Docker và Docker Compose
Ubuntu 22.04 đi kèm với phiên bản Docker cũ hơn. Để cài đặt phiên bản mới nhất, trước tiên, hãy nhập khóa GPG của Docker.
Mã:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Mã:
$ echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Mã:
$ sudo apt update
Mã:
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Mã:
$ sudo systemctl status docker
? docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sat 2023-01-14 10:41:35 UTC; 2min 1s ago
TriggeredBy: ? docker.socket Docs: https://docs.docker.com Main PID: 2054 (dockerd) Tasks: 52 Memory: 22.5M CPU: 248ms CGroup: /system.slice/docker.service ?? 2054 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
sudo
mỗi khi bạn chạy lệnh docker
, hãy thêm tên người dùng của bạn vào docker
nhóm.
Mã:
$ sudo usermod -aG docker $(whoami)
Mã:
$ su - ${USER}
Mã:
$ groups
navjot wheel docker
Bước 3 - Tạo tệp Docker Compose cho Drupal
Tạo thư mục cho Drupal.
Mã:
$ mkdir ~/drupal
Mã:
$ cd ~/drupal
docker-compose.yml
tệp để chỉnh sửa.
Mã:
$ nano docker-compose.yml
Mã:
services: mysql: image: mysql:8.0 container_name: mysql restart: unless-stopped env_file: .env volumes: - db-data:/var/lib/mysql networks: - internal drupal: image: drupal:10-fpm-alpine container_name: drupal depends_on: - mysql restart: unless-stopped networks: - internal - external volumes: - drupal-data:/var/www/html webserver: image: nginx:1.22.1-alpine container_name: webserver depends_on: - drupal restart: unless-stopped ports: - 80:80 volumes: - drupal-data:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt networks: - external certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - drupal-data:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email sammy@your_domain --agree-tos --no-eff-email --staging -d example.com -d www.example.com
networks: external: driver: bridge internal: driver: bridge
volumes: drupal-data: db-data: certbot-etc:
Chúng ta hãy xem qua từng dịch vụ được xác định trong tệp trên.
Dịch vụ MySQL Docker
Ở đây chúng ta đang kéo hình ảnh mysql:8.0 mới nhất từ trung tâm Docker. Chúng ta đang sử dụng phiên bản 8.x thay vì sử dụng thẻ mới nhất. Theo cách này, chúng ta có thể sử dụng phiên bản ổn định và đã được thử nghiệm của MySQL hoạt động với Drupal. Chúng tôi đã đặt tên cho container, có thể sử dụng với lệnh Docker để dừng, bắt đầu và xem nhật ký. Container sẽ tiếp tục chạy trừ khi dừng thủ công. Chúng tôi đã định nghĩa tệp.env
mà chúng tôi sẽ điền thông tin xác thực MySQL. Chúng tôi cũng đã gắn một ổ đĩa có tên db-data
vào thư mục /var/lib/mysql
trên vùng chứa. Dịch vụ MySQL sẽ sử dụng mạng nội bộ để kết nối với drupal.Dịch vụ Drupal
Chúng tôi đang sử dụngHình ảnh Alpine Drupal 10. Hình ảnh Alpine Docker có kích thước nhỏ hơn. Hình ảnh này cũng chứa PHP-FPM để xử lý PHP. Điều này sẽ hoạt động cùng với Nginx để phục vụ trang web. Tùy chọndepends_on
yêu cầu Drupal kết nối với dịch vụ MySQL. Tùy chọn này cũng đảm bảo rằng vùng chứa Drupal sẽ luôn khởi động sau vùng chứa MySQL. Drupal sử dụng mạng nội bộ để kết nối với MySQL và mạng bên ngoài để tự hiển thị với các vùng chứa khác. Chúng tôi cũng đã tạo một ổ đĩa được đặt tên cho Drupal để trỏ đến thư mục /var/www/html
trong vùng chứa.Dịch vụ Nginx
Chúng tôi đang sử dụng Hình ảnh Alpine cho Nginx. Nó hiển thị cổng 80 cho máy chủ. Chúng tôi sử dụng hai ổ đĩa được đặt tên, một cho thư mục công khai của Drupal và ổ đĩa còn lại để lưu trữ chứng chỉ SSL Let's Encrypt. Ổ đĩa thứ ba là bind mount đến thư mục cấu hình Nginx trên máy chủ mà chúng tôi sẽ định nghĩa sau. Nginx cũng kết nối với mạng Docker bên ngoài để trang web Drupal hoạt động.Dịch vụ Certbot
Và cuối cùng, chúng tôi kéo hình ảnh Certbot để cài đặt chứng chỉ SSL. Nó chia sẻ các ổ đĩa của mình với dịch vụ Nginx để lấy chứng chỉ và định nghĩa webroot. Chúng tôi cũng đã bao gồm một lệnh sẽ chạy khi vùng chứa được tạo. Ở đây, lệnh sử dụng cờ--staging
để lấy máy chủ thử nghiệm lần đầu tiên. Chúng tôi cần nginx để xác thực chứng chỉ nhưng Nginx sẽ không khởi động nếu chứng chỉ bị thiếu. Đây là lý do tại sao chúng ta sẽ tạo một chứng chỉ dàn dựng, sử dụng chứng chỉ đó để khởi động Nginx, sau đó tạo các chứng chỉ thực.Bước 4 - Tạo cấu hình Nginx
Tạo thư mục để cấu hình Nginx.
Mã:
$ mkdir nginx-conf
Mã:
$ nano nginx-conf/drupal.conf
Mã:
server { listen 80; listen [::]:80; server_name drupal.example.com; index index.php index.html index.htm; root /var/www/html; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { try_files $uri $uri/ /index.php$is_args$args; } rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass drupal:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; }
}
Trong tệp này, chúng tôi sẽ thêm một khối máy chủ có các chỉ thị cho tên máy chủ và gốc tài liệu của chúng tôi, cùng với các khối vị trí để hướng yêu cầu của máy khách Certbot về chứng chỉ, xử lý PHP và yêu cầu tài sản tĩnh. Hiện tại, Nginx sẽ chỉ lắng nghe trên cổng 80 để cho phép Certbot yêu cầu chứng chỉ dàn dựng bằng cách đặt một tệp tạm thời trong thư mục
/var/www/html/.well-known/acme-challenge
để xác thực DNS. Điều này cho phép chúng ta sử dụng Certbot với plugin webroot.Bước 5 - Tạo chứng chỉ SSL
Để tạo chứng chỉ SSL, chúng ta sẽ khởi động các container của mình. Chứng chỉ dàn dựng chính xác sẽ có sẵn tại thư mục/etc/letsencrypt/live
trong vùng chứa Nginx.
Mã:
$ docker compose up -d
Mã:
$ 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
Mã:
$ docker compose exec webserver ls -la /etc/letsencrypt/live
Mã:
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
Mở tệp
docker-compose.yml
để chỉnh sửa.
Mã:
$ nano docker-compose.yml
--staging
trong phần dịch vụ Certbot và thay thế bằng cờ --force-renewal
. Cờ này yêu cầu Certbot yêu cầu chứng chỉ mới cho tên miền của bạn. Cờ gia hạn được sử dụng vì cờ này sẽ được dùng để gia hạn chứng chỉ từ đây trở đi.
Mã:
certbot: depends_on: - webserver image: certbot/certbot container_name: certbot volumes: - certbot-etc:/etc/letsencrypt - drupal-data:/var/www/html command: certonly --webroot --webroot-path=/var/www/html --email [emailprotected] --agree-tos --no-eff-email --staple-ocsp --force-renewal -d drupal.example.com
Chạy lại lệnh
docker compose up
để tạo lại vùng chứa Certbot. Cờ --no-deps
yêu cầu Certbot bỏ qua việc khởi động vùng chứa webserver
vì nó đã đang chạy.
Mã:
$ docker compose up --force-recreate --no-deps certbot
Mã:
[+] Running 1/0 ? Container certbot Recreated 0.1s
Attaching to certbot
certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log
certbot | Account registered.
certbot | Renewing an existing certificate for drupal.example.com
certbot |
certbot | Successfully received certificate.
certbot | Certificate is saved at: /etc/letsencrypt/live/drupal.example.com/fullchain.pem
certbot | Key is saved at: /etc/letsencrypt/live/drupal.example.com/privkey.pem
certbot | This certificate expires on 2023-04-17.
certbot | These files will be updated when the certificate renews.
certbot | NEXT STEPS:
certbot | - The certificate will need to be renewed before it expires. Certbot can automatically renew the certificate in the background, but you may need to take steps to enable that functionality. See https://certbot.org/renewal-setup for instructions.
certbot |
certbot | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
certbot | If you like Certbot, please consider supporting our work by:
certbot | * Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
certbot | * Donating to EFF: https://eff.org/donate-le
certbot | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
certbot exited with code 0
Bước 6 - Cấu hình Nginx cho SSL
Bây giờ chứng chỉ của chúng tôi đã hoạt động, chúng tôi cần cấu hình Nginx để phục vụ chúng và chuyển hướng các yêu cầu HTTP sang HTTPS.Dừng Nginx máy chủ.
Mã:
$ docker stop webserver
Mã:
$ nano nginx-conf/drupal-ssl.conf
Mã:
server { listen 80; listen [::]:80; server_name drupal.example.com; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { rewrite ^ https://$host$request_uri? permanent; }
}
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name drupal.example.com; index index.php index.html index.htm; root /var/www/html; server_tokens off; ssl_certificate /etc/letsencrypt/live/drupal.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/drupal.example.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/drupal.example.com/chain.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_ecdh_curve secp384r1; ssl_dhparam /etc/ssl/certs/dhparam.pem; # OCSP stapling ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; location / { try_files $uri $uri/ /index.php$is_args$args; } rewrite ^/core/authorize.php/core/authorize.php(.*)$ /core/authorize.php$1; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass drupal:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; }
}
Khối HTTP chỉ định vị trí cho plugin webroot của Certbot và chuyển hướng bất kỳ yêu cầu HTTP nào sang HTTPS.
Bước tiếp theo là đảm bảo rằng vùng chứa Nginx lắng nghe cổng 443. Mở
docker-compose.yml
tệp để chỉnh sửa.
Mã:
$ nano docker-compose.yml
Mã:
webserver: image: nginx:1.22.1-alpine container_name: webserver depends_on: - drupal restart: unless-stopped ports: - 80:80 - 443:443 volumes: - drupal-data:/var/www/html - ./nginx-conf:/etc/nginx/conf.d - certbot-etc:/etc/letsencrypt - /etc/ssl/certs/dhparam.pem:/etc/ssl/certs/dhparam.pem networks: - external
Bây giờ chúng ta đã bật và thêm cấu hình SSL cho Nginx, bạn có thể xóa tệp cấu hình HTTP cũ hơn.
Mã:
$ rm nginx-conf/drupal.conf
Mã:
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Mã:
$ docker compose up -d --force-recreate --no-deps webserver
Mã:
$ 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
Bước 7 - Khởi động Trình cài đặt web Drupal
Đã đến lúc khởi động trình cài đặt web Drupal. Mở URLhttps://drupal.example.com
trong trình duyệt của bạn và bạn sẽ nhận được màn hình sau.data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22417%22%3E%3C/svg%3E
Nhấp vào nút Lưu và tiếp tục để tiếp tục đến trang hồ sơ Cài đặt.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22413%22%3E%3C/svg%3E
Chúng tôi sẽ tuân thủ theo cấu hình Chuẩn. Nhấp vào nút Lưu và tiếp tục để chuyển đến trang cấu hình cơ sở dữ liệu.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22682%22%20height=%22750%22%3E%3C/svg%3E
Điền thông tin xác thực cơ sở dữ liệu mà chúng tôi đã sử dụng trong tệp môi trường, mở rộng phần Tùy chọn nâng cao và nhập
mysql
làm máy chủ cơ sở dữ liệu. Tên này khớp với tên của dịch vụ MySQL trong tệp Docker compose mà Drupal cần kết nối.Nhấp vào nút Lưu và tiếp tục để tiếp tục. Drupal sẽ bắt đầu cài đặt các mô-đun và chủ đề mặc định.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22398%22%3E%3C/svg%3E
Tiếp theo, bạn sẽ được đưa đến trang cấu hình Drupal. Điền tên trang web, email, tên người dùng, mật khẩu và cài đặt khu vực. Nhấp vào nút Lưu và tiếp tục khi bạn hoàn tất.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22455%22%20height=%22750%22%3E%3C/svg%3E
Cuối cùng, bạn sẽ được đưa đến bảng điều khiển Drupal. Bạn có thể bắt đầu sử dụng Drupal để tạo trang web của mình.
data:image/svg+xml,%3Csvg%20xmlns=%22http://www.w3.org/2000/svg%22%20width=%22750%22%20height=%22362%22%3E%3C/svg%3E
Bước 8 - Cấu hình Drupal
Bước này là tùy chọn nhưng giúp cải thiện hiệu suất của Drupal. Bước đầu tiên là thiết lập mức cô lập giao dịch MySQL. Mức cô lập giao dịch mặc định cho MySQL, MariaDB và các cơ sở dữ liệu tương đương là "REPEATABLE READ". Thiết lập này với Drupal có thể dẫn đến tình trạng bế tắc trên các bảng, khiến trang web trở nên rất chậm hoặc không phản hồi. Mức độ cô lập giao dịch được khuyến nghị cho các trang web Drupal là 'ĐÃ ĐỌC ĐÃ CAM KẾT'.Đăng nhập vào shell SSH của vùng chứa MySQL.
Mã:
$ docker exec -it mysql bash
Mã:
bash-4.4# mysql -u root -p
Enter password:
Mã:
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
exit
hai lần.Bước tiếp theo là nhập tên miền của bạn làm máy chủ đáng tin cậy để bảo vệ chống lại các cuộc tấn công HTTP HOST Header. Để thực hiện việc này, chúng ta cần chỉnh sửa tệp
/var/www/html/sites/default/settings.php
bên trong vùng chứa Drupal. Vì chúng ta đang sử dụng một ổ đĩa được đặt tên cho các tệp Drupal, nên cách được khuyến nghị để thực hiện bất kỳ thay đổi nào là sao chép tệp từ vùng chứa vào máy chủ, thực hiện chỉnh sửa và sao chép lại vào vùng chứa. Bạn có thể thực hiện thao tác này với bất kỳ tệp nào bạn cần thay đổi bên trong cài đặt Drupal.Sao chép tệp cài đặt từ vùng chứa vào máy chủ.
Mã:
$ docker cp drupal:/var/www/html/sites/default/settings.php settings.php
Mã:
$ chmod+w settings.php
Mã:
$ nano settings.php
Mã:
#$settings['trusted_host_patterns'] = [
# '^www\.example\.com$',
#];
Mã:
$settings['trusted_host_patterns'] = [ '^drupal\.example\.com$',
];
Xóa quyền ghi một lần nữa.
Mã:
$ chmod -w settings.php
Mã:
$ docker cp settings.php drupal:/var/www/html/sites/default
Bước 9 - Sao lưu Drupal
Chúng ta sẽ sử dụng dòng lệnh để sao lưu cơ sở dữ liệu Drupal. Chuyển sang thư mục Drupal.
Mã:
$ cd ~/drupal
Mã:
$ mkdir backup-data
Mã:
$ 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
~/drupal/backup-data
.Kiểm tra thư mục nội dung.
Mã:
$ 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
Mã:
$ docker compose exec mysql sh -c "exec mysql -uroot -p" < backup-data/data_19-01-2023_13_36_58.sql
Tạo tập lệnh sao lưu trong thư mục
/etc/cron.daily
và mở nó để chỉnh sửa.
Mã:
$ sudo nano /etc/cron.daily/drupalbackup.sh
Mã:
#!/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
Tạo tập lệnh có thể thực thi.
Mã:
$ sudo chmod +x /etc/cron.daily/drupalbackup.sh
Bước 10 - Nâng cấp Drupal
Bước đầu tiên trong việc nâng cấp Drupal là sao lưu cơ sở dữ liệu Drupal bằng lệnh từ bước 9.Sau đó, chuyển sang thư mục.
Mã:
$ cd ~/drupal
Mã:
$ docker compose down
Mã:
$ docker compose pull drupal:10-fpm-alpine
Thực hiện bất kỳ thay đổi nào bạn cần trong
docker-compose.yml
nếu bạn muốn. Bạn có thể cập nhật các image còn lại bằng cách thay đổi định nghĩa của chúng trong tệp Docker compose.Khởi động lại các container Drupal. Thao tác này cũng sẽ kéo các hình ảnh mới nhất cho các phiên bản nhỏ hơn của các gói khác.
Mã:
$ docker compose up -d