Docker web uygulaması için SSL sertifikası

Bu yazımda sizlerle Docker üzerinde çalışan web uygulamanız için SSL sertifikası oluşturma yöntemini paylaşmak istiyorum çünkü... İnternetin Rusça kısmında böyle bir çözüm bulamadım.

Docker web uygulaması için SSL sertifikası

Kesimin altında daha fazla ayrıntı var.

Docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 ve bir litre saf Let'sEncrypt'imiz vardı. Üretimi Docker'da dağıtmak gerekli değildir. Ancak Docker'ı oluşturmaya başladığınızda onu durdurmak zorlaşır.

Başlangıç ​​olarak, geliştirme aşamasında sahip olduğumuz standart ayarları vereceğim. genel olarak 443 numaralı bağlantı noktası ve SSL olmadan:

liman işçisi-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;
}

Daha sonra, aslında SSL uygulamamız gerekiyor. Dürüst olmak gerekirse, com bölgesini incelemek için yaklaşık 2 saat harcadım. Orada sunulan tüm seçenekler ilginç. Ancak projenin şu anki aşamasında, bizim (işletmenin) hızlı ve güvenilir bir şekilde vidalamamız gerekiyordu. SSL Let'sEnctypt к nginx konteyner ve daha fazlası değil.

Öncelikle sunucuya kurduk Certbot
sudo apt-get install certbot

Daha sonra alan adımız için joker karakter sertifikaları oluşturduk

sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns


Yürütmenin ardından certbot bize DNS ayarlarında belirtilmesi gereken 2 TXT kaydını sağlayacaktır.

_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}


Ve enter'a basın.

Bundan sonra certbot bu kayıtların DNS'de varlığını kontrol edecek ve sizin için sertifikalar oluşturacaktır.
bir sertifika eklediyseniz ancak Certbot bulamadım - 5-10 dakika sonra komutu yeniden başlatmayı deneyin.

İşte 90 gün boyunca Let'sEncrypt sertifikasının gururlu sahibiyiz, ancak şimdi onu Docker'a yüklememiz gerekiyor.

Bunu yapmak için en önemsiz şekilde docker-compose.yml'deki nginx bölümünde dizinleri bağlarız.

SSL ile docker-compose.yml örneği

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"

Bağlantılı mı? Harika - devam edelim:

Şimdi yapılandırmayı değiştirmemiz gerekiyor nginx birlikte çalışmak 443 liman ve SSL genel olarak:

SSL ile örnek main.conf yapılandırması

#
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;
	}
}

Aslında bu manipülasyonlardan sonra Docker-compose ile dizine gidiyoruz, docker-compose up -d yazıyoruz. Ve SSL'nin işlevselliğini kontrol ediyoruz. Her şey yola çıkmalı.

Önemli olan Let'sEnctypt sertifikasının 90 gün süreyle verildiğini ve komut aracılığıyla yenilemeniz gerekeceğini unutmamak. sudo certbot renewve ardından projeyi komutla yeniden başlatın. docker-compose restart

Başka bir seçenek de bu diziyi crontab'a eklemektir.

Bana göre bu, SSL'yi Docker Web uygulamasına bağlamanın en kolay yoludur.

Not: Lütfen metinde sunulan tüm komut dosyalarının nihai olmadığını, projenin şu anda derin Geliştirme aşamasında olduğunu dikkate alın, bu nedenle sizden yapılandırmaları eleştirmemenizi rica ediyorum; bunlar birçok kez değiştirilecektir.

Kaynak: habr.com

Yorum ekle