Pull to refresh

Правильный хостинг для MODx своими руками

Reading time 7 min
Views 57K

Топик рассказывает о настройке быстрого и недорогого хостинга для MODx Revolution. В принципе, вещи тут описаны общие, так что информация подойдет для любой CMS. Позже была смонтирована и видеоверсия этой инструкции.

На всякий случай, приложу видео, как должна работать админка MODx Revo.

Для быстрой и комфортной работы желательно:
  • Быстрый браузер — Google Chrome. Админка Revo работает в нем молниеносно
  • Хороший интернет-канал. Тут без вариантов, нужно всем и всегда.
  • Качественный хостинг — про него и пишу.


В конце поста есть ссылки на скрипты для автоматической установки MODx с созданием юзера, хоста nginx, процесса php5-fpm и базы дынных.


Я работал с разными хостингами. Начинал на Peterhost, затем переехал на Clodo, потом Selectel и параллельно Scalaxy. Также немного поработал с Hetzner.

Хорошие все, но по совокупности субъективных вещей мне больше нравится облако Selectel.

Получилось «многабуков», поэтому вот оглавление:
1. Установка ОС и настройка ssh
2. Установка сервисов
3. Настройка окружения
4. Настройка сервисов
5. Заключение


Установка ОС и настройка ssh


Регистрируемся на selectel.ru, заходим в панель, там «Облако» и создаем машину.



Для установки я беру Ubuntu x32 (меньше кушает памяти, чем х64). Установка ОС идет минут 15, после нее в свойствах машины ищем «Пароль при установке». Это пароль root.

На сервер идем через Putty. В настройках Translation ставим UTF-8.
User: root
Password: из панели

Первым делом создаем нового юзера и добавляем его в группу sudo:
adduser user
adduser user sudo

Затем отрубаем вход на сервер под рутом.
nano /etc/ssh/sshd_config

Выставляем PermitRootLogin no, здесь же можно перевешать ssh на другой порт, но я этого не делаю.

Перезапускаем ssh:
service ssh restart

Теперь можно перелогиниться, как user и работать через sudo.
Первым делом
sudo apt-get install mc
, после установки
sudo mc
— этим вы будуте работать на сервере через sudo до выхода из Midnight Commander.

На этом месте большинству не-Linux юзеров изрядко похорошело при виде синих окошек, вместо черной консоли. А консоль по-прежнему можно быстро увидеть, нажав Ctrl+O.

С этого момента команды можно вводить и без sudo — вы уже работаете в нем из mc.

Немного настроим firewall.

Создаем файл iptables (touch /root/iptables), вносим в него такие строки:
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 30 -j DROP
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT

Это защита 22го порта от переборщиков паролей. При каждой неудачной попытке повторно попробовать они смогут только через 30сек (можно увеличить) — на таких скоростях ничего не подобрать. К тому же, нужно угадать еще имя пользователя (root то мы отключили).

Делаем его исполняемым — sudo chmod +x /root/iptables
И вносим вызов этого файла в /etc/rc.local — и скрипт будет вызываться при запуске. Вообще, все что вы хотите запускать при старте — пишем сюда.

Репозитории


Ставим python-software-properties для удобного добавления репозиториев
apt-get install python-software-properties

Дабавляем репоитории Nginx и php5-fpm:
add-apt-repository ppa:nginx/stable
add-apt-repository ppa:fabianarias/php5
apt-get update
apt-get install nginx php5-fpm mysql-server php5-mcrypt php5-mysql php5-curl php-db php5-gd unzip

При установке потребуется ввести административный пароль для Mysql — придумываем посложнее, запоминаем и вводим.

Можно еще установить sendmail для отправке почты с сайта, но Revo позволяет работать напрямую с smtp сервером для отправки почты — что я вам и советую настроить. Лучше сразу подключить почту для домена от Яндекс или Google.

Полдела сделано.

Подготовка окружения


Как вы уже могли догадаться, наш сервер будет запускать php через php5-fpm, без участия Apache2.

Это дает нам 2 преимущества: меньшее потребление памяти и запуск разных сайтов от разных юзеров. То есть, при взломе одного сайта — остальные не пострадают.

FTP на сервер мы вообще не установили, потому что заливать файлы сайта мы будем через SFTP (используем WinCSP для этого), а редактировать через Notepad++ (там есть плагин для sftp).

Создаем группу sftp (addgroup sftp) и настраиваем для нее доступ через ssh.
Добавляем в конец /etc/ssh/sshd_config

Subsystem sftp internal-sftp
Match Group sftp
    ChrootDirectory %h
    AllowTCPForwarding no
    ForceCommand internal-sftp

И комментируем там же

#Subsystem sftp /usr/lib/openssh/sftp-server

Создаем новую директорию для будущего сайта (и директорию для временных файлов), создаем юзера для него, добавляем его в группу sftp и назначаем домашнюю директорию:

mkdir /var/www
mkdir /var/www/site1
mkdir /var/www/site1/www
mkdir /var/www/site1/tmp
adduser site1
adduser site1 sftp
usermod -d /var/www/site1 site1

Есть директория, есть пользователь, есть доступ для него через sftp.

Настройка сервисов


Для настройки php нужно редактировать /etc/php5/fpm/php.ini.

post_max_size = 100M
upload_max_filesize = 100M
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_multi_exec,parse_ini_file,show_source
cgi.fix_pathinfo = 0
open_basedir = /var/www/

Основной конфигурационный файл Nginx (/etc/nginx/nginx.conf) приводим к такому виду (старый бэкапим):

user                    www-data;
worker_processes        8;
error_log               /var/log/nginx/error.log;
pid                     /var/run/nginx.pid;
events {
                        worker_connections  1024;
}
http {
    include             /etc/nginx/mime.types;
    client_max_body_size 100m;
    access_log          /var/log/nginx/access.log;
    sendfile            on;
    keepalive_timeout   65;
    tcp_nodelay         on;
    gzip                on;
    gzip_min_length     1000;
    gzip_proxied        any;
    gzip_types          text/plain ext/html text/xml application/xml application/x-javascript text/javascript text/css text/json;
    gzip_disable        "msie6";
    gzip_comp_level     8;
    charset             utf-8;
    include             /etc/nginx/conf.d/*.conf;
    include             /etc/nginx/sites-enabled/*;
}

Рядом в /etc/nginx/fastcgi_params комментим строку про https, а не то потом будет ругаться:
#fastcgi_param  HTTPS                   $server_https;

Nota Bene! Создаем виртуальный хост.
Наш конфиг подгружает сайты из директории /etc/nginx/sites-enabled/, а рядом есть /etc/nginx/sites-available/ (там сейчас лежит ссылка на сайт default — прибейте ее).
В первой директории лежат симлинки активных сайтов на файлы конфигов из второй директории. Такой подход позволяет быстро включать\отключать виртуальные хосты без редактирования — а просто удалив\создав symlink.

Стандартный конфиг сайта /etc/nginx/sites-available/site1.conf

upstream backend-site1 {server unix:/var/run/php5-site1.sock;}
server {
    listen              80;
    server_name         site1.domain.ru;
    root                /var/www/site1/www;
    access_log          /var/log/nginx/site1-access.log;
    error_log           /var/log/nginx/site1-error.log;
    index               index.php;
    rewrite_log         on;
    location /core/ {                                                                                                                                                                                                                               
        deny all;                                                                                                                                                                                                                                                    
    }
    location / {
        try_files       $uri $uri/ @rewrite;
    }
    location @rewrite {
        rewrite         ^/(.*)$ /index.php?q=$1;
    }
    location ~ \.php$ {
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass    backend-site1;
    }
    location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|bmp)$ {
       access_log       off;
       expires          10d;
       break;
    }
    location ~ /\.ht {
        deny            all;
    }
}

Здесь сразу включены friendly urls, отдача статики и обработка php через php5-fpm, для которого объявляется backend (1 строка конфига).
Следующий сайт можно создать просто скопировав конфиг этого и поменяв site1 на site2.

После создания конфига не забываем создать символическую ссылку на конфиг:
ln -s /etc/nginx/sites-available/site1.conf /etc/nginx/sites-enabled/site1.conf


Nota Bene! Создаем процесс php5-fpm для сайта.
Основную конфигурацию /etc/php5/fpm/main.conf мы трогать не будем, просто удостоверимся, что внизу файла есть строчка
include=/etc/php5/fpm/pool.d/*.conf


Это подключает из директории конфигурации процессов php5-fpm. В конфигурации сайта мы уже указали, что *.php он будет отдавать на обработку по адресу /var/run/php5-site1.sock, а теперь создаем конфиг /etc/php5/fpm/pool.d/site1.conf:

[site1]
listen = /var/run/php5-site1.sock
listen.mode = 0666
user = site1
group = site1
chdir = /var/www/site1
php_admin_value[upload_tmp_dir] = /var/www/site1/tmp
php_admin_value[soap.wsdl_cache_dir] = /var/www/site1/tmp
php_admin_value[date.timezone] = Europe/Moscow
# тут значения можно поменять, в зависимости от нагрузки на сайт
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

Внимательно проверяем везде правильность путей и перезапускаем сервисы:

service nginx restart
service php5-fpm restart


Заключение


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

Мы настроили быстрый, недорогой сервер на облаке, с платой за потребление, который очень экономично кушает ресурсы. Для добавления сайтов нужно:
1. Создать директории и юзера сайта, юзера добавить в группу sftp.
2. Создать 2 конфига для Nginx и php5-fpm по образу предыдущих.
3. Установить сайт и назначить юзера хозяном файлов.



У меня на таком сервере висит 7 небольших сайтов. Он потребляет 250-300mb ОЗУ (это настраивается в панели selectel) и стоит около 8-10 рублей в день. Когда я переживал небольшой хабраэффект я платил всего 20 рублей в сутки.

Сайты изолированы друг от друга, каждый работает от своего юзера, с ограниченными правами. Этот же юзер ходит через sftp — нет проблемы с редактированием файлов залитых через ftp в админке.

Для упрощенного управления сайтами и их конфигами через веб-интерфейс отлично подходит Ajenti. Ну и вообще, оно много чего умеет.

В общем, я попытался доступно написать, как можно за 300 рублей в месяц сделать себе хостинг для приятной работы с MODx Revolution.

Если что-то не так — поправьте меня в комментариях.

P.S. Скрипт для назначения прав для директорий\файлов. Рекомендую хранить в /var/www/site1/chmod

#!/bin/bash
user=site1
dir=/var/www/$user/www

chown -R $user:$user "$dir";
find "$dir" -type d -exec chmod 0755 '{}' \;
find "$dir" -type f -exec chmod 0644 '{}' \;


P.P.S.
В камментах опять начался ад. Люди в глаза не видевшие Revo рассказывают какая она тормозная.
Извините, но холивары достали и топик был жестоко заредактирован.
Цитаты из старой версии будут проскакивать в комментариях.

Я написал статью про настройку хостинга и мне совсем не хочется прятать ее в черновики из-за отдельных комментаторов, которые ни разу не работали с MODx, но авторитетно судят по видео.

Warning!
В комментариях резвится матерый тролль dmitriid, который с MODx никогда не работал. Очень прошу, не кормите его!

Updated. Переделал скрипты автоматической установки\удаления от jkenters

При использовании этих скриптов вам нужно только установить пакеты на сервер, настроить ssh, php и основной конфиг nginx по этой статье. Все остальное скрипт сделает автоматически.
Видео работы скриптов
  • Install В начале нужно указать root пароль Mysql. При запуске спрашивает имя юзера, пароль и домен сайта. По окончании выводит пароли от Mysql и SFTP.
  • Update Также нужно указать Mysql пароль root. Спрашивает имя юзера сайта для обновления.
  • Remove Спрашивает имя юзера сайта. Удаляет все файлы и БД, а также самого юзера с сервера.

Для правильной установки MODx нужно указать date.timezone в /etc/php5/cli/php.ini
date.timezone = Europe/Moscow
Tags:
Hubs:
+35
Comments 113
Comments Comments 113

Articles