Skip to main content

nginx: советы и шпаргалки

Настройки безопасности

Чтобы не светить версии nginx и php делаем следующее: в файле /etc/nginx/nginx.conf в секции http дописываем:

а в файле /etc/php.ini дописываем:

Рестартуем сервисы:

Проверяем командой:

Прикрутка GeoIP

Если по  nginx -V  не находим опцию --with-http_geoip_module, но у нас CentOS 7, то, начиная с версии nginx-1.10.0, выход есть:

Либа будет установлена в /usr/lib64/nginx/modules:

Скачиваем и разворачиваем:

Далее в секции http конфига nginx прописываем пути к скаченным БД (страны, города, провайдеры):

А вне любых секций  конфига nginx добавить:

Теперь перегружаем nginx:

Вообще говоря, в  директиве geoip_org можно указать БД провайдеров или организаций, но в nginx нельзя иметь одновременно подключенные обе БД — надо определиться с тем что подключать.

Теперь можно, там где надо, передавать необходимые fastcgi параметры (имеет смысл добавить эти параметры в конец файла /etc/nginx/fastcgi_params):

Тестируем работоспособность, включив в секцию server следующий код (понадобится установленный и подключенный в конфиге модуль echo-nginx-module):

либо кодом php:

Запрет посещения средствами nginx для определенных стран

В ситуации, когда необходимо заблокировать доступ к хосту пользователям из определенных стран, используются также базы GeoIP для определения принадлежности к стране. Одной из разновидностей задачи является показ сайта на языке, нативном для страны нахождения постетителя.

Впишем следующий маппинг в секцию http конфига nginx:

Это пример пермиссивной политики: доступ всем, кроме …
Для того чтобы наоборот указать кому открыть доступ, перепишем:

Теперь осталось добавить в конфиг виртуального хоста (секция server):

UPD: вариант с автообновлением GEOIP

Ставим:

GeoIP-update — для автообновления через крон. БД будут располагаться в /usr/share/GeoIP. Теперь осталось прописать в конфиге:

 

Настройка Let’s Encrypt сертификатов в LEMP на CentOS 7

Если вкратце — не нужно поднимать сервер на 9999 порту, юзаем самый простой способ webroot, это значит что letsencrypt’у достаточно указать в какой папке будет лежать файл для обмена с сервером (подтверждение прав на домен).

Забираем с гитхаба:

Просит рута, ну ок:

Питоническая шелуха имелась в системе, а теперь самое интересное: letsencrypt-auto настолько тупой, что не видит, что репозиторий EPEL уже установлен и докучи ставит зачем-то httpd, httpd-tools и mod_ssl (это жесть, господа!). Даже при вызове с опцией —dry-run!! Крайне рукожопный скрипт!
Теперь при попытке удаления httpd он заодно сносит и php, а при установке php после таки-сноса httpd, тянет в качестве зависимости опять же httpd — чтоооооооооооо??????

Ладно, сертификаты важнее, идём дальше. Я не стал конфигурировать (и перезапускать) nginx, как того рекомендуют для указания размещения папки .well-known, если будет необходимость задать расположение .well-known вне папки сайта, синтаксис такой:

далее пробуем запустить  letsencrypt-auto для нашего домена:

Успех!

Для получения доп.сертификатов для поддоменов можно указывать несколько опций -d с именами поддоменов.

Настройка SSL в nginx сводится к добавлению:

Или вот настройки, которые предлагает сам letsencrypt в файле certbot-nginx/certbot_nginx/options-ssl-nginx.conf:

Для OCSP stapling делаем следующее:

А в конфиг добавляем следующее:

После чего перегружаем конфиг nginx:

Последний штрих: автообновление сертификатов. Добавляем в /etc/crontab:

Желательно также тамже рестартануть nginx:

— первого числа каждого месяца в 2:00 будет осуществлен перевыпуск сертификатов, а в 2:05 перезачитывание конфигов nginx.

Актуальная версия справки: https://letsencrypt.readthedocs.io/en/latest/using.html#webroot

PS: если заметка помогла Вам, поделитесь ей с друзьями или коллегами: