Локальный веб-сервер под Linux, с автоматическим поднятием хостов и переключением версий PHP
Скорее всего какие-то части этой статьи уже знакомы многим хаброжителям, но в связи с покупкой нового рабочего ноутбука я решил собрать все крупинки воедино и организовать удобное средство для разработки. Мне часто приходится работать со множеством маленьких проектов, с разными версиями PHP, часто переводить старые проекты на новые версии. В далёком прошлом, когда я был пользователем Windows то использовал OpenServer. Но с переходом на Linux мне нехватало той простоты создания хостов и переключений версий которые были в нём. Поэтому пришлось сделать еще более удобное решение на Linux =)
Цели
- Использовать текущий на момент написания статьи софт
- Чтоб разграничить локальные домены, будем использовать специальный домен .loc
- Переключения версий PHP реализуем через поддомен c помощью fast-cgi
- Автоматическое создание хоста с помощью vhost_alias и dnsmasq
будет запущен тот же файл но уже с версией PHP 7.2.7
Другие версии доставляются аналогичным описанным ниже способом.
Для создания еще одного сайта просто создаем в /var/www/ папку имеющую окончание .loc, внутри которой должна быть папка public_html являющаяся корнем сайта
Вот собственно и все. Как без дополнительных мучений, перезапусков, и редактирований конфигов имеем автоматическую систему для работы с сайтами.
Всё это я проверну на LinuxMint19, он на базе Ubuntu18.04, так что с ним все будет аналогично.
Для начала поставим необходимые пакеты
sudo apt update sudo apt install build-essential pkg-config libxml2-dev libfcgi-dev apache2 libapache2-mod-fcgid postfix
Postfix ставим в качестве плюшки, как простое решение(в мастере установки, всё по умолчанию выбираем) для отправки почты с локальной машины.
Так как это локальная разработка и я единственный пользователь. То мне удобней перенести папку с проектами в мою домашнюю дерикторию. Она у меня маунтится отдельным диском и мигрирует при переустановке системы. Самый простой способ это создать ссылку, тогда не нужно менять пути в настройках да и путь привычный для всех.
Скопируем папку созданную апачем в домашний каталог, создадим на ее месте ссылку, не забыв поменять пользователя на себя и обменяться группами с апачем.
sudo mv /var/www/ ~/www sudo ln -s ~/www /var/www sudo chown $USER:$USER -R ~/www sudo usermod -a -G www-data $USER sudo usermod -a -G $USER www-data
Создадим папку в которой будем собирать исходники PHP для разных версий
sudo mkdir /usr/local/src/php-build
Также нам понадобится папки для CGI скриптов
И runtime папка для этих же скриптов, с правами
sudo mkdir /var/run/mod_fcgid sudo chmod 777 /var/run/mod_fcgid
И так как каталог у нас находится в оперативной памяти, добавим его создание при старте системы, для этого добавим в /etc/tmpfiles.d/fcgid.conf
#Type Path Mode UID GID Age Argument d /var/run/mod_fcgid 0755 www-data www-data - -
У меня dnsmasq-base идет с коробки, если нет то его всегда можно доставить.
sudo updatedb locate dnsmasq.conf
Либо если он как и у меня является частью NetworkManager то создать новый файл конфигурации в /etc/NetworkManager/dnsmasq.d/local.conf
Добавим в него строчку для перенаправление нашего локального домена на локальную машину.
Также нужно включить необходимые модули апача
sudo a2enmod fcgid vhost_alias actions rewrite
Предварительная подготовка завершена, приступаем к сборке различных локальных версий PHP. Для каждой версии PHP проделываем следующие 4 шага. На примере 5.6.36
1. Скачиваем исходники нужной версии и распаковываем их
cd /usr/local/src/php-build sudo wget http://pl1.php.net/get/php-5.6.36.tar.bz2/from/this/mirror -O php-5.6.36.tar.bz2 sudo tar jxf php-5.6.36.tar.bz2
2. Cобираем из исходников нужную версию PHP, и помещаем ее в /opt/php-5.6.36
sudo mkdir /opt/php-5.6.36 cd php-5.6.36 sudo ./configure --prefix=/opt/php-5.6.36 --with-config-file-path=/opt/php-5.6.36 --enable-cgi sudo make sudo make install sudo make clean
3. Создаем CGI для обработки этой версии в /var/www/cgi-bin/php-5.6.36.fcgi
#!/bin/bash PHPRC=/opt/php-5.6.36/php.ini PHP_CGI=/opt/php-5.6.36/bin/php-cgi PHP_FCGI_CHILDREN=8 PHP_FCGI_MAX_REQUESTS=3000 export PHPRC export PHP_FCGI_CHILDREN export PHP_FCGI_MAX_REQUESTS exec /opt/php-5.6.36/bin/php-cgi
4. Делаем файл исполняемым
sudo chmod +x /var/www/cgi-bin/php-5.6.36.fcgi
5. Добавляем экшен для обработки каждой версии в /etc/apache2/mods-available/fcgid.conf
AddHandler fcgid-script fcg fcgi fpl Action application/x-httpd-php-5.6.36 /cgi-bin/php-5.6.36.fcgi AddType application/x-httpd-php-5.6.36 .php #Action application/x-httpd-php-7.2.7 /cgi-bin/php-7.2.7.fcgi #AddType application/x-httpd-php-7.2.7 .php FcgidIPCDir /var/run/mod_fcgid FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm FcgidConnectTimeout 20 AddHandler fcgid-script .fcgi
6. Добавляем правило для обработки каждой версии в /etc/apache2/sites-available/000-default.conf
#Универсальный ServerNamе ServerAlias *.loc #Алиас для CGI скриптов ScriptAlias /cgi-bin /var/www/cgi-bin #Универсальный DocumentRoot VirtualDocumentRoot /var/www/%2+/public_html #Директория тоже должна быть универсальной Options +ExecCGI -Indexes AllowOverride All Order allow,deny Allow from all #Ниже все условия для каждой из версий =~ /56\..*?\.loc/"> SetHandler application/x-httpd-php-5.6.36 #По умолчанию, если версия не указанна, запускаем на последней SetHandler application/x-httpd-php-7.2.7 ErrorLog $/error.log CustomLog $/access.log combined
Ну вот и всё. Осталось только перезапустить apache и dnsmasq и пользоваться
sudo service apache2 restart sudo service network-manager restart
Свой Linux сервер в интернете. Как настроить «безопасность»
Приветствую Вас, друзья! Эта статья представляет собой очередной флешбэк из админского прошлого. буквально сегодня мне написал хороший товарищ, программист, с вопросом — как ему лучше для своего «домашнего» проекта настроить сервер. Цитата дословно (без ссылки на автора просто):
Нужен совет. Есть VDS, торчит в интернете(сайте). Какие вещи я должен на нем сконфигурировать с точки зрения секьюрности? Кроме того чтобы настроить ssh на нестандартном порту с аутентификацией по ключу и запретить ssh для рута? Может надо как-то правильно расставить права на папки, может включить какие-то дополнительные механизмы, что-то в этом духе? А может и не надо больше ничего. Мне не надо упарываться по самые бубенцы, просто хочу немного обезопасить себя.
Вопрос как оказалось очень даже актуальный. Да, если вы регулярно администрирует Linux и веб сервера, казалось бы, «что тут сложного» и «как это программист не знает». А вот очень просто. Ну не работает человек с этим постоянно. Имеет право не знать. Поэтому сегодня мы поговорим с Вами о настройке Linux сервера под сайт или любое другое веб приложение, в случаях когда этот самый сервер должен быть доступен из публичной сети интернет. Погнали!
Первое, о чем мы с Вами условимся — это не будет стандартный шаблонный How-to гайд с тонной команд без комментариев, мол вот это и это сделай и будет тебе счастье. Таким, простите за мой французский, низкопробным шлаком, Интернет переполнен. Я буду говорить о том что нужно сделать, как и почему, давая ссылки на документацию или авторитетные источники и уже в последнюю очередь — может буду приводить команды.
Второе о чем мы с Вами условимся — если будут примеры, они будут привязаны к Ubuntu как к ОС Вашего сервера. Сейчас любой Облачный провайдер или хостинговая компания позволяет Вам развернуть свой виртуальный сервер на базе этого Linux дистрибутива. Она ( Ubuntu) дружественна к пользователям, есть поддержка всего программного обеспечения какое только существует под Linux и т.д. Опять же, никто не мешает Вам применять эти рекомендации для любого другого дистрибутива, например Centos, просто используя другой набор команд. Например для установки ПО.
Третье и самое главное — это НЕ исчерпывающее руководство. Это просто список тех МИНИМАЛЬНЫХ мер «гигиены» которые Вы должны предпринять или убедиться что они предприняты по умолчанию, чтобы Ваш сервер хорошо себя чувствовал и радовал Вас стабильным аптаймом
Настройки ОС
Нус, с чего нам стоить начать?
Пункт первый — ставьте обновления! Черт возьми- первым делом после установки сервера — ставьте обновления! И в дальнейшем старайтесь про ни не забывать. Обновления в первую очередь закрывают баги и дыры в безопасности.
Шаг Второй — заведи учетную запись отличную от root. В 99% случаев аренды vps/vds Вам отдают виртуальную машину с единственной учетной записью — root. Это нормально. не нормально — оставлять ее просто так. Заведите отдельную учетку, с правами на sudo или без — уже Вам решать. Но сделайте это. А так же смените root пароль, чтобы не оставлять тот, который Вам изначально сгенерировал хостер. Мало ли что.
Кстати «о птичках» — если работать на сервере Вы будете не один, используя sudoers файлы, можно отлично «нарезать» привелегированный доступ другим сотрудникам, не выдавая им при этом возможность завладеть root привелегиями. Вот пример часто используемого мною файла sudoers, чтобы предоставить например веб-разработчикам на «продакшен» сервере довольно широкие права для исследования проблемы, но при этом без полного доступа к системе: