Переводим wordpress на HTTPS + nginx

Если Вы ещё не в курсе, гугл уже давно https сайты ранжирует выше, чем http. А в ближайших планах он начнёт помечать все http сайты как небезопасные. К счастью "Let's Encrypt" предоставляет бесплатные сертификаты.

Первое что нужно сделать это ознакомиться с инструкцией: https://letsencrypt.org/getting-started/

Из которой мы узнаём что нам нужны Certbot и shh доступ к серверу. На этом месте я передаю пламенный привет всем любителям shared хостингов и конструкторов сайтов. 5$ за собственный сервер это так дорого, Вы же не лохи, у Вас же серьёзный бизнес.

Если у Вас нет ssh доступа к серверу, или Вы не знаете что это, не читайте дальше.

Получаем https сертификат

Заходим на страницу Certbot: https://certbot.eff.org/#ubuntuxenial-nginx и читаем её внимательно.

Действуем по инструкции, устанавливаем letsencrypt:

sudo apt-get install letsencrypt

Останавливаем nginx:

sudo service nginx stop

Сервер можно не останавливать, но тогда придётся сперва его переконфигурировать, чтобы доступ к папке /.well-known был всегда открыт.

Теперь получаем сам сертификат:

letsencrypt certonly --standalone -d example.com -d www.example.com

В процессе Вас попросят согласиться с условиями использования:

и ввести email для связи:

Файлы сертификата будут лежать в папке: /etc/letsencrypt/archive/_ВАШ_ДОМЕН, а в папке /etc/letsencrypt/live/_ВАШ_ДОМЕН будут лежать симлинки, которые нам потребуются позднее. Сертификаты, обязательно, забэкапте.

Переконфигурируем nginx под https

Открываем конфигурационный файл Вашего веб-сайта, это будет что-то вроде: /etc/nginx/sites-available/default

Всё где есть упоминание 80 порта комментируем, или удаляем, например:

listen 80;
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

И все подобные строки. Вместо них добавляем:

listen 443 ssl;
server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;

Этим мы сообщили серверу, что слушать нужно ssl порт, а не http. Далее добавляем поддержку сертификата:

ssl_certificate /etc/letsencrypt/live/_ВАШ_ДОМЕН_/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/_ВАШ_ДОМЕН_/privkey.pem;

Запускаем nginx:

service nginx start

И проверяем. Теперь адрес http://_ВАШ_ДОМЕН_ не должен открываться, зато адрес https://_ВАШ_ДОМЕН_ должен работать.

Фиксим, в этот же конф. файл добавляем секцию:

>
server {
        listen 80;
        server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;
        return 301 https://$host$request_uri;
}

Перезапускаем nginx:

service nginx restart

Опять проверяем адрес: http://_ВАШ_ДОМЕН_ сейчас он должен автоматически редиректиться на https адрес.

Теоретически, теперь у нас всё готово. Но мы можем ещё улучшить шифрование. Давайте cгенерируем сильную группу Дефи-Хелмана:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

И допишем конфиг nginx:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;

Итоговый конфиг для nginx с https:

server {
        listen 80;
        server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name _ВАШ_ДОМЕН_ www._ВАШ_ДОМЕН_;

        ssl_certificate /etc/letsencrypt/live/_ВАШ_ДОМЕН_/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/_ВАШ_ДОМЕН_/privkey.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

        root /var/www/_ВАШ_ДОМЕН_;
        index index.html index.htm index.php;

        proxy_read_timeout 20;
        proxy_send_timeout 20;

        gzip on;
        gzip_disable "msie6";
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;

        location ~ /. {
                deny all;
        }

        location ~* /(?:uploads|files)/.*.php$ {
                deny all;
        }

        location = /xmlrpc.php {
                deny all;
                access_log off;
                log_not_found off;
        }

        location ~* ^.+.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
                access_log off;
                log_not_found off;
        }

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ .php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }
}


Express API сервер Часть 3, process manager

Сейчас у нас есть практически готовый проект. Мы принимаем запросы, отправляем ответы, есть немного тестов и вроде всё ок. Но в продакшен нам ещё рано. Давайте создадим гипотетическую ситуацию, например, у нас есть в коде ошибка, приводящая к падению проекта, о которой мы типа не знаем.

Задачи по Javascript используемые на интервью

Совсем недавно я проходил пачку интервью в несколько крупных компаний. Это будет небольшой сборник задач, которые меня просили решить прям на интервью.


(2) Комментариев

alex - 26.09.2019 11:53:17
- 0    + 0
автор забыл указать, что это все нужно делать только если вам нечем заняться и
хочется позадротствовать. На самом деле сербот все настройки делает автоматически и все что нужно это:
sudo certbot --nginx
-----------------------------------
Полная инструкция перевода - перевел так сервер в https на котором крутилось 3 сайта:
Подготовляшка к установке софта:
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

Сама установка софта:
sudo apt-get install certbot python-certbot-nginx
Перевод в https на автомате (установщик сам создаст сертификаты, сам их засунет в нужные папки, сам их в расписание впихнет, вы ничего не делаете):
sudo certbot --nginx
готово.
делал все на убунте
Ilya - 27.09.2019 06:52:24
- 0    + 0
Ага, автор частенько любит позадротить. И почти все мои инструкции- это просто напоминалка самому себе, как и что я делал.