А так же о всякой фигне
Если Вы ещё не в курсе, гугл уже давно https сайты ранжирует выше, чем http. А в ближайших планах он начнёт помечать все http сайты как небезопасные. К счастью "Let's Encrypt" предоставляет бесплатные сертификаты.
Первое что нужно сделать это ознакомиться с инструкцией: https://letsencrypt.org/getting-started/
Из которой мы узнаём что нам нужны Certbot и shh доступ к серверу. На этом месте я передаю пламенный привет всем любителям shared хостингов и конструкторов сайтов. 5$ за собственный сервер это так дорого, Вы же не лохи, у Вас же серьёзный бизнес.
Если у Вас нет ssh доступа к серверу, или Вы не знаете что это, не читайте дальше.
Заходим на страницу 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/_ВАШ_ДОМЕН будут лежать симлинки, которые нам потребуются позднее. Сертификаты, обязательно, забэкапте.
Открываем конфигурационный файл Вашего веб-сайта, это будет что-то вроде: /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;
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 используемые на интервью
Совсем недавно я проходил пачку интервью в несколько крупных компаний. Это будет небольшой сборник задач, которые меня просили решить прям на интервью.