In hierdie artikel wil ek 'n metode met u deel om 'n SSL-sertifikaat te skep vir u webtoepassing wat op Docker loop, want ... Ek het nie so 'n oplossing in die Russiestalige deel van die internet gevind nie.
Meer besonderhede onder die snit.
Ons het docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 en 'n pint pure Let'sEncrypt gehad. Dit is nie dat dit nodig is om produksie op Docker te ontplooi nie. Maar sodra jy Docker begin bou, word dit moeilik om te stop.
So, om mee te begin, sal ek die standaard instellings gee - wat ons op die ontwikkelingstadium gehad het, d.w.s. sonder poort 443 en SSL in die algemeen:
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;
}
Vervolgens moet ons eintlik SSL implementeer. Om eerlik te wees, ek het ongeveer 2 uur spandeer om die com zone te bestudeer. Al die opsies wat daar aangebied word, is interessant. Maar in die huidige stadium van die projek moes ons (die besigheid) vinnig en betroubaar skroef SSL Let'sEnctypt к nginx houer en niks meer nie.
Eerstens het ons dit op die bediener geïnstalleer certbot
sudo apt-get install certbot
Vervolgens het ons jokertekensertifikate vir ons domein gegenereer
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
na uitvoering, sal certbot ons voorsien van 2 TXT-rekords wat in die DNS-instellings gespesifiseer moet word.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
En druk enter.
Hierna sal certbot na die teenwoordigheid van hierdie rekords in DNS kyk en sertifikate vir jou skep.
as jy 'n sertifikaat bygevoeg het, maar certbot het dit nie gevind nie - probeer om die opdrag na 5-10 minute te herbegin.
Wel, hier is ons die trotse eienaars van 'n Let'sEncrypt-sertifikaat vir 90 dae, maar nou moet ons dit na Docker oplaai.
Om dit te doen, op die mees triviale manier, in docker-compose.yml, in die nginx-afdeling, skakel ons die gidse.
Voorbeeld docker-compose.yml met 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"
Gekoppel? Groot - kom ons gaan voort:
Nou moet ons die konfigurasie verander nginx om mee te werk 443 hawe en SSL oor die algemeen:
Voorbeeld main.conf config met 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;
}
}
Eintlik, na hierdie manipulasies, gaan ons na die gids met Docker-compose, skryf docker-compose up -d. En ons kyk na die funksionaliteit van SSL. Alles moet opstyg.
Die belangrikste ding is om nie te vergeet dat die Let'sEnctypt-sertifikaat vir 90 dae uitgereik word en dat u dit deur die opdrag moet hernu sudo certbot renew
, en herbegin dan die projek met die opdrag docker-compose restart
Nog 'n opsie is om hierdie volgorde by crontab te voeg.
Na my mening is dit die maklikste manier om SSL aan Docker Web-app te koppel.
NS Neem asseblief in ag dat al die skrifte wat in die teks aangebied word nie finaal is nie, die projek is nou in die diep Ontwikkelingsstadium, so ek wil jou vra om nie die konfigurasies te kritiseer nie - hulle sal baie keer gewysig word.
Bron: will.com