Создания Nginx VirtualHost и установка Drupal одной командой

Главные вкладки

Totaku 28 марта 2017 в 14:55
4

Установка сайта на Друпале рутинное дело. Нужно создать конфиг виртуального хоста, создать папочки для сайта, создать базу данных, перезагрузить все что требуется, скачать сам друпал и установить его. Но ведь это все можно автоматизировать и после этого наслаждаться благами цивилизации. Погнали!

Для начала нам нужно создать файл с конфигом Nginx для Drupal. Создадим папку conf. В ней файл drupal и в вставим в него:

server {
    listen 80;
    listen [::]:80;
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}

server {
    listen 80;
        listen [::]:80;

        server_name example.com;
        root /var/www/example.com;

        client_max_body_size 100m;

        access_log off;
        error_log /home/username/logs/nginx-example.com-error.log; ## username заменить на ваше имя пользователя

        # Enable compression, this will help if you have for instance advagg‎ module
        # by serving Gzip versions of the files.
        gzip_static on;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        # This matters if you use drush prior to 5.x
        # After 5.x backups are stored outside the Drupal install.
        #location = /backup {
        #        deny all;
        #}

        # Very rarely should these ever be accessed outside of your lan
        location ~* \.(txt|log)$ {
                allow 192.168.0.0/16;
                deny all;
        }

        location ~ \..*/.*\.php$ {
                return 403;
        }

        # No no for private
        location ~ ^/sites/.*/private/ {
                return 403;
        }

        # Block access to "hidden" files and directories whose names begin with a
        # period. This includes directories used by version control systems such
        # as Subversion or Git to store control files.
        location ~ (^|/)\. {
                return 403;
        }

        location / {
                # This is cool because no php is touched for static content
                try_files $uri [user=rewrite]rewrite[/user];
        }

        location [user=rewrite]rewrite[/user] {
                # You have 2 options here
                # For D7 and above:
                # Clean URLs are handled in drupal_environment_initialize().
                rewrite ^ /index.php;
                # For Drupal 6 and bwlow:
                # Some modules enforce no slash (/) at the end of the URL
                # Else this rewrite block wouldn't be needed (GlobalRedirect)
                #rewrite ^/(.*)$ /index.php?q=$1;
        }

        location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        }

        # Fighting with Styles? This little gem is amazing.
        # This is for D6
        #location ~ ^/sites/.*/files/imagecache/ {
        # This is for D7 and D8
        location ~ ^/sites/.*/files/styles/ {
                try_files $uri [user=rewrite]rewrite[/user];
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Установим pwgen:

apt-get install pwgen

Создаем в файл si.sh в папке пользователя /home/username/:

#!/bin/bash
sd=/var/www # папка где будет создан сайт
sc=/home/username/conf # папка с конфигом
PASS=`pwgen -s 30 1` # генерируем пароль
echo "Creating virtual host $1"
sudo cp $sc/drupal /etc/nginx/conf.d/$1.conf
echo "Updating vhost confin for $1"
sudo sed -i s,example.com,$1,g /etc/nginx/conf.d/$1.conf
sudo sed -i s,$sd/example.com,$sd/$1,g /etc/nginx/conf.d/$1.conf
echo "Restarting Nginx"
sudo systemctl reload nginx
echo "Create database $2"
mysql -u root -p << EOF
CREATE DATABASE $2 CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE USER '$2'@'localhost' IDENTIFIED BY '$PASS';
GRANT ALL PRIVILEGES ON $2.* TO '$2'@'localhost';
FLUSH PRIVILEGES;
EOF
echo "Instal Drupal"
cd $sd
drush dl drupal-7.54
mv drupal-7.54 $1
cd $1
git clone https://github.com/totaku/fellema-dev.git profiles/fellema # мой профиль для Drupal
drush si fellema --locale=ru --site-name=$1  --db-url=mysql://$2:$PASS@localhost/$2 --account-name=admin --account-pass=admin --account-mail=admin@admin.admin
chmod 0777 -R $sd/$1/sites/default/files
echo "Finished!"
echo "MySQL user created."
echo "Username: $2"
echo "Password: $PASS"
echo "Local address: $sd/$1"
echo "Web address: http://$1"

Сохраним и дадим файлу права на исполнение:

sudo chmod a+x si.sh

Скрипт готов к работе, запускаем его с помощью команды:

./si test.com test

Где test.com ваш домен, test база данных сайта и имя пользователя.

Орингинал как обычно в блоге.

Автор

Комментарии

Аватар пользователя fairrandir fairrandir 28 марта 2017 в 16:07

Гут. Ленивый момент номер раз - можно в главном конфиге nginx прописать подхват конфига из папок пользователей. (что-то типа include /srv/www/vhosts/*/conf/nginx.conf)
Ленивый момент номер два - можно и сам конфиг откуда-нибудь с гита тянуть.

А мораль хорошая - если что-то можно автоматизировать - автоматизируйте.

Аватар пользователя bsyomov bsyomov 4 апреля 2017 в 18:05
1

1. Не надо так делать, никогда! Это крайне не безопасно. Ну и это требует отслеживания изменения конфигов и перезагрузки nginx, до кучи.
Для этого, по хорошему, надо писать обвязку, которая как минимум, будет проверять изменения и валидность конфигов пользовательских, и если всё ок, собирать конфиг nginx, и выполнять его перезагрузку. А ещё лучше проверять пользовательский конфиг, по сильно урезанному набору разрешённых инструкций.

2. Можно, но лучше сделать снипеты, и их инклюдить, а при необходимости, именно их обновлять из того же гита, возможно хуком специальным автоматически. Т.к. если раз тянуть из гита конфиг, то смысла особого именно в гите нет.

Аватар пользователя bsyomov bsyomov 4 апреля 2017 в 22:25

1. Если на локалке/тесте, то в этом просто нет смысла - зачем их класть в папку пользователя?
2. Это важное отличие, если хорошо подумать.

Аватар пользователя multpix multpix 28 марта 2017 в 17:13

чересчур многобукв, как для простого:

drush dl drupal && mv drupal-8.2.7 drupal && cd drupal
drush si minimal --db-url=sqlite://sites/default/files/.ht.sqlite
drush rs

этого для локальной разработки - за глаза в 90проц. ситуаций.
а на продакшн - совсем другая песня.

но старания - уважаю!
сенкс за текст)