Страница 1 из 1

Генератор конфигов apache+nginx и баз mysql

Добавлено: 16 дек 2012, 22:15
Raven
Подвернулась шабашка - зацепить за сервер >50 сайтов (Debian, nginx+apache). Задачка в принципе нетривиальная, но нудная и долгая. Благо у заказчика сайты были уже залиты в папку, и лежали в папке /var/www/html в папках соответствующим доменному имени. Быстренько сообразив, что без автоматизации процесса мне не обойтись накатал по-быстрому нижеследующий скрипт:

Код: Выделить всё

#!/bin/bash                                                          

if [ ! -e /tmp/sites-available ]; then
    mkdir -p /tmp/sites-available     
fi                                    
if [ ! -e /tmp/sites-enabled ]; then  
    mkdir -p /tmp/sites-enabled       
fi                                    
if [ ! -e /tmp/nginx/vhosts.d ]; then 
    mkdir -p /tmp/nginx/vhosts.d      
fi                                    

for domain in `ls /var/www/html`; do
cat << EOF > /tmp/sites-available/${domain}.conf
<VirtualHost *:8080>                            
ServerAdmin hostmaster@${domain}                
ServerName ${domain}                            
ServerAlias http://www.${domain}                       
DocumentRoot /var/www/html/${domain}/htdocs/   

<IfModule itk.c>
    AssignUserID ftpuser ftpuser
    # MaxClientsVHost 10        
    NiceValue -4                
</IfModule>                     

<Directory /var/www/html/${domain}/htdocs/>
    Options Indexes FollowSymLinks MultiViews MultiViews
    AllowOverride All
    Order allow,deny
    Allow from All
</Directory>
</VirtualHost>
EOF

cat << EOF > /tmp/nginx/vhosts.d/${domain}.conf
server {
          listen 80;
          server_name ${domain} http://www.${domain};

          error_log       /var/log/nginx/${domain}.error.log;
          access_log /var/log/nginx/${domain}.access.log;
          charset utf8;
          client_max_body_size 2g;

          location ~* ^.+\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso)\$ {
                    root /var/www/html/${domain}/htdocs;
                    error_page 404 = @fallback;
                    error_page 405 = @fallback;
                    try_files \$uri \$uri/@fallback;
          }
          location / {
                    expires   0;
                    proxy_pass http://127.0.0.1:8080;
                    proxy_redirect off;
                    proxy_set_header Host \$host;
                    proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto \$scheme;
                    proxy_set_header X-Real-IP \$remote_addr;
          }

          location @fallback {
                    proxy_pass http://127.0.0.1:8080;
                    expires   0;
                    add_header X-Cache "Warning - static files goes from backend!";
                    proxy_set_header Host \$host;
                    proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
                    proxy_set_header X-Forwarded-Proto \$scheme;
                    proxy_set_header X-Real-IP \$remote_addr;
          }

          location ~ /\.ht {
                    deny all;
          }
        }
EOF
cd /tmp/sites-enabled
ln -sf ../sites-available/${domain}.conf 001-${domain}.conf
done
echo "Generating done!"
Сей скрипт быстренько пролчесывает папку, цепляет доменные имена и подставляет их в шаблон конфига. Все это он вывалил в /tmp, в подпапки аналогичные debian'овской структуре конфигов. Остается скопировать все файло в оответствующую папку в /etc и идти пить пиво)))

Далее следовало насоздавать БД и пользователя БД для каждого сайта. Проблема заключалась в следующем - домены были ужасно длинные. Брать целиком имя сайта - запросто можно было упереться в ограничение имени пользователя MySQL. Дампы БД лежали в подпапке с сайтом, но именование тоже хромало - {цифровой блок}_{имя базы}.sql. Например: 123_mydbdump.sql. Обзывать так базу тоже не кавай. Проблему решил сл. скриптом:

Код: Выделить всё

#!/bin/bash
echo "Username,Password,Database," > dbuserlist.csv
for domain in `ls /var/www/html`; do
db=`ls /var/www/html/${domain} | grep sql | cut -d_ -f 2 | cut -d. -f1` # отсекаем все лишнее из имени БД
password="`pwgen -s 12 1`" # Генерируем секурный пароль (требуется программка pwgen)
user="`echo ${domain} | cut -d. -f1 | sed -e s/-//g | cut -c1-8`" # берем из доменного имени первый блок, удаляем из него дефисы, и ограничиваем все это 8-ю символами
rnd=`shuf -i 0-100 -n 1` # Генерируем случайное число

echo "CREATE DATABASE \`${db}\`;" >> /tmp/create.sql
echo "GRANT all privileges ON ${db}.* TO ${user}${rnd}@localhost IDENTIFIED BY '${password}';" >> /tmp/create.sql
echo "${user}${rnd},${password},${db}," >> dbuserlist.csv
done
В результате скрипт создаст файлик с sql-запросами создающими БД и пользователя к ним, и записывает все имена, пароли и имена БД в csv-файл. Имя пользователя будет состоять из 8 символов из доменного имени (или меньше, если домен короче) и 1-3 цифр, Пароли будут типа QUG47G9zqzGz.