Делаем сервер из linux

Локальный веб-сервер под Linux, с автоматическим поднятием хостов и переключением версий PHP

Скорее всего какие-то части этой статьи уже знакомы многим хаброжителям, но в связи с покупкой нового рабочего ноутбука я решил собрать все крупинки воедино и организовать удобное средство для разработки. Мне часто приходится работать со множеством маленьких проектов, с разными версиями PHP, часто переводить старые проекты на новые версии. В далёком прошлом, когда я был пользователем Windows то использовал OpenServer. Но с переходом на Linux мне нехватало той простоты создания хостов и переключений версий которые были в нём. Поэтому пришлось сделать еще более удобное решение на Linux =)

Цели

  1. Использовать текущий на момент написания статьи софт
  2. Чтоб разграничить локальные домены, будем использовать специальный домен .loc
  3. Переключения версий PHP реализуем через поддомен c помощью fast-cgi
  4. Автоматическое создание хоста с помощью 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 скриптов

Читайте также:  Настройка двух провайдеров linux

И 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 

Источник

Делаем домашний сервер из старого железа

Делаем домашний сервер из старого железа

Пару лет назад, я начал делать свои проекты, которые требуют постоянно работающего хостинга. По совету друга начал использовать для этих целей дешевые и удобные vps от digital ocean. За 5$ вы получается 1GB RAM, 20GB SSD и 99% uptime.

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

Я решил, что можно съэкономить, если собрать свой сервачок из барахла которое у меня есть и возможно, докупив что-то на Авито.

Hardware

Что мы имеем на старте — блок питания, HDD на 80GB. На этом все) Все остальное, что я нашел у себя, было довольно древним.
Что нужно докупить — проц, материнская плата и оперативка.
Что мне подвернулось на авито — Intel Core 2 Duo e5400, MSI g31tm-p21 и RAM на 1GB (далее расширим).

photo_2020-04-28-11.23.17

Конечно, нашлось все это не сразу. Разок я обжогся на том, что старые материнки бывают без встроенной видюхи, а linux может с внешней картой и не подружиться. Поэтому примерял на себя роль барыги на авито)
Обжегся кстати и на том, что некоторые материнки не работают с БП у который 20 пинов (а не 24). Решилось это, конечно, перепайкой на коленке.

bp

Собираем все это в корпус. Не хочется иметь эту здоровенную коробку из стандартного системника, поэтому я собрал корпус из подручных деревях. Теперь все это помещается на столе (но в итоге будет закинуто на балкон для лучшего охлаждения)
photo_2020-04-28-11.23.24
photo_2020-04-28-11.23.30

Ubuntu Server

Настало время поставить линь на эту машинку. Я не особо мастер выбирать какой линукс лушче, взял то, что вертится на digital ocean — Ubuntu server 18.04.
Записал на флешку образ при помощи balenaEtcher для macOs. До этого было пару попыток записать образ чеез unetBootin, однако все попытки поставить после этого систему заканчивались неудачей. Виноват конечно не unetBootin, а то что на флешке было почему то 2 раздела и видимо грузился не тот, который нужен. Заметить я это смог только через дисковую утилиту на маке.

lin

Установка занимается минут 20. Пару раз установка заходила в тупик, когда я подключал сетевой кабель и установщик пытался загрузить какие-то пакеты для устновки. Поэтому успешная установка была без автоматической настройки сети, и настраивать мне потом ее пришлось вручную.
В процессе можно выбрать установку OpenSSH, которая позволит вам из коробки подключаться по ssh (ну после того как вы потратите вечерок на настройку сетки).

Настройка

В итоге когда все установлено, начинаем играться с сеткой. Изначально она лежит и есть несколько сетевых интерфейсов, которые нам выдает ifconfig -a .

Туториалы говорят копать в сторону /etc/init.d/networking или пакета networkManager, но их в системе нет.

В итоге накопал встроенную тулзу netplan, которая позволяет сконфигурировать сетку и запустить ее. Скорее всего в системе уже есть какой-то конфиг файл, который нужно отредактировать (если нет, просто создйте новый)

cd /etc/netplan nano init.yaml 

Для того чтобы поднять сеть по ethernet кабелю, добавим такой конфиг:

network: renderer: networkd ethernets: enp2s0: dhcp4: yes 

enp2s0 — имя нашего интерфейса (узнать можно из команды ifconfig -a),
dhcp4: yes — говорит о том, что мы будет автоматически получать ip адрес

и вот у нас поднятная сеть.

Однако тянуть провод на балкон через всю квартиру нет особого желания, поэтому добавим wifi адаптер tp-link tl-wn821N. Цена вопроса 700 рублей.

Чтобы он заработал на линуксе поставим драйвера. Их можно найти на оф сайте. Кстати там есть инструкция по установке на линь.

Можем собрать их из сорцов, а можем просто прописать

 wpa_supplicant –Dnl80211 –iwlan1 –c ./ wpa_0_8.conf -B 

где wpa_0_8.conf файл из архива с драйверами

Возможно придется установить пакет wpasupplicant.

И добавим конфиг для netplan

wifis: wlxd03745688b40: dhcp4: yes dhcp6: yes access-points: "TP-LINK_B29E": password: "password" 

где wlxd03745688b40 — имя нашего сетевого интерфейса

Далее настроим автоматический запуск сервера, как только подано питание. Для этого в биос выберем пункт restore on ac power loss — power on

Доработки

Эта статья по большей степени для меня самого, чтобы не забыть на какие грабли наступал и как с этим боролся. Буду рад, если она окажется полезной и вам!

Кстати, завел личный блог Sleepless Tech в Telegram про разработку и DIY, заходите!

И присоединяйтесь к каналам FrontEndDev и Web Stack в Telegram, чтобы не пропустить самое интересное из мира Web!

Jem

Jem

Источник

Оцените статью
Adblock
detector