V tem članku želim z vami deliti metodo za ustvarjanje potrdila SSL za vašo spletno aplikacijo, ki se izvaja na Dockerju, ker... V rusko-jezičnem delu interneta nisem našel takšne rešitve.
Več podrobnosti pod krojem.
Imeli smo docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 in pol litra čistega Let'sEncrypt. Ne gre za to, da je treba produkcijo razmestiti na Dockerju. Toda ko začnete graditi Docker, se ga je težko ustaviti.
Torej, za začetek bom dal standardne nastavitve - ki smo jih imeli na stopnji razvijalca, tj. brez vrat 443 in SSL na splošno:
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;
}
Nato moramo dejansko implementirati SSL. Če sem iskren, sem porabil približno 2 uri za preučevanje com zone. Vse tam ponujene možnosti so zanimive. Toda v trenutni fazi projekta smo (podjetje) morali hitro in zanesljivo zaviti SSL Let'sEnctypt к nginx posoda in nič več.
Najprej smo namestili na strežnik certbot
sudo apt-get install certbot
Nato smo ustvarili nadomestna potrdila za našo domeno
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
po izvedbi nam bo certbot posredoval 2 zapisa TXT, ki ju moramo določiti v nastavitvah DNS.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
In pritisnite enter.
Po tem bo certbot preveril prisotnost teh zapisov v DNS in za vas ustvaril potrdila.
če ste dodali potrdilo, vendar certbot ni našel - poskusite znova zagnati ukaz po 5-10 minutah.
No, tukaj smo ponosni lastniki certifikata Let'sEncrypt za 90 dni, zdaj pa ga moramo naložiti na Docker.
Da bi to naredili, na najbolj trivialen način, v docker-compose.yml, v razdelku nginx, povežemo imenike.
Primer docker-compose.yml s 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"
Povezano? Super - nadaljujmo:
Zdaj moramo spremeniti konfiguracijo nginx delati z 443 pristanišče in SSL na splošno:
Primer konfiguracije main.conf s 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;
}
}
Pravzaprav po teh manipulacijah gremo v imenik z Docker-compose, napišemo docker-compose up -d. In preverimo delovanje SSL. Vse bi moralo vzleteti.
Glavna stvar je, da ne pozabite, da je potrdilo Let'sEnctypt izdano za 90 dni in ga boste morali obnoviti z ukazom sudo certbot renew
in nato znova zaženite projekt z ukazom docker-compose restart
Druga možnost je, da to zaporedje dodate v crontab.
Po mojem mnenju je to najlažji način za povezavo SSL s spletno aplikacijo Docker.
PS Upoštevajte, da vsi skripti, predstavljeni v besedilu, niso dokončni, projekt je zdaj v fazi globokega razvijanja, zato bi vas prosil, da ne kritizirate konfiguracij - večkrat bodo spremenjene.
Vir: www.habr.com