VPS решил настраивать „с нуля“, следуя руководствам на сайте DigitalOcean и кое-где ещё.
HTTP
В качестве веб-сервера я решил поставить Nginx. Он офигенно быстрый и тратит минимум ресурсов. Плюс конфигурация проще и удобнее, чем у Apache. Быстренько запихал регулярное выражение для URL Rewrite, подставил старый redirector.php, чтобы тот за всё отдувался, и порядок 🙂
SSL
В отличие от Amazon Web Services и Google Cloud Platform, где нужно платить за каждый чих, на VPS от DigitalOcean можно творить, что угодно. Например, поставить на сервер сертификат и открыть доступ на сайт по HTTPS. В дополнение к двухфакторной аутентификации в WordPress получается совсем секьюрно.
Раньше я ставил бесплатные 90-дневные сертификаты от SSL.com, и их приходилось менять 4 раза в год. Теперь решил попробовать годовые бесплатные сертификаты от StartCom. Пришлось долго разбираться, как у них всё работает, т.к. сайт не из числа user-friendly. Основной затык был с экспортом сертификата и закрытого ключа для авторизации на сайте StartCom – меня угораздило активировать регистрацию не на основном компьютере. Обычно бюро сертификации авторизуют пользователей по логину/паролю, а эти израильские ребята настроили авторизацию по сертификатам. Хотя StartCom выдаёт годовой сертификат, проверки домена проходят раз в месяц. В общем, посмотрим, будет ли это в итоге дешевле по затратам времени, чем 90-дневные сертификаты SSL.com.
PHP5-FPM и MySQL
Тут практически без сложностей, пришлось подредактировать php.ini, увеличив лимит размера загружаемых файлов. Ещё понадобилось строго ограничить количество экземпляров PHP5, запускаемых одновременно при повышении нагрузки на сервер (оперативная память не резиновая).
В MySQL отключил InnoDB (требует больше ресурсов, чем MyISAM):
skip-innodb
default-storage-engine = MyISAM
уменьшил максимально возможное число соединений:
max_connections = 20
и сократил объём логов в двоичном формате:
expire_logs_days = 4
max_binlog_size = 32M
Кстати, для увеличения производительности WordPress полезно указать адрес хоста базы данных localhost – тогда на UNIX в порядке приоритета будет использоваться подключение к сокету вместо TCP/IP:
define('DB_HOST', 'localhost');
или даже указать сокет явно:
define('DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock');
VPN
Я принципиально не держу сайт на сервере, расположенном в российской юрисдикции. Не потому, будто у меня противоправные материалы размещены, а потому, что наше идиотское законодательство позволяет запросто изъять у хостера сервер целиком со всеми обслуживающимися на нём сайтами. Кроме того, у нас хостить сайт неоправданно дорого.
Но теперь мракобесные законы пошли дальше и сайты просто бликируют за наличие чего-то – по решению суда (хоть в Чечне) и по иным основаниям. Поскольку блокируют у нас тупо по IP-адресу, заодно недоступны и все остальные сайты, которые хостятся на том же IP. В результате уже довольно часто можно столкнуться с тем, что доступ к тому или иному вполне безобидному сайту „ограничен по решению суда или иным основаниям, установленным законодательством РФ“. Очень мило.
В общем, очевидный шаг – использование личного VPN. Моя попытка настроить „сильного лебедя“ (StrongSwan) не увенчалась успехом, поэтому я остановился на OpenSwan и реализации VPN на L2TP/IPSec.
Fail2Ban
Проверяя, успешно ли происходит авторизация пользователя VPN, тут же заметил „левые“ записи в логе – какой-то бот уже пытается подобрать пароль рута. Отлично, думаю, спасибо за напоминание. Fail2ban отправляет IP-адрес таких брутфорсеров в чёрный список. На сутки, для начала.