في هذه المقالة ، أود أن أشاطركم كيفية إنشاء شهادة طبقة مآخذ توصيل آمنة (SSL) لتطبيق ويب Docker ، مثل في الجزء باللغة الروسية من الإنترنت - لم أجد حلاً مماثلاً.

مزيد من التفاصيل تحت خفض.
كان لدينا عامل تشغيل v.17.05 ، عامل إنشاء v.1.21 ، Ubuntu Server 18 و نصف لتر من Let'sEncrypt النظيف. ليس من الضروري نشر الإنتاج على Docker. ولكن إذا بدأت في جمع Docker ، فسيصبح من الصعب التوقف.لذلك ، بالنسبة للمبتدئين ، سأعطيك الإعدادات القياسية - التي كانت لدينا في مرحلة التطوير ، أي بدون 443 منفذًا و SSL بشكل عام:
عامل ميناء-compose.ymlversion: '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; }
بعد ذلك ، نحتاج إلى تطبيق طبقة المقابس الآمنة. بصراحة - لقد درست منطقة com I بترتيب ساعتين. جميع الخيارات المقترحة هناك مثيرة للاهتمام. ولكن في المرحلة الحالية من المشروع ، نحن (العمل) نحتاج إلى
ربط SSL Let'sEnctypt بسرعة وبشكل موثوق إلى حاوية
nginx وليس أكثر.
بادئ
ذي بدء ، قمنا بتثبيت
certbot على الخادم
sudo apt-get install certbot
بعد ذلك ، أنشأنا شهادات بدل لنطاقنا
sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns
بعد التنفيذ ، سوف يزودنا certbot بسجلين TXT يلزم تحديدهما في إعدادات DNS.
_acme-challenge.stomup.ru TXT {CertBot}
ثم اضغط إدخال.
بعد ذلك ، سيتحقق 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
sudo certbot renew
بدلاً من ذلك ، أضف هذا التسلسل إلى crontab.
في رأيي ، هذه هي أسهل طريقة لتوصيل SSL بتطبيق Docker Web.
ملاحظة: يرجى مراعاة أن جميع النصوص المعروضة في النص ليست نهائية ، والآن المشروع في مرحلة التطوير العميق ، لذلك أريد أن أطلب منك عدم انتقاد ملفات التكوين - سيتم تعديلها عدة مرات.