Изучите Docker-HTTPS с Laradock
предисловие
В прошлой статье мы предварительно разобрались с конфигурационными файлами laradock.Теперь мы можем в принципе настроить сайт как хотим.Можно сказать, что использовать его в качестве среды разработки удобно и быстро.
В связи с тем, что все больше и больше платформ требуют, чтобы веб-сайт доступа предоставлял интерфейс протокола https. Как сделать так, чтобы наш сайт также поддерживал https, не за горами.
Далее давайте узнаем, как заставить наш сайт поддерживать протокол https через laradock.
Метод реализации
На данный момент есть два варианта сделать сайт с поддержкой https.Первый это покупка сертификата у компании выступающей в роли агента.Таким образом можно получить не один год обслуживания.Конечно срок зависит о продолжительности контракта между вами.
Другим решением является использование бесплатных сертификатов, предоставляемых такими компаниями, как let's encrypt или symantec.Этот метод обычно имеет короткий срок действия контракта и требует повторного применения каждые три месяца.
Проект laradock интегрировал инструмент для применения сертификатов компании let's encrypt, давайте посмотрим, как это реализовано.
документ конфигурации
docker-compose.yml
Находим код для certbot в конфигурационном файле
certbot:
build:
context: ./certbot
volumes:
- ./data/certbot/certs/:/var/certs
- ./certbot/letsencrypt/:/var/www/letsencrypt
environment:
- CN="fake.domain.com"
- EMAIL="fake.email@gmail.com"
networks:
- frontend
Конфигурация показывает, что контейнер основан на каталоге certbot, а затем каталог laradock/data/certbot/certs сопоставляется с /var/certs в контейнере, а каталог laradock/certbot/letsencrypt сопоставляется с /var/ каталог www/letsencrypt в контейнере
С документацией давайте посмотрим, какие файлы находятся в каталоге certbot.
letsencrypt (dir)
Dockerfile
run-certbot.sh
Здесь есть каталог letsencrypt.Давайте сначала запомним, что это за каталог, файл dockerfile и файл сценария оболочки.
Dockerfile
FROM phusion/baseimage:latest
MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>
RUN apt-get update
RUN apt-get install -y letsencrypt
COPY run-certbot.sh /root/certbot/run-certbot.sh
ENTRYPOINT bash -c "bash /root/certbot/run-certbot.sh && sleep infinity"
Это базовый образ на основе Ubuntu с установленным инструментом автоматической загрузки сертификатов let's encrypt.
Сначала скопируйте run-certbot.sh в целевой каталог контейнера (/root/certbot) и запустите его.
Наконец, бесконечность сна используется для сохранения контейнера в состоянии выполнения.
run-certbot.sh
#!/bin/bash
letsencrypt certonly --webroot -w /var/www/letsencrypt -d "$CN" --agree-tos --email "$EMAIL" --non-interactive --text
cp /etc/letsencrypt/archive/"$CN"/cert1.pem /var/certs/cert1.pem
cp /etc/letsencrypt/archive/"$CN"/privkey1.pem /var/certs/privkey1.pem
По сути, основная команда этого файла — одна строка
letsencrypt certonly --webroot -w /var/www/letsencrypt -d "$CN" --agree-tos --email "$EMAIL" --non-interactive --text
Целью этой строки команды является создание двух известных папок/acme-challenge/ в каталоге /var/www/letsencrypt (в контейнере), создание случайного файла в папке, а затем давайте зашифруем сервер проверяет, есть ли доступ к файлу.Если к нему есть доступ, это означает, что заявитель имеет контроль над доменным именем и загружает сертификат в каталог /etc/letsencrypt/archive/"$CN"/; Временный файл, приложение не владеет доменным именем или конфигурация неверна. Последние две строки копируют сертификат в указанный каталог, чтобы позже файл можно было сопоставить с локальным каталогом.
Примечание. Инструмент удалит временный файл после завершения обнаружения, независимо от того, можно ли получить доступ к временному файлу.
default.conf (порт 80)
Итак, когда мы видим это, мы знаем, что не можем запустить этот контейнер напрямую, потому что наш контейнер nginx не может получить доступ к каталогу /var/www/letsencrypt в контейнере certbot.Давайте посмотрим на файл конфигурации сайта nginx, как это написано
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name localhost;
root /var/www/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location /.well-known/acme-challenge/ {
root /var/www/letsencrypt/;
log_not_found off;
}
}
Мы видим, что каталог /.well-know/acme-challenge/ указывает на каталог /var/www/letsencrypt/ в конце файла конфигурации. В этом случае мы можем сопоставить /var/www/letsencrypt в контейнере certbot и /var/www/letsencrypt в контейнере nginx с одним и тем же локальным каталогом, а контейнер nginx основан на приложениях общего тома, поэтому нам нужно только для сопоставления контейнера certbot Его также можно изменить на общий том, то есть ту часть, которую мы нажимали и нажимали до этого.
Изменить docker-compose.yml (certbot)
certbot:
build:
context: ./certbot
volumes_from:
- applications
volumes:
- ./data/certbot/certs/:/var/certs
environment:
- CN="fake.domain.com"
- EMAIL="fake.email@gmail.com"
networks:
- frontend
Пожалуйста, измените в конфигурации fake.domain.com на ваше собственное доменное имя, а также измените fake.email@gmail.com на свой собственный адрес электронной почты.
После этого мы можем попробовать запустить контейнер certbot один раз.
docker-compose up -d certbot
Посмотрим на результаты работы:
If you lose your account credentials, you can recover through e-mails sent to fake.domain.com.
Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/fake.domain.com/fullchain.pem. Your cert will expire on 2018-06-03. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.
Your account credentials have been saved in your Let's Encrypt configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Let's Encrypt so making regular backups of this folder is ideal.
If you like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
На данный момент наш контейнер certbot успешно запущен, и файл сертификата создан. Нам просто нужно сопоставить файл сертификата с каталогом, доступным для nginx, и добавить соответствующую конфигурацию для доступа к порту 443 в файл конфигурации сайта.
Изменить docker-compose.yml (nginx)
Увеличивать
- ./data/certbot/certs/:/var/certs
Изменить default.conf (порт 443)
server {
listen 443;
listen [::]:443;
server_name localhost;
root /var/www/public;
index index.php index.html index.htm;
ssl on;
ssl_certificate /var/certs/fullchain1.pem;
ssl_certificate_key /var/certs/privkey1.pem;
ssl_trusted_certificate /var/certs/
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_pass php-upstream;
fastcgi_index index.php;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fixes timeouts
fastcgi_read_timeout 600;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
перезапустить nginx
docker-compose build nginx
docker-compose restart nginx
Эпилог
На этот раз наша конфигурация предназначена для одного доменного имени.Если вы хотите настроить несколько доменных имен, вы можете добавить дополнительный уровень каталога доменных имен при копировании файла сертификата.
На данный момент мы завершили всю настройку, и теперь вы можете видеть маленький зеленый замок перед доменным именем, когда вы посещаете настроенное вами доменное имя.
Наконец, не забывайте, что сертификат действителен в течение 3 месяцев.Не забывайте перезапускать контейнер или настраивать crontab каждые два месяца.Увидимся в следующий раз.
можно пообщаться с автором