Автоматическая настройка сайтов в Apache

1 minute read

Простая жизнь простых сайтов на сервере с Apache.

Пришлось мне недлать клеинту сервер на котором размещается 1000+ маленькх сайтов. Сайт представляет собой маленькую html страницу с iframe, но нужно автоматизировать процесс настройки виртуальных хостов в Apache.

Клиенту было предложено заливать сайты на сервер по фтп называть папки полными именами сайтов. Со стороны сервера был настроен pure-ftpd с виртуальных пользователем. После логина клиент попадает в папку /var/www/html, где ему предстоит создать папку с именем сайта и залить в эту папку файлы.

После чего срабатывает серверная магия и сайт становится доступен по велению волшебного basha.

Для этого в папке /etc/httpd/conf.d/ был созад шаблон:

/etc/httpd/conf.d/template
<VirtualHost *:80>
  ServerName websiterepl
  ServerAlias www.websiterepl
  DocumentRoot /var/www/html/websiterepl

  LogLevel warn
  ErrorLog /var/log/httpd/websites/error.log
  CustomLog /var/log/httpd/websites/access.log combined

  <Directory /var/www/html/websiterepl>
    Options +ExecCGI -Indexes +FollowSymLinks +MultiViews
    AllowOverride All
    Order allow,deny
    allow from all
  </Directory>
</VirtualHost>

После чего следующий скрипт обрабатывает содержание /var/www/html/ и создает для всех папок виртуальные хосты в конфиге apache.

/usr/local/bin/make_vhosts
#!/bin/bash

do_websites () {
for f in $(ls /var/www/html/);
do
  sed 's/websiterepl/'"$f"'/g' /etc/httpd/conf.d/template >> /etc/httpd/conf.d/websites.conf
  echo "" >> /etc/httpd/conf.d/websites.conf
done
}

make_logs() {
for folder in $(grep ErrorLog /etc/httpd/conf.d/websites.conf |awk '{print $2}' |sed 's/error.log//g');
do
  if [ ! -d $folder ];
  then
    mkdir -p $folder;
  fi
done
}

if [ "$1" == "force" ]
then
  rm -f /etc/httpd/conf.d/websites.conf
  do_websites
  make_logs
  service httpd reload
else

servernames=$(grep ServerName /etc/httpd/conf.d/websites.conf |wc -l)
folders=$(ls /var/www/html |wc -l)

if [ "$folders" != "$servernames" ]
then
  rm -f /etc/httpd/conf.d/websites.conf
  do_websites
  make_logs
  service httpd reload
fi
fi

С помощью crontab заставляет скрипт выполняться каждые 15 минут.

*/15 * * * * /usr/local/bin/make_vhosts_nginx 2>&1 >> /dev/null

В принцыпе в сам скрипт зашита проверка количества виртуальных хостов и сравнение их с количеством папок в /var/www/html, поэтому можно выполнять его и каждые 5 минут.

Скрипт можно запустить принудительно используя ключь force.

Categories:

Updated: