Bu yazımda sizlerle Docker üzerinde çalışan web uygulamanız için SSL sertifikası oluşturma yöntemini paylaşmak istiyorum çünkü... İnternetin Rusça kısmında böyle bir çözüm bulamadım.
Kesimin altında daha fazla ayrıntı var.
Docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 ve bir litre saf Let'sEncrypt'imiz vardı. Üretimi Docker'da dağıtmak gerekli değildir. Ancak Docker'ı oluşturmaya başladığınızda onu durdurmak zorlaşır.
Başlangıç olarak, geliştirme aşamasında sahip olduğumuz standart ayarları vereceğim. genel olarak 443 numaralı bağlantı noktası ve SSL olmadan:
liman işçisi-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;
}
Daha sonra, aslında SSL uygulamamız gerekiyor. Dürüst olmak gerekirse, com bölgesini incelemek için yaklaşık 2 saat harcadım. Orada sunulan tüm seçenekler ilginç. Ancak projenin şu anki aşamasında, bizim (işletmenin) hızlı ve güvenilir bir şekilde vidalamamız gerekiyordu. SSL Let'sEnctypt к nginx konteyner ve daha fazlası değil.
Öncelikle sunucuya kurduk Certbot
sudo apt-get install certbot
Daha sonra alan adımız için joker karakter sertifikaları oluşturduk
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
Yürütmenin ardından certbot bize DNS ayarlarında belirtilmesi gereken 2 TXT kaydını sağlayacaktır.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
Ve enter'a basın.
Bundan sonra certbot bu kayıtların DNS'de varlığını kontrol edecek ve sizin için sertifikalar oluşturacaktır.
bir sertifika eklediyseniz ancak Certbot bulamadım - 5-10 dakika sonra komutu yeniden başlatmayı deneyin.
İşte 90 gün boyunca Let'sEncrypt sertifikasının gururlu sahibiyiz, ancak şimdi onu Docker'a yüklememiz gerekiyor.
Bunu yapmak için en önemsiz şekilde docker-compose.yml'deki nginx bölümünde dizinleri bağlarız.
SSL ile docker-compose.yml örneği
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"
Bağlantılı mı? Harika - devam edelim:
Şimdi yapılandırmayı değiştirmemiz gerekiyor nginx birlikte çalışmak 443 liman ve SSL genel olarak:
SSL ile örnek main.conf yapılandırması
#
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;
}
}
Aslında bu manipülasyonlardan sonra Docker-compose ile dizine gidiyoruz, docker-compose up -d yazıyoruz. Ve SSL'nin işlevselliğini kontrol ediyoruz. Her şey yola çıkmalı.
Önemli olan Let'sEnctypt sertifikasının 90 gün süreyle verildiğini ve komut aracılığıyla yenilemeniz gerekeceğini unutmamak. sudo certbot renew
ve ardından projeyi komutla yeniden başlatın. docker-compose restart
Başka bir seçenek de bu diziyi crontab'a eklemektir.
Bana göre bu, SSL'yi Docker Web uygulamasına bağlamanın en kolay yoludur.
Not: Lütfen metinde sunulan tüm komut dosyalarının nihai olmadığını, projenin şu anda derin Geliştirme aşamasında olduğunu dikkate alın, bu nedenle sizden yapılandırmaları eleştirmemenizi rica ediyorum; bunlar birçok kez değiştirilecektir.
Kaynak: habr.com