Thứ bảy, 25/04/2020 | 00:00 GMT+7

Cách cài đặt Drupal với Docker Compose

Phiên bản WordPress root của hướng dẫn này được viết bởi Kathleen Juell .

Drupal là một hệ thống quản lý nội dung (CMS) được viết bằng PHP và được phân phối theo Giấy phép Công cộng GNU open-souce . Mọi người và tổ chức trên khắp thế giới sử dụng Drupal để cung cấp năng lượng cho các trang web chính phủ, blog cá nhân, doanh nghiệp, v.v. Điều làm cho Drupal trở nên độc đáo so với các khuôn khổ CMS khác là cộng đồng ngày càng phát triển và một tập hợp các tính năng bao gồm các quy trình an toàn, hiệu suất tin cậy , tính module và tính linh hoạt để thích ứng.

Drupal yêu cầu cài đặt ngăn xếp LAMP (Linux, Apache, MySQL và PHP) hoặc LEMP (Linux, Nginx, MySQL và PHP), nhưng việc cài đặt các thành phần riêng lẻ là một công việc tốn nhiều thời gian. Ta có thể sử dụng các công cụ như DockerDocker Compose để đơn giản hóa quá trình cài đặt Drupal. Hướng dẫn này sẽ sử dụng Docker image để cài đặt các thành phần riêng lẻ trong containers Docker. Bằng cách sử dụng Docker Compose, ta có thể xác định và quản lý nhiều containers cho database , ứng dụng và mạng / giao tiếp giữa chúng.

Trong hướng dẫn này, ta sẽ cài đặt Drupal bằng Docker Compose để ta có thể tận dụng khả năng chứa và triển khai trang web Drupal của ta trên các server . Ta sẽ chạy các containers cho sở dữ liệu MySQL , web server Nginx và Drupal. Ta cũng sẽ bảo mật cài đặt của bạn bằng cách lấy chứng chỉ TLS / SSL với Let's Encrypt cho domain ta muốn liên kết với trang web của bạn . Cuối cùng, ta sẽ cài đặt một công việc cron để gia hạn certificate của ta để domain của ta vẫn an toàn.

Yêu cầu

Để làm theo hướng dẫn này, ta cần :

  • Server chạy Ubuntu 18.04, cùng với user không phải root có quyền sudo và firewall đang hoạt động. Để được hướng dẫn về cách cài đặt những điều này, vui lòng xem hướng dẫn Cài đặt Server Ban đầu này.
  • Docker được cài đặt trên server của bạn, làm theo các Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 18.04 . Hướng dẫn này đã được thử nghiệm trên version 19.03.8.
  • Docker Compose được cài đặt trên server của bạn, làm theo Bước 1 của Cách cài đặt Docker Compose trên Ubuntu 18.04 . Hướng dẫn này đã được thử nghiệm trên version 1.21.2.
  • Tên domain đã đăng ký. Hướng dẫn này sẽ sử dụng your_domain xuyên suốt. Bạn có thể nhận một miễn phí tại Freenom hoặc sử dụng công ty đăng ký domain mà bạn chọn.
  • Cả hai bản ghi DNS sau được cài đặt cho server của bạn. Bạn có thể theo dõi phần giới thiệu này về DigitalOcean DNS để biết chi tiết về cách thêm chúng vào account DigitalOcean, nếu đó là những gì bạn đang sử dụng:
    • Một bản ghi với your_domain trỏ đến địa chỉ IP công cộng của server của bạn.
    • Một bản ghi A với www. your_domain trỏ đến địa chỉ IP công cộng của server của bạn.

Bước 1 - Xác cấu hình web server

Trước khi chạy bất kỳ containers nào, ta cần xác cấu hình cho web server Nginx của bạn . Tệp cấu hình của ta sẽ bao gồm một số khối vị trí dành riêng cho Drupal, cùng với khối vị trí để hướng các yêu cầu xác minh Let's Encrypt tới ứng dụng client Certbot để gia hạn certificate tự động.

Đầu tiên, hãy tạo một folder dự án cho cài đặt Drupal có tên là drupal :

  • mkdir drupal

Di chuyển vào folder mới tạo:

  • cd drupal

Bây giờ ta có thể tạo một folder cho file cấu hình của bạn :

  • mkdir nginx-conf

Mở file bằng nano hoặc editor yêu thích của bạn:

  • nano nginx-conf/nginx.conf

Trong file này, ta sẽ thêm một khối server với các lệnh cho tên server và root tài liệu của ta cũng như các khối vị trí để định hướng yêu cầu của ứng dụng client Certbot đối với certificate , PHP processor và các yêu cầu nội dung tĩnh.

Thêm mã sau vào file . Đảm bảo thay thế your_domain bằng domain của bạn :

~ / drupal / nginx-conf / nginx.conf
server {     listen 80;     listen [::]:80;      server_name your_domain www.your_domain;      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;     } } 

Khối server của ta bao gồm các thông tin sau:

Chỉ thị:

  • listen : Đây nói với Nginx để lắng nghe trên cổng 80 , mà sẽ cho phép ta sử dụng Certbot của Plugin webroot cho các yêu cầu giấy chứng nhận của ta . Lưu ý ta chưa bao gồm cổng 443 — ta sẽ cập nhật cấu hình của bạn để bao gồm SSL khi ta đã lấy được certificate thành công.

  • server_name : Điều này xác định tên server của ta và khối server sẽ được sử dụng cho các yêu cầu tới server của ta . Đảm bảo thay thế your_domain trong dòng này bằng domain của bạn .

  • index : Chỉ thị index xác định các file sẽ được sử dụng làm index khi xử lý các yêu cầu đến server của ta . Ta đã sửa đổi thứ tự ưu tiên mặc định ở đây, di chuyển index.php trước index.html để Nginx ưu tiên các file được gọi là index.php khi có thể.

  • root : Chỉ thị root của ta đặt tên cho folder root cho các yêu cầu tới server của ta . Thư mục này, /var/www/html , được tạo như một điểm mount tại thời điểm xây dựng bằng các hướng dẫn trong Drupal Dockerfile của ta . Các hướng dẫn Dockerfile này cũng đảm bảo các file từ bản phát hành Drupal được gắn vào ổ đĩa này.

  • rewrite : Nếu biểu thức chính quy được chỉ định ( ^/core/authorize.php/core/authorize.php(.*)$ ) trùng với một URI yêu cầu, thì URI được thay đổi như được chỉ định trong chuỗi thay thế ( /core/authorize.php$1 ).

Khối vị trí:

  • location ~ /.well-known/acme-challenge : Khối vị trí này sẽ xử lý các yêu cầu .well-known folder .well .well-known , nơi Certbot sẽ đặt một file tạm thời để xác thực rằng DNS cho domain của ta phân giải tới server của ta . Với cấu hình này, ta sẽ có thể sử dụng plugin webroot của Certbot để lấy certificate cho domain của ta .

  • location / : Trong khối vị trí này, ta sẽ sử dụng lệnh try_files để kiểm tra các file phù hợp với các yêu cầu URI riêng lẻ. Tuy nhiên, thay vì trả về trạng thái 404 Not Found làm mặc định, ta sẽ chuyển quyền kiểm soát đến index.php của Drupal với các đối số yêu cầu.

  • location ~ \.php$ : Khối vị trí này sẽ xử lý quá trình PHP processor và ủy quyền các yêu cầu này tới containers drupal của ta . Vì hình ảnh Drupal Docker của ta sẽ dựa trên hình ảnh php:fpm , ta cũng sẽ bao gồm các tùy chọn cấu hình dành riêng cho giao thức FastCGI trong khối này. Nginx yêu cầu một PHP processor độc lập cho các yêu cầu PHP: trong trường hợp của ta , các yêu cầu này sẽ được xử lý bởi bộ xử lý php-fpm bao gồm trong hình ảnh php:fpm . Ngoài ra, khối vị trí này bao gồm các chỉ thị, biến và tùy chọn dành riêng cho FastCGI sẽ ủy quyền các yêu cầu tới ứng dụng Drupal đang chạy trong containers Drupal của ta , đặt index ưu tiên cho URI yêu cầu được phân tích cú pháp và phân tích cú pháp các yêu cầu URI.

  • location ~ /\.ht : Khối này sẽ xử lý các .htaccess vì Nginx sẽ không phân phát chúng. Chỉ thị deny_all đảm bảo các .htaccess sẽ không bao giờ được cung cấp cho user .

  • location = /favicon.ico, location = /robots.txt : Các khối này đảm bảo các yêu cầu đến /favicon.ico/robots.txt sẽ không được ghi lại.

  • location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ : Khối này tắt ghi log cho các yêu cầu nội dung tĩnh và đảm bảo những nội dung này có khả năng lưu vào bộ nhớ cache cao, vì chúng thường đắt tiền để phân phát.

Để biết thêm thông tin về FastCGI proxy, hãy xem Hiểu và triển khai FastCGI Proxying trong Nginx . Để biết thông tin về khối server và vị trí, hãy xem Tìm hiểu về server Nginx và các thuật toán lựa chọn khối vị trí .

Lưu file khi bạn hoàn tất chỉnh sửa.

Với cấu hình Nginx của bạn tại chỗ, bạn có thể chuyển sang tạo các biến môi trường để chuyển đến ứng dụng và containers database của bạn trong thời gian chạy.

Bước 2 - Xác định các biến môi trường

Ứng dụng Drupal của ta cần một database (MySQL, PostgresSQL, v.v.) để lưu thông tin liên quan đến trang web. Vùng chứa Drupal cần quyền truy cập vào các biến môi trường nhất định trong thời gian chạy để truy cập containers database (MySQL). Các biến này chứa thông tin nhạy cảm như thông tin đăng nhập của database , vì vậy ta không thể hiển thị chúng trực tiếp trong file Docker Compose — file chính chứa thông tin về cách các containers của ta sẽ chạy.

Bạn nên đặt các giá trị nhạy cảm trong file .env và hạn chế lưu hành file . Điều này sẽ ngăn các giá trị này sao chép vào kho dự án của ta và bị lộ công khai.

Trong folder chính của dự án, ~/drupal , hãy tạo và mở một file có tên .env :

  • nano .env

Thêm các biến sau vào file .env , thay thế các phần được đánh dấu bằng thông tin đăng nhập bạn muốn sử dụng:

~ / drupal / .env
MYSQL_ROOT_PASSWORD=root_password MYSQL_DATABASE=drupal MYSQL_USER=drupal_database_user MYSQL_PASSWORD=drupal_database_password 

Bây giờ ta đã thêm password cho account quản trị root MySQL, cũng như tên user và password ưa thích cho database ứng dụng của ta .

.env của ta chứa thông tin nhạy cảm vì vậy ta luôn khuyên bạn nên đưa nó vào file .gitignore.dockerignore của dự án để nó không được thêm vào repository Git và Docker image của ta .

Nếu bạn định làm việc với Git để kiểm soát version , hãy khởi tạo folder làm việc hiện tại của bạn dưới dạng repository với git init :

  • git init

Mở file .gitignore :

  • nano .gitignore

Thêm những điều sau:

~ / drupal / .gitignore
.env 

Lưu và thoát khỏi file .

Tương tự, mở file .dockerignore :

  • nano .dockerignore

Sau đó thêm những thứ sau:

~ / drupal / .dockerignore
.env .git 

Lưu và thoát khỏi file .

Bây giờ ta đã thực hiện các biện pháp để bảo vệ thông tin đăng nhập của bạn dưới dạng các biến môi trường, hãy chuyển sang bước tiếp theo của ta là xác định các dịch vụ của ta trong file docker-compose.yml .

Bước 3 - Xác định Dịch vụ với Docker Compose

Docker Compose là một công cụ để xác định và chạy các ứng dụng Docker nhiều containers . Ta xác định một tệp YAML để cấu hình các dịch vụ của ứng dụng của ta . Một dịch vụ trong Docker Compose là một containers đang chạy và Compose cho phép ta liên kết các dịch vụ này với nhau với dung lượng và mạng được chia sẻ.

Ta sẽ tạo các containers khác nhau cho ứng dụng Drupal, database và web server của ta . Cùng với những điều này, ta cũng sẽ tạo một containers để chạy Certbot nhằm lấy certificate cho web server của ta .

Tạo file docker-compose.yml :

  • nano docker-compose.yml

Thêm mã sau để xác định version file Soạn và dịch vụ database mysql :

~ / drupal / docker -omp.yml
version: "3"  services:   mysql:     image: mysql:8.0     container_name: mysql     command: --default-authentication-plugin=mysql_native_password     restart: unless-stopped     env_file: .env     volumes:       - db-data:/var/lib/mysql     networks:       - internal 

Ta hãy xem xét từng cái một với tất cả các tùy chọn cấu hình của dịch vụ mysql :

  • image : Điều này chỉ định hình ảnh sẽ được sử dụng / kéo để tạo containers . Bạn nên sử dụng hình ảnh với thẻ version thích hợp, ngoại trừ thẻ latest để tránh xung đột trong tương lai. Đọc thêm về các phương pháp hay nhất của Dockerfile từ tài liệu Docker.

  • container_name : Để xác định tên của containers .

  • command này được sử dụng để overrides lệnh mặc định (lệnh CMD) trong hình ảnh. MySQL đã hỗ trợ các plugin xác thực khác nhau, nhưng mysql_native_password là phương pháp truyền thống để xác thực. Vì PHP và do đó là Drupal, sẽ không hỗ trợ xác thực MySQL mới hơn , nên ta cần đặt --default-authentication-plugin=mysql_native_password làm cơ chế xác thực mặc định.

  • restart : Điều này được sử dụng để xác định policy khởi động lại containers . Chính sách unless-stopped khởi động lại containers trừ khi nó bị dừng theo cách thủ công.

  • env_file : Điều này thêm các biến môi trường từ một file . Trong trường hợp của ta , nó sẽ đọc các biến môi trường từ file .env được xác định ở bước trước.

  • volumes : Cái này mount các đường dẫn server hoặc các volume đã đặt tên, được chỉ định làm tùy chọn con cho một dịch vụ. Ta đang gắn một ổ đĩa được đặt tên là db-data vào folder /var/lib/mysql trên containers , nơi MySQL theo mặc định sẽ ghi các file dữ liệu của nó.

  • networks : Điều này xác định mạng internal mà dịch vụ ứng dụng của ta sẽ tham gia. Ta sẽ xác định các mạng ở cuối file .

Ta đã xác định định nghĩa dịch vụ mysql của bạn , vì vậy bây giờ hãy thêm định nghĩa của dịch vụ ứng dụng drupal vào cuối file :

~ / drupal / docker -omp.yml
...   drupal:     image: drupal:8.7.8-fpm-alpine     container_name: drupal     depends_on:       - mysql     restart: unless-stopped     networks:       - internal       - external     volumes:       - drupal-data:/var/www/html 

Trong định nghĩa dịch vụ này, ta đang đặt tên cho containers của bạn và xác định policy khởi động lại, như ta đã làm với dịch vụ mysql . Ta cũng đang thêm một số tùy chọn cụ thể cho containers này:

  • image : Ở đây, ta đang sử dụng hình ảnh Drupal 8.7.8-fpm-alpine . Hình ảnh này có bộ xử lý php-fpm mà web server Nginx của ta yêu cầu để PHP processor . Hơn nữa, ta đang sử dụng hình ảnh alpine , có nguồn root từ dự án Alpine Linux , điều này sẽ giảm kích thước của hình ảnh tổng thể và được khuyến khích trong các phương pháp hay nhất của Dockerfile . Drupal có nhiều version hình ảnh hơn, vì vậy hãy xem chúng trên Dockerhub .

  • depends_on : Điều này được sử dụng để thể hiện dependencies giữa các dịch vụ. Việc xác định dịch vụ mysql làm phần phụ thuộc vào containers drupal của ta sẽ đảm bảo containers drupal của ta sẽ được tạo sau containers mysql và cho phép ứng dụng của ta khởi động trơn tru.

  • networks : Ở đây, ta đã thêm containers này vào mạng external cùng với mạng internal . Điều này sẽ đảm bảo dịch vụ mysql của ta chỉ có thể truy cập được từ containers drupal thông qua mạng internal trong khi vẫn giữ containers này có thể truy cập được với các containers khác thông qua mạng external .

  • volumes : Ta đang gắn một volume có tên là drupal-data vào mountpoint /var/www/html được tạo bởi hình ảnh Drupal . Sử dụng một ổ đĩa được đặt tên theo cách này sẽ cho phép ta chia sẻ mã ứng dụng của bạn với các containers khác.

Tiếp theo, hãy thêm định nghĩa dịch vụ Nginx sau định nghĩa dịch vụ drupal :

~ / drupal / docker -omp.yml
...   webserver:     image: nginx:1.17.4-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 

, ta đặt tên cho containers của bạn và làm cho nó phụ thuộc vào containers Drupal theo thứ tự bắt đầu. Ta cũng đang sử dụng hình ảnh núi cao — hình ảnh Nginx 1.17.4-alpine .

Định nghĩa dịch vụ này cũng bao gồm các tùy chọn sau:

  • ports : Điều này cho thấy cổng 80 để kích hoạt các tùy chọn cấu hình mà ta đã xác định trong file nginx.conf của ta ở Bước 1.

  • volumes : Ở đây, ta đang xác định cả volume được đặt tên và đường dẫn server :

    • drupal-data:/var/www/html : Điều này sẽ gắn mã ứng dụng Drupal của ta vào folder /var/www/html , mà ta đặt làm folder root trong khối server Nginx của ta .
    • ./nginx-conf:/etc/nginx/conf.d : Thao tác này sẽ gắn folder cấu hình Nginx trên server lưu trữ vào folder liên quan trên containers , đảm bảo mọi thay đổi ta thực hiện đối với file trên server lưu trữ sẽ được phản ánh trong containers .
    • certbot-etc:/etc/letsencrypt : Điều này sẽ gắn các certificate và khóa Let's Encrypt có liên quan cho domain của ta vào folder thích hợp trên containers .
    • networks : Ta đã định nghĩa mạng external chỉ để containers này giao tiếp với containers drupal chứ không phải với containers mysql .

Cuối cùng, ta sẽ thêm định nghĩa dịch vụ cuối cùng của ta cho dịch vụ certbot . Đảm bảo thay thế sammy@your_domainyour_domain bằng email và domain của bạn :

~ / drupal / docker -omp.yml
...   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 your_domain -d www.your_domain 

Định nghĩa này yêu cầu Soạn thảo kéo hình ảnh certbot/certbot từ Docker Hub. Nó cũng sử dụng dung lượng được đặt tên để chia sẻ tài nguyên với containers Nginx, bao gồm certificate domain và khóa trong certbot-etc và mã ứng dụng trong drupal-data .

Ta cũng đã sử dụng depends_on đảm bảo rằng containers certbot sẽ được khởi động sau khi dịch vụ webserver đang chạy.

Ta chưa chỉ định bất kỳ networks nào ở đây vì containers này sẽ không giao tiếp với bất kỳ dịch vụ nào qua mạng. Nó chỉ thêm các certificate domain và khóa, mà ta đã mount bằng cách sử dụng các ổ đĩa được đặt tên.

Ta cũng đã bao gồm tùy chọn command định một lệnh con để chạy với lệnh certbot mặc định của containers . Ứng dụng khách Certbot hỗ trợ các plugin để lấy và cài đặt certificate . Ta đang sử dụng plugin webroot để lấy certificate bằng cách bao gồm certonly--webroot trên dòng lệnh. Đọc thêm về plugin và các lệnh bổ sung từ Tài liệu Certbot chính thức.

Sau định nghĩa dịch vụ certbot , hãy thêm định nghĩa mạng và dung lượng :

~ / drupal / docker -omp.yml
... networks:   external:     driver: bridge   internal:     driver: bridge  volumes:   drupal-data:   db-data:   certbot-etc: 

Khóa networks cấp cao nhất cho phép ta chỉ định mạng sẽ được tạo. networks cho phép giao tiếp qua các dịch vụ / containers trên tất cả các cổng vì chúng nằm trên cùng một server Docker daemon. Ta đã xác định hai mạng, internalexternal , để bảo mật thông tin liên lạc của các dịch vụ webserver , drupalmysql .

Khóa volumes được sử dụng để xác định các ổ đĩa có tên là drupal-data , db-data , và certbot-etc . Khi Docker tạo tập, nội dung của tập được lưu trữ trong một folder trên hệ thống file server , /var/lib/docker/volumes/ , được quản lý bởi Docker. Nội dung của mỗi tập sau đó được mount từ folder này vào bất kỳ containers nào sử dụng tập. Bằng cách này, có thể chia sẻ mã và dữ liệu giữa các containers .

Tệp docker-compose.yml đã hoàn thành sẽ giống như sau:

~ / drupal / docker -omp.yml
version: "3"  services:   mysql:     image: mysql:8.0     container_name: mysql     command: --default-authentication-plugin=mysql_native_password     restart: unless-stopped     env_file: .env     volumes:       - db-data:/var/lib/mysql     networks:       - internal    drupal:     image: drupal:8.7.8-fpm-alpine     container_name: drupal     depends_on:       - mysql     restart: unless-stopped     networks:       - internal       - external     volumes:       - drupal-data:/var/www/html    webserver:     image: nginx:1.17.4-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 your_domain -d www.your_domain  networks:   external:     driver: bridge   internal:     driver: bridge  volumes:   drupal-data:   db-data:   certbot-etc: 

Ta đã hoàn thành việc xác định các dịch vụ của bạn . Tiếp theo, hãy bắt đầu containers và kiểm tra các certificate request của ta .

Bước 4 - Lấy certificate SSL và thông tin đăng nhập

Ta có thể khởi động containers của bạn bằng lệnh docker-compose up , lệnh này sẽ tạo và chạy containers của ta theo thứ tự mà ta đã chỉ định. Nếu yêu cầu domain của ta thành công, ta sẽ thấy trạng thái thoát chính xác trong kết quả của ta và các certificate phù hợp được gắn trong folder /etc/letsencrypt/live trên containers web server .

Để chạy các containers trong nền, hãy sử dụng lệnh docker-compose up với cờ -d :

  • docker-compose up -d

Bạn sẽ thấy kết quả tương tự xác nhận các dịch vụ của bạn đã được tạo:

Output
... Creating mysql ... done Creating drupal ... done Creating webserver ... done Creating certbot ... done

Kiểm tra trạng thái của các dịch vụ bằng cách sử dụng lệnh docker-compose ps :

  • docker-compose ps

Ta sẽ thấy các dịch vụ mysql , drupalwebserverState thái Up , trong khi certbot sẽ thoát với thông báo trạng thái 0 :

Output
Name Command State Ports -------------------------------------------------------------------------- certbot certbot certonly --webroot ... Exit 0 drupal docker-php-entrypoint php-fpm Up 9000/tcp mysql docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp webserver nginx -g daemon off; Up 0.0.0.0:80->80/tcp

Nếu bạn thấy bất cứ điều gì khác hơn Up trong State cột cho mysql , drupal , hoặc webserver dịch vụ, hoặc một trạng thái thoát khác hơn 0 cho certbot container, hãy chắc chắn để kiểm tra các bản ghi dịch vụ với các docker-compose logs lệnh:

  • docker-compose logs service_name

Bây giờ ta có thể kiểm tra xem các certificate của ta đã được gắn trên containers webserver bằng cách sử dụng lệnh docker-compose exec .

  • docker-compose exec webserver ls -la /etc/letsencrypt/live

Điều này sẽ cho kết quả sau:

Output
total 16 drwx------ 3 root root 4096 Oct 5 09:15 . drwxr-xr-x 9 root root 4096 Oct 5 09:15 .. -rw-r--r-- 1 root root 740 Oct 5 09:15 README drwxr-xr-x 2 root root 4096 Oct 5 09:15 your_domain

Bây giờ mọi thứ đã chạy thành công, ta có thể chỉnh sửa định nghĩa dịch vụ certbot của certbot để xóa cờ --staging .

Mở docker-compose.yml file , hãy vào certbot định nghĩa dịch vụ, và thay thế --staging cờ trong các tùy chọn lệnh với --force-renewal cờ, mà sẽ cho Certbot mà bạn muốn yêu cầu một certificate mới với các domain giống như certificate hiện có. Định nghĩa certbot được cập nhật sẽ giống như sau:

~ / drupal / docker -omp.yml
...   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 --force-renewal -d your_domain -d www.your_domain ... 

Ta cần phải chạy docker-compose up để tái tạo certbot container. Ta cũng sẽ bao gồm tùy chọn --no-deps để cho Soạn biết rằng nó có thể bỏ qua việc khởi động dịch vụ webserver , vì nó đã chạy:

  • docker-compose up --force-recreate --no-deps certbot

Ta sẽ thấy kết quả cho biết rằng certificate request của ta đã thành công:

Output
Recreating certbot ... done Attaching to certbot certbot | Saving debug log to /var/log/letsencrypt/letsencrypt.log certbot | Plugins selected: Authenticator webroot, Installer None certbot | Renewing an existing certificate certbot | Performing the following challenges: certbot | http-01 challenge for your_domain certbot | http-01 challenge for www.your_domain certbot | Using the webroot path /var/www/html for all unmatched domains. certbot | Waiting for verification... certbot | Cleaning up challenges certbot | IMPORTANT NOTES: certbot | - Congratulations! Your certificate and chain have been saved at: certbot | /etc/letsencrypt/live/your_domain/fullchain.pem certbot | Your key file has been saved at: certbot | /etc/letsencrypt/live/your_domain/privkey.pem certbot | Your cert will expire on 2020-01-03. To obtain a new or tweaked certbot | version of this certificate in the future, simply run certbot certbot | again. To non-interactively renew *all* of your certificates, run certbot | "certbot renew" certbot | - Your account credentials have been saved in your Certbot certbot | configuration directory at /etc/letsencrypt. You should make a certbot | secure backup of this folder now. This configuration directory will certbot | also contain certificates and private keys obtained by Certbot so certbot | making regular backups of this folder is ideal. certbot | - If you like Certbot, please consider supporting our work by: certbot | 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ây giờ ta đã tạo thành công certificate của bạn , ta có thể cập nhật Cấu hình Nginx của bạn để bao gồm SSL.

Bước 5 - Sửa đổi cấu hình web server và định nghĩa dịch vụ

Sau khi cài đặt certificate SSL trong Nginx, ta cần chuyển hướng tất cả các yêu cầu HTTP đến HTTPS. Ta cũng sẽ phải chỉ định certificate SSL và các vị trí chính của ta và thêm các thông số bảo mật và tiêu đề.

Vì bạn sẽ tạo lại dịch vụ webserver để bao gồm những bổ sung này, bạn có thể dừng nó ngay bây giờ:

  • docker-compose stop webserver

Điều này sẽ cho kết quả sau:

Output
Stopping webserver ... done

Tiếp theo, hãy xóa file cấu hình Nginx mà ta đã tạo trước đó:

  • rm nginx-conf/nginx.conf

Mở một version khác của file :

  • nano nginx-conf/nginx.conf

Thêm mã sau vào file để chuyển hướng HTTP sang HTTPS và thêm thông tin đăng nhập SSL, giao thức và tiêu đề bảo mật. Hãy nhớ thay your_domain bằng domain của bạn :

~ / drupal / nginx-conf / nginx.conf
server {     listen 80;     listen [::]:80;      server_name your_domain www.your_domain;      location ~ /.well-known/acme-challenge {         allow all;         root /var/www/html;     }      location / {         rewrite ^ https://$host$request_uri? permanent;     } } server {     listen 443 ssl;     listen [::]:443 ssl;     server_name your_domain www.your_domain;      index index.php index.html index.htm;      root /var/www/html;      server_tokens off;      ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;     ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;      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 server HTTP chỉ định plugin webroot cho các yêu cầu gia hạn Certbot tới folder .well .well-known/acme-challenge . Nó cũng bao gồm một chỉ thị rewrite hướng các yêu cầu HTTP đến folder root tới HTTPS.

Khối server HTTPS cho phép sslhttp2 . Để đọc thêm về cách HTTP / 2 lặp lại trên các giao thức HTTP và những lợi ích mà nó có thể có đối với hiệu suất trang web, vui lòng xem phần giới thiệu về Cách Cài đặt Nginx với Hỗ trợ HTTP / 2 trên Ubuntu 18.04 .

Các khối này cho phép SSL, vì ta đã bao gồm certificate SSL và các vị trí quan trọng cùng với các tiêu đề được đề xuất. Các tiêu đề này sẽ giúp ta có được xếp hạng A trên các trang web thử nghiệm server SSL LabsSecurity Headers .

Các index thị rootindex của ta cũng nằm trong khối này, cũng như phần còn lại của các khối vị trí dành riêng cho Drupal được thảo luận trong Bước 1.

Lưu file cấu hình Nginx đã cập nhật.

Trước khi tạo lại containers webserver , ta cần thêm ánh xạ cổng 443 vào định nghĩa dịch vụ webserver vì ta đã bật certificate SSL.

Mở file docker-compose.yml :

  • nano docker-compose.yml

áp dụng các thay đổi sau trong định nghĩa dịch vụ webserver :

~ / drupal / docker -omp.yml
...   webserver:     image: nginx:1.17.4-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     networks:       - external ... 

Sau khi bật certificate SSL, docker-compose.yml của ta sẽ trông giống như sau:

~ / drupal / docker -omp.yml
version: "3"  services:   mysql:     image: mysql:8.0     container_name: mysql     command: --default-authentication-plugin=mysql_native_password     restart: unless-stopped     env_file: .env     volumes:       - db-data:/var/lib/mysql     networks:       - internal    drupal:     image: drupal:8.7.8-fpm-alpine     container_name: drupal     depends_on:       - mysql     restart: unless-stopped     networks:       - internal       - external     volumes:       - drupal-data:/var/www/html    webserver:     image: nginx:1.17.4-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     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 --force-renewal -d your_domain -d www.your_domain  networks:   external:     driver: bridge   internal:     driver: bridge  volumes:   drupal-data:   db-data:   certbot-etc: 

Lưu và đóng file . Hãy tạo lại dịch vụ webserver với cấu hình cập nhật của ta :

  • docker-compose up -d --force-recreate --no-deps webserver

Điều này sẽ cho kết quả sau:

Output
Recreating webserver ... done

Kiểm tra các dịch vụ bằng docker-compose ps :

  • docker-compose ps

Ta sẽ thấy các dịch vụ mysql , drupalwebserverUp trong khi certbot sẽ được thoát với thông báo trạng thái 0 :

Output
Name Command State Ports -------------------------------------------------------------------------- certbot certbot certonly --webroot ... Exit 0 drupal docker-php-entrypoint php-fpm Up 9000/tcp mysql docker-entrypoint.sh --def ... Up 3306/tcp, 33060/tcp webserver nginx -g daemon off; Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp

Bây giờ, tất cả các dịch vụ của ta đang chạy và ta rất vui khi tiếp tục cài đặt Drupal thông qua giao diện web.

Bước 6 - Hoàn tất cài đặt thông qua giao diện web

Hãy hoàn thành cài đặt thông qua giao diện web của Drupal.

Trong trình duyệt web, chuyển đến domain của server . Hãy nhớ thay thế your_domain ở đây bằng domain của bạn :

https://your_domain 

Chọn ngôn ngữ để sử dụng:

Chọn trang ngôn ngữ trên giao diện web Drupal

Nhấp vào Lưu và tiếp tục . Ta sẽ đến trang hồ sơ Cài đặt . Drupal có nhiều cấu hình, vì vậy hãy chọn cấu hình Chuẩn và nhấp vào Lưu và tiếp tục .

Chọn trang profile  trên giao diện web Drupal

Sau khi chọn xong profile , ta sẽ chuyển sang trang Cấu hình database . Chọn loại Database là MySQL, MariaDB, Server Percona hoặc tương đương và nhập các giá trị của tên Database , tên user mật khẩu từ các giá trị tương ứng với MYSQL_DATABASE , MYSQL_USERMYSQL_PASSWORD tương ứng được xác định trong file .env ở Bước 2. Nhấp vào Tùy chọn nâng cao và đặt giá trị của Server lưu trữ thành tên của containers dịch vụ mysql . Nhấp vào Lưu và tiếp tục .

 Cài đặt  trang database  trên giao diện web Drupal

Sau khi cấu hình database , nó sẽ bắt đầu cài đặt các chủ đề và module mặc định của Drupal:

Cài đặt trang web trên giao diện web Drupal

Sau khi trang web được cài đặt, ta sẽ truy cập trang cài đặt trang Drupal để cấu hình tên trang, email, tên user , password và cài đặt khu vực. Điền thông tin và nhấp vào Lưu và tiếp tục :

 Cấu hình  trang web trên giao diện web Drupal

Sau khi nhấp vào Lưu và tiếp tục , ta có thể thấy trang Chào mừng đến với Drupal , trang này cho thấy rằng trang Drupal của ta đã được cài đặt và chạy thành công.

Chào mừng bạn đến với trang Drupal trên giao diện web Drupal

Bây giờ quá trình cài đặt Drupal của ta đã hoàn tất, ta cần đảm bảo certificate SSL của ta sẽ tự động gia hạn.

Bước 7 - Gia hạn certificate

Chứng chỉ Let's Encrypt có hiệu lực trong 90 ngày, vì vậy ta cần cài đặt quy trình gia hạn tự động đảm bảo rằng chúng không mất hiệu lực. Một cách để làm điều này là tạo một công việc với tiện ích lập lịch cron . Trong trường hợp này, ta sẽ tạo một cron việc cron để chạy định kỳ một tập lệnh sẽ gia hạn certificate của ta và reload cấu hình Nginx của ta .

Hãy tạo file ssl_renew.sh để gia hạn certificate của ta :

  • nano ssl_renew.sh

Thêm mã sau. Hãy nhớ thay thế tên folder bằng user không phải root của bạn :

~ / drupal / ssl_renew.sh
 #!/bin/bash  cd /home/sammy/drupal/ /usr/local/bin/docker-compose -f docker-compose.yml run certbot renew --dry-run && \ /usr/local/bin/docker-compose -f docker-compose.yml kill -s SIGHUP webserver 

Tập lệnh này thay đổi thành folder dự án ~/drupal và chạy các lệnh docker-compose .

  • certbot docker-compose run : Thao tác này sẽ khởi động certbot chứa certbot và overrides command được cung cấp trong định nghĩa dịch vụ certbot của ta . Thay vì sử dụng lệnh certonly , ta đang sử dụng lệnh con renew ở đây, lệnh này sẽ gia hạn các certificate sắp hết hạn. Ta đã bao gồm tùy chọn --dry-run ở đây để kiểm tra tập lệnh của ta .

  • docker-compose kill : Thao tác này sẽ gửi SIGHUP hiệu SIGHUP tới containers webserver để reload cấu hình Nginx.

Đóng file và làm cho file có thể thực thi được bằng cách chạy lệnh sau:

  • sudo chmod +x ssl_renew.sh

Tiếp theo, mở file crontab root để chạy tập lệnh gia hạn tại một khoảng thời gian cụ thể:

  • sudo crontab -e

Nếu đây là lần đầu tiên bạn chỉnh sửa file này, bạn cần chọn editor văn bản để mở file bằng:

Output
no crontab for root - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]: ...

Ở cuối file , thêm dòng sau, thay thế sammy bằng tên user của bạn:

crontab
... */5 * * * * /home/sammy/drupal/ssl_renew.sh >> /var/log/cron.log 2>&1 

Điều này sẽ đặt khoảng thời gian công việc thành năm phút một lần, vì vậy ta có thể kiểm tra xem yêu cầu gia hạn của ta có hoạt động như dự định hay không. Ta cũng đã tạo một file log , cron.log , để ghi lại kết quả có liên quan từ công việc.

Sau năm phút, sử dụng lệnh tail để kiểm tra cron.log để xem liệu yêu cầu gia hạn đã thành công hay chưa:

  • tail -f /var/log/cron.log

Bạn sẽ thấy kết quả xác nhận gia hạn thành công:

Output
** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates below have not been saved.) Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/your_domain/fullchain.pem (success) ** DRY RUN: simulating 'certbot renew' close to cert expiry ** (The test certificates above have not been saved.) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Nhấn CTRL+C để thoát khỏi quá trình tail .

Như vậy, ta có thể sửa đổi file crontab để chạy tập lệnh mỗi ngày thứ 2 trong tuần lúc 2 giờ sáng. Thay đổi dòng cuối cùng của crontab thành như sau:

crontab
... * 2 * * 2 /home/sammy/drupal/ssl_renew.sh >> /var/log/cron.log 2>&1 

Thoát và lưu file .

Bây giờ, hãy xóa tùy chọn --dry-run khỏi tập lệnh ssl_renew.sh . Đầu tiên, hãy mở nó ra:

  • nano ssl_renew.sh

Sau đó thay đổi nội dung thành như sau:

~ / drupal / ssl_renew.sh
#!/bin/bash  cd /home/sammy/drupal/ /usr/local/bin/docker-compose -f docker-compose.yml run certbot renew && \ /usr/local/bin/docker-compose -f docker-compose.yml kill -s SIGHUP webserver 

Công việc cron của ta bây giờ sẽ xử lý certificate SSL hết hạn của ta bằng cách gia hạn chúng khi chúng đủ điều kiện.

Kết luận

Trong hướng dẫn này, ta đã sử dụng Docker Compose để tạo bản cài đặt Drupal với web server Nginx. Là một phần của quy trình làm việc này, ta đã nhận được certificate TLS / SSL cho domain ta muốn được liên kết với trang web Drupal của ta và tạo một công việc cron để gia hạn các certificate này khi cần thiết.

Nếu bạn muốn tìm hiểu thêm về Docker, hãy xem trang chủ đề Docker của ta .


Tags:

Các tin trước

Cách xây dựng và triển khai ứng dụng Flask bằng Docker trên Ubuntu 18.04 2020-04-05
Como Conteinerizar um aplicativo Laravel para desenvolvimento com o Docker Compose em Ubuntu 18.04 2020-02-20
Cách tạo ứng dụng Node.js với Docker [Quickstart] 2020-02-06
Cách cài đặt Docker Compose trên Debian 10 2020-01-30
Cách chứa một ứng dụng Laravel để phát triển với Docker Compose trên Ubuntu 18.04 2020-01-23
Cách chứa một ứng dụng Laravel để phát triển với Docker Compose trên Ubuntu 18.04 2020-01-23
Lưu trữ một ứng dụng Ruby on Rails để phát triển với Docker Compose 2019-12-27
Làm việc với nhiều container bằng Docker Compose 2019-12-20
Cách sử dụng Plugin Docker cho Visual Studio Code 2019-12-12
Cách sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu 18.04 2019-12-05