Энэ нийтлэлд би та бүхэнтэй Docker дээр ажиллаж байгаа вэб програмдаа SSL сертификат үүсгэх аргыг хуваалцахыг хүсч байна, учир нь... Интернетийн орос хэл дээрх хэсгээс би ийм шийдлийг олж чадаагүй.
Дэлгэрэнгүй мэдээллийг тайралт доороос үзнэ үү.
Бидэнд docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 болон нэг литр цэвэр Let'sEncrypt байсан. Энэ нь Docker дээр үйлдвэрлэлийг байрлуулах шаардлагагүй юм. Гэхдээ та Docker-ийг бүтээж эхэлмэгц үүнийг зогсооход хэцүү болно.
Тиймээс, эхлэхийн тулд би стандарт тохиргоог өгөх болно - бид хөгжүүлэлтийн шатанд байсан, жишээлбэл. 443 порт болон ерөнхийдөө SSL байхгүй:
docker-compose.yml
version: '2'
services:
php:
build: ./php-fpm
volumes:
- ./StomUp:/var/www/StomUp
- ./php-fpm/php.ini:/usr/local/etc/php/php.ini
depends_on:
- mysql
container_name: "StomPHP"
web:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./StomUp:/var/www/StomUp
- ./nginx/main.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
mysql:
image: mysql:5.7
command: mysqld --sql_mode=""
environment:
MYSQL_ROOT_PASSWORD: xxx
ports:
- "3333:3306"
nginx/main.conf
server {
listen 80;
server_name *.stomup.ru stomup.ru;
root /var/www/StomUp/public;
client_max_body_size 5M;
location / {
# try to serve file directly, fallback to index.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/index.php(/|$) {
#fastcgi_pass unix:/var/run/php7.2-fpm.sock;
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
internal;
}
location ~ .php$ {
return 404;
}
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
Дараа нь бид үнэндээ SSL-ийг хэрэгжүүлэх хэрэгтэй. Үнэнийг хэлэхэд би com zone-г судлахад 2 цаг орчим зарцуулсан. Тэнд санал болгож буй бүх сонголтууд нь сонирхолтой юм. Гэхдээ төслийн одоогийн шатанд бид (бизнес) хурдан бөгөөд найдвартай шураг хийх шаардлагатай байв SSL Let'sEnctypt к nginx сав, өөр юу ч биш.
Юуны өмнө бид сервер дээр суулгасан сертификат
sudo apt-get install certbot
Дараа нь бид домэйндоо орлуулагч тэмдэгт гэрчилгээ үүсгэсэн
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
гүйцэтгэсний дараа certbot нь DNS тохиргоонд зааж өгөх шаардлагатай 2 TXT бичлэгийг бидэнд өгөх болно.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
Тэгээд enter дарна уу.
Үүний дараа certbot нь DNS-д эдгээр бичлэг байгаа эсэхийг шалгаж, танд гэрчилгээ үүсгэх болно.
хэрэв та гэрчилгээ нэмсэн бол гэхдээ сертификат олсонгүй - 5-10 минутын дараа командыг дахин эхлүүлнэ үү.
За, бид 90 хоногийн турш Let'sEncrypt сертификатын бахархалтай эзэд боллоо, гэхдээ одоо бид үүнийг Docker-т байршуулах хэрэгтэй байна.
Үүнийг хийхийн тулд docker-compose.yml-ийн nginx хэсэгт бид сангуудыг холбодог.
Жишээ нь SSL-тэй docker-compose.yml
version: '2'
services:
php:
build: ./php-fpm
volumes:
- ./StomUp:/var/www/StomUp
- /etc/letsencrypt/live/stomup.ru/:/etc/letsencrypt/live/stomup.ru/
- ./php-fpm/php.ini:/usr/local/etc/php/php.ini
depends_on:
- mysql
container_name: "StomPHP"
web:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./StomUp:/var/www/StomUp
- /etc/letsencrypt/:/etc/letsencrypt/
- ./nginx/main.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
mysql:
image: mysql:5.7
command: mysqld --sql_mode=""
environment:
MYSQL_ROOT_PASSWORD: xxx
ports:
- "3333:3306"
Холбоотой юу? Гайхалтай - үргэлжлүүлье:
Одоо бид тохиргоог өөрчлөх хэрэгтэй nginx хамтран ажиллах 443 порт ба SSL ерөнхийдөө:
SSL-тэй main.conf тохиргооны жишээ
#
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name *.stomup.ru stomup.ru;
set $base /var/www/StomUp;
root $base/public;
# SSL
ssl_certificate /etc/letsencrypt/live/stomup.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/stomup.ru/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/stomup.ru/chain.pem;
client_max_body_size 5M;
location / {
# try to serve file directly, fallback to index.php
try_files $uri /index.php$is_args$args;
}
location ~ ^/index.php(/|$) {
#fastcgi_pass unix:/var/run/php7.2-fpm.sock;
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
internal;
}
location ~ .php$ {
return 404;
}
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
# HTTP redirect
server {
listen 80;
listen [::]:80;
server_name *.stomup.ru stomup.ru;
location / {
return 301 https://stomup.ru$request_uri;
}
}
Үнэн хэрэгтээ эдгээр заль мэхийг хийсний дараа бид Docker-compose-тай лавлах руу орж, docker-compose up -d гэж бичнэ. Мөн бид SSL-ийн ажиллагааг шалгадаг. Бүх зүйл хөөрөх ёстой.
Хамгийн гол нь Let'sEnctypt гэрчилгээ нь 90 хоногийн хугацаатай олгогддог гэдгийг мартаж болохгүй бөгөөд та тушаалаар дамжуулан үүнийг шинэчлэх шаардлагатай болно. sudo certbot renew
, дараа нь тушаалаар төслийг дахин эхлүүлнэ үү docker-compose restart
Өөр нэг сонголт бол энэ дарааллыг crontab-д нэмэх явдал юм.
Миний бодлоор энэ бол SSL-г Docker вэб програмтай холбох хамгийн хялбар арга юм.
Жич: Текстэнд үзүүлсэн бүх скриптүүд эцсийнх биш, төсөл одоо гүнзгий шатандаа байгаа тул тохиргоог шүүмжлэхгүй байхыг танаас хүсч байна - тэдгээрийг олон удаа өөрчлөх болно.
Эх сурвалж: www.habr.com