Dalam artikel ini, saya ingin berkongsi dengan anda kaedah untuk mencipta sijil SSL untuk aplikasi web anda yang berjalan di Docker, kerana... Saya tidak menemui penyelesaian sedemikian dalam bahagian Internet berbahasa Rusia.
Butiran lanjut di bawah potongan.
Kami mempunyai docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 dan satu pain Let'sEncrypt tulen. Bukannya perlu untuk menggunakan pengeluaran pada Docker. Tetapi apabila anda mula membina Docker, ia menjadi sukar untuk dihentikan.
Jadi, sebagai permulaan, saya akan memberikan tetapan standard - yang kami ada pada peringkat dev, i.e. tanpa port 443 dan SSL secara umum:
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;
}
Seterusnya, kita sebenarnya perlu melaksanakan SSL. Sejujurnya, saya menghabiskan kira-kira 2 jam belajar zon com. Semua pilihan yang ditawarkan di sana adalah menarik. Tetapi pada peringkat semasa projek, kami (perniagaan) perlu cepat dan boleh dipercayai SSL Let'sEnctypt ΠΊ nginx bekas dan tidak lebih.
Pertama sekali, kami memasangnya pada pelayan certbot
sudo apt-get install certbot
Seterusnya, kami menjana sijil kad bebas untuk domain kami
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
selepas pelaksanaan, certbot akan memberikan kami 2 rekod TXT yang perlu dinyatakan dalam tetapan DNS.
_acme-challenge.stomup.ru TXT {ΡΠΎΡΠΠ»ΡΡΠΠΎΡΠΎΡΡΠΉΠΠ°ΠΌΠΡΠ΄Π°Π»CertBot}
Dan tekan enter.
Selepas ini, certbot akan menyemak kehadiran rekod ini dalam DNS dan mencipta sijil untuk anda.
jika anda telah menambah sijil tetapi certbot tidak menemuinya - cuba mulakan semula arahan selepas 5-10 minit.
Nah, di sini kami adalah pemilik bangga sijil Let'sEncrypt selama 90 hari, tetapi kini kami perlu memuat naiknya ke Docker.
Untuk melakukan ini, dengan cara yang paling remeh, dalam docker-compose.yml, dalam bahagian nginx, kami memautkan direktori.
Contoh docker-compose.yml dengan SSL
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"
Dipautkan? Hebat - mari teruskan:
Sekarang kita perlu menukar konfigurasi nginx untuk bekerja dengan 443 pelabuhan dan SSL secara amnya:
Contoh konfigurasi main.conf dengan SSL
#
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;
}
}
Sebenarnya, selepas manipulasi ini, kita pergi ke direktori dengan Docker-compose, tulis docker-compose up -d. Dan kami menyemak kefungsian SSL. Semuanya harus berlepas.
Perkara utama adalah jangan lupa bahawa sijil Let'sEnctypt dikeluarkan selama 90 hari dan anda perlu memperbaharuinya melalui arahan sudo certbot renew
, dan kemudian mulakan semula projek dengan arahan docker-compose restart
Pilihan lain ialah menambah urutan ini pada crontab.
Pada pendapat saya ini adalah cara paling mudah untuk menyambungkan SSL ke aplikasi Web Docker.
PS Sila ambil kira bahawa semua skrip yang dibentangkan dalam teks bukanlah muktamad, projek itu kini berada di peringkat Dev yang mendalam, jadi saya ingin meminta anda untuk tidak mengkritik konfigurasi - ia akan diubah suai berkali-kali.
Sumber: www.habr.com