„Docker“ žiniatinklio programos SSL sertifikatas

Šiame straipsnyje noriu pasidalinti su jumis SSL sertifikato kūrimo būdu jūsų žiniatinklio programai, veikiančiai Docker, nes... Rusiškoje interneto dalyje tokio sprendimo neradau.

„Docker“ žiniatinklio programos SSL sertifikatas

Daugiau informacijos po pjūviu.

Turėjome docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 ir puslitrį gryno Let'sEncrypt. Tai nereiškia, kad būtina įdiegti gamybą „Docker“. Tačiau pradėjus kurti „Docker“ tampa sunku sustoti.

Taigi, pradžiai pateiksiu standartinius nustatymus – kuriuos turėjome kūrimo stadijoje, t.y. be 443 prievado ir apskritai 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;
}

Tada iš tikrųjų turime įdiegti SSL. Jei atvirai, aš praleidau apie 2 valandas studijuodamas kom zoną. Visi ten siūlomi variantai yra įdomūs. Tačiau dabartiniame projekto etape mums (verslui) reikėjo greitai ir patikimai suktis SSL Let'sEnctypet к nginx konteineris ir nieko daugiau.

Pirmiausia jį įdiegėme serveryje certbotas
sudo apt-get install certbot

Tada sugeneravome pakaitos simbolių sertifikatus savo domenui

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


po vykdymo certbot pateiks mums 2 TXT įrašus, kuriuos reikia nurodyti DNS nustatymuose.

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


Ir paspauskite enter.

Po to „certbot“ patikrins, ar šie įrašai yra DNS, ir sukurs jums sertifikatus.
jei pridėjote sertifikatą, bet certbotas nerado - pabandykite iš naujo paleisti komandą po 5–10 minučių.

Na, štai mes didžiuojamės „Let'sEncrypt“ sertifikato savininkais 90 dienų, bet dabar turime jį įkelti į „Docker“.

Norėdami tai padaryti, pačiu trivialiausiu būdu docker-compose.yml nginx skyriuje susiejame katalogus.

Docker-compose.yml pavyzdys su 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"

Susieta? Puiku – tęskime:

Dabar turime pakeisti konfigūraciją nginx dirbti su 443 uostas ir SSL apskritai:

Main.conf konfigūracijos su SSL pavyzdys

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

Tiesą sakant, po šių manipuliacijų einame į katalogą su Docker-compose, rašome docker-compose up -d. Ir mes patikriname SSL funkcionalumą. Viskas turėtų pakilti.

Svarbiausia nepamiršti, kad Let'sEnctypt sertifikatas išduodamas 90 dienų ir jį reikės atnaujinti per komandą sudo certbot renew, tada iš naujo paleiskite projektą naudodami komandą docker-compose restart

Kita galimybė yra pridėti šią seką prie crontab.

Mano nuomone, tai yra lengviausias būdas prijungti SSL prie „Docker“ žiniatinklio programos.

PS Atsižvelkite į tai, kad visi tekste pateikti scenarijai nėra galutiniai, projektas šiuo metu yra gilioje kūrimo stadijoje, todėl norėčiau paprašyti nekritikuoti konfigūracijų – jos bus daug kartų keičiamos.

Šaltinis: www.habr.com

Добавить комментарий