I den här artikeln vill jag dela med dig en metod för att skapa ett SSL-certifikat för din webbapplikation som körs på Docker, eftersom... Jag hittade inte en sådan lösning på den ryskspråkiga delen av Internet.
Mer detaljer under klippet.
Vi hade docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 och en pint ren Let'sEncrypt. Det är inte så att det är nödvändigt att distribuera produktion på Docker. Men när du väl börjar bygga Docker blir det svårt att sluta.
Så till att börja med kommer jag att ge standardinställningarna - som vi hade på utvecklingsstadiet, dvs. utan port 443 och SSL i allmänhet:
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;
}
Därefter måste vi faktiskt implementera SSL. För att vara ärlig tillbringade jag cirka 2 timmar på att studera com-zonen. Alla alternativ som erbjuds där är intressanta. Men i det nuvarande skedet av projektet behövde vi (verksamheten) snabbt och pålitligt skruva SSL Let'sEnctypt к nginx container och inget mer.
Först och främst installerade vi det på servern certbot
sudo apt-get install certbot
Därefter genererade vi jokerteckencertifikat för vår domän
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
efter körning kommer certbot att förse oss med 2 TXT-poster som måste specificeras i DNS-inställningarna.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
Och tryck enter.
Efter detta kommer certbot att kontrollera förekomsten av dessa poster i DNS och skapa certifikat åt dig.
om du har lagt till ett certifikat men certbot hittade det inte - försök starta om kommandot efter 5-10 minuter.
Tja, här är vi de stolta ägarna av ett Let'sEncrypt-certifikat i 90 dagar, men nu måste vi ladda upp det till Docker.
För att göra detta, på det mest triviala sättet, i docker-compose.yml, i nginx-sektionen, länkar vi katalogerna.
Exempel docker-compose.yml med 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"
Länkat? Bra - låt oss fortsätta:
Nu måste vi ändra konfigurationen nginx att arbeta med 443 hamn och SSL allmänt:
Exempel main.conf config med 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;
}
}
Efter dessa manipulationer går vi faktiskt till katalogen med Docker-compose, skriver docker-compose up -d. Och vi kontrollerar funktionaliteten hos SSL. Allt ska ta fart.
Det viktigaste är att inte glömma att Let'sEnctypt-certifikatet utfärdas i 90 dagar och du måste förnya det genom kommandot sudo certbot renew
, och starta sedan om projektet med kommandot docker-compose restart
Ett annat alternativ är att lägga till denna sekvens i crontab.
Enligt min mening är detta det enklaste sättet att ansluta SSL till Docker Web-app.
PS Ta hänsyn till att alla skript som presenteras i texten inte är slutgiltiga, projektet är nu på det djupa utvecklingsstadiet, så jag skulle vilja be dig att inte kritisera konfigurationerna - de kommer att ändras många gånger.
Källa: will.com