Σε αυτό το άρθρο, θέλω να μοιραστώ μαζί σας μια μέθοδο για τη δημιουργία πιστοποιητικού SSL για την εφαρμογή web που εκτελείται στο Docker, επειδή... Δεν βρήκα τέτοια λύση στο ρωσόφωνο τμήμα του Διαδικτύου.
Περισσότερες λεπτομέρειες κάτω από το κόψιμο.
Είχαμε docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 και μια πίντα καθαρού Let'sEncrypt. Δεν είναι ότι είναι απαραίτητο να αναπτυχθεί η παραγωγή στο Docker. Αλλά μόλις ξεκινήσετε την κατασκευή του Docker, γίνεται δύσκολο να σταματήσετε.
Λοιπόν, για αρχή, θα δώσω τις τυπικές ρυθμίσεις - που είχαμε στο στάδιο του dev, δηλ. χωρίς θύρα 443 και SSL γενικά:
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;
}
Στη συνέχεια, πρέπει πραγματικά να εφαρμόσουμε SSL. Για να είμαι ειλικρινής, πέρασα περίπου 2 ώρες μελετώντας το com zone. Όλες οι επιλογές που προσφέρονται εκεί είναι ενδιαφέρουσες. Αλλά στο τρέχον στάδιο του έργου, εμείς (η επιχείρηση) έπρεπε να βιδώσουμε γρήγορα και αξιόπιστα SSL Let'sEnctypt к nginx δοχείο και τίποτα περισσότερο.
Πρώτα απ 'όλα, το εγκαταστήσαμε στον διακομιστή certbot
sudo apt-get install certbot
Στη συνέχεια, δημιουργήσαμε πιστοποιητικά μπαλαντέρ για τον τομέα μας
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
μετά την εκτέλεση, το certbot θα μας παράσχει 2 εγγραφές TXT που πρέπει να καθοριστούν στις ρυθμίσεις DNS.
_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}
Και πατήστε enter.
Μετά από αυτό, το certbot θα ελέγξει για την παρουσία αυτών των εγγραφών στο DNS και θα δημιουργήσει πιστοποιητικά για εσάς.
εάν έχετε προσθέσει πιστοποιητικό αλλά certbot δεν το βρήκα - δοκιμάστε να επανεκκινήσετε την εντολή μετά από 5-10 λεπτά.
Λοιπόν, εδώ είμαστε οι περήφανοι κάτοχοι ενός πιστοποιητικού Let'sEncrypt για 90 ημέρες, αλλά τώρα πρέπει να το ανεβάσουμε στο Docker.
Για να γίνει αυτό, με τον πιο τετριμμένο τρόπο, στο docker-compose.yml, στην ενότητα nginx, συνδέουμε τους καταλόγους.
Παράδειγμα docker-compose.yml με 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"
Συνδεδεμένοι; Τέλεια - ας συνεχίσουμε:
Τώρα πρέπει να αλλάξουμε τις ρυθμίσεις nginx για να δουλέψω με 443 λιμάνι και SSL γενικά:
Παράδειγμα διαμόρφωσης main.conf με 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;
}
}
Στην πραγματικότητα, μετά από αυτούς τους χειρισμούς, πηγαίνουμε στον κατάλογο με Docker-compose, γράφουμε docker-compose up -d. Και ελέγχουμε τη λειτουργικότητα του SSL. Όλα πρέπει να απογειωθούν.
Το κύριο πράγμα είναι να μην ξεχνάτε ότι το πιστοποιητικό Let'sEnctypt εκδίδεται για 90 ημέρες και θα πρέπει να το ανανεώσετε μέσω της εντολής sudo certbot renew
, και στη συνέχεια επανεκκινήστε το έργο με την εντολή docker-compose restart
Μια άλλη επιλογή είναι να προσθέσετε αυτήν την ακολουθία στο crontab.
Κατά τη γνώμη μου, αυτός είναι ο ευκολότερος τρόπος για να συνδέσετε το SSL με την εφαρμογή Web Docker.
Υ.Γ. Λάβετε υπόψη σας ότι όλα τα σενάρια που παρουσιάζονται στο κείμενο δεν είναι οριστικά, το έργο βρίσκεται τώρα στο στάδιο Dev Dev, οπότε θα ήθελα να σας ζητήσω να μην επικρίνετε τις ρυθμίσεις παραμέτρων - θα τροποποιηθούν πολλές φορές.
Πηγή: www.habr.com