در این مقاله میخواهم روشی را برای ایجاد گواهی SSL برای برنامه وب شما که روی Docker اجرا میشود با شما به اشتراک بگذارم، زیرا... من چنین راه حلی را در بخش روسی زبان اینترنت پیدا نکردم.
جزئیات بیشتر در زیر برش.
ما docker v.17.05، docker-compose v.1.21، سرور اوبونتو 18 و یک لیوان Let'sEncrypt خالص داشتیم. این نیست که لازم باشد تولید را در Docker مستقر کنید. اما به محض شروع ساخت داکر، توقف آن دشوار می شود.
بنابراین، برای شروع، تنظیمات استاندارد را - که در مرحله توسعه داشتیم، ارائه میدهم. بدون پورت 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 к انجیناکس ظرف و هیچ چیز دیگر
اول از همه، ما آن را روی سرور نصب کردیم certbot
sudo apt-get install certbot
در مرحله بعد، گواهی نامه های wildcard برای دامنه خود تولید کردیم
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"
مرتبط؟ عالی - بیایید ادامه دهیم:
حالا باید کانفیگ را تغییر دهیم انجیناکس برای کار با 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 به برنامه وب Docker است.
PS لطفاً در نظر داشته باشید که تمام اسکریپت های ارائه شده در متن نهایی نیستند، پروژه اکنون در مرحله Dev Dev است، بنابراین می خواهم از شما خواهش کنم که تنظیمات را مورد انتقاد قرار ندهید - آنها چندین بار اصلاح خواهند شد.
منبع: www.habr.com