- Как с нуля настроить свой хостинг для сайтов на Linux CentOS 7
- Содержание
- Как выбрать сервер для хостинга
- Железо
- Платформа
- Выбор операционной системы
- Установка веб-сервера + все необходимое
- Настройка хостинга
- Общий пользователь
- Запуск виртуальных доменов от определенного пользователя
- Настройка Apache
- Создание пользователя
- Создание площадки
- Настройка выделенного сервера для работы сайта под управлением HostCMS
- Первые шаги
- Установка необходимого ПО
- Настройка загрузки файлов
- Подготовка файловой системы
- Настройка виртуальных хостов
- Настройка резервного копирования и ротации логов
Как с нуля настроить свой хостинг для сайтов на Linux CentOS 7
Обращаю особое внимание, что в данной инструкции идет речь о создании виртуального хостинга — веб-сервера для размещения сайтов изолированных друг от друга.
В качестве примера используются команды на Linux CentOS. Однако, справедливости ради, нужно заметить, что данными методами без проблем удастся настроить любой Linux и (с небольшими правками) FreeBSD.
- Частный хостинг для небольшого количества клиентов.
- Размещение сайтов компании.
- Тестовый сервер для веб-мастера.
- Установка корпоративных порталов.
- Домашний сервер для компьютерных игр.
Не рекомендую использовать данный хостинг для оказания профессиональных услуг большому количеству клиентов, в связи с отсутствием панели управления. В противном случае, необходимо сделать выбор в сторону специализированной платформы, например, CPanel или самостоятельно разрабатывать систему управления, биллинга, поддержки и так далее.
Содержание
Как выбрать сервер для хостинга
Железо
Основной потребляемый ресурс виртуального хостинга — объем жесткого диска. Небольшие сайты-визитки могут иметь размер менее 100 Мб. Но Интернет-магазины или фото- видео-порталы требуют больших ресурсов. В зависимости от целей, необходимо выделить от 50 Гб до 4 Тб. Больше или меньше для наших целей нецелесообразно.
Мощный процессор нужен только для порталов, которые запускают большое количество скриптов. Для большинства хостингов можно остановить выбор на недорогом процессоре.
Оперативной памяти также требуется небольшое количество — веб-сервер для 50 — 100 простых сайтов прекрасно себя будет чувствовать на 8 Гб.
Платформа
Прекрасно подойдут следующие варианты — обычный домашний компьютер, выделенный физический сервер, виртуальная машина, арендованный сервер.
Выбор операционной системы
Для большинства хостинг-серверов, UNIX-системы являются лучшим выбором, так как:
- Преимущественно, они бесплатные.
- Работают стабильно.
- Основное программное обеспечение для веб-серверов, в первую очередь, разрабатывается для UNIX.
Напомню, что в данной инструкции применяется Linux CentOS 7.
Установка веб-сервера + все необходимое
Процесс настройки веб-сервера подробно описан в статье NGINX + Apache (httpd) + MariaDB (MySQL) + PHP + PHP-FPM (fastCGI) + FTP + PHPMyAdmin + Memcached + xCache + Postfix на CentOS 7. По данной инструкции можно настроить сервер для персонального использования или использования в компании. Но на хостинге будут находиться разные сайты, которые нужно изолировать друг от друга. Также необходимы квоты.
Настройка хостинга
На предыдущем шаге представлена ссылка на статью, по которой мы сконфигурировали полноценный веб-сервер. Но для хостинга необходимо внести некоторые дополнительные настройки.
Общий пользователь
Так как к одним и тем же каталогам необходимы права доступа для nginx и apache, создаем общую группу и добавим в нее учетные записи, от которых работают данные веб-сервисы.
Добавим группу virtwww:
Задаем созданную группу как дополнительную для apache и nginx:
usermod apache -G virtwww
usermod nginx -G virtwww
Запуск виртуальных доменов от определенного пользователя
Чтобы каждый виртуальный домен apache мог работать от отдельного пользователя, устанавливаем модуль httpd-itk:
yum install httpd-itk
После открываем следующий файл:
и снимаем комментарий для LoadModule — получится:
LoadModule mpm_itk_module modules/mod_mpm_itk.so
Настройка Apache
Добавим разрешения на каталоги, в которых будут храниться файлы сайтов:
AllowOverride All
Options Indexes ExecCGI FollowSymLinks
Require all granted
AllowOverride All
Options Indexes ExecCGI FollowSymLinks
Require all granted
* по предложенной статье права были выданы на каталоги /var/www/*/www, для хостинга мы будем использовать немного другую вложенность.
Создание пользователя
Для каждого клиента необходимо создавать отдельного пользователя Linux, к которому будут привязаны виртуальные домены и базы данных. Это позволит изолировать ресурсы одного пользователя от другого и осуществить квотирование.
1. Создаем пользователя и группу Linux:
groupadd u10001 -g 10001
useradd u10001 -u 10001 -g virtwww -G u10001 -d /var/www/u10001 -m -k /dev/null
* где u10001 — имя пользователя/группы; 10001 — идентификатор пользователя в системе; virtwww — основная группа, которой будет принадлежать пользователь; опция -m создаст каталог пользователя; -k /dev/null — не использовать скелет для наполнения профиля файлами.
2. Создаем базу данных и пользователя mysql:
mysql -uroot -p -e «CREATE DATABASE b10001 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;» -e «GRANT ALL PRIVILEGES ON b10001.* TO m10001@localhost IDENTIFIED BY ‘mysqlpass’;»
* где b10001 — название базы; m10001 — пользователя базы данных; mysqlpass — пароль доступа к mysql.
3. Создаем FTP-пользователя. Процесс зависит от того, где мы решили хранить пользователей.
Если храним в файле:
ftpasswd —passwd —file=/etc/proftpd.d/ftpd.passwd —name=f10001 —uid=10001 —gid=10001 —home=/var/www/u10001 —shell=/sbin/nologin
Если в базе данных:
mysql -uroot -p -e «INSERT INTO proftpd.users (username, password, uid, gid, homedir) values (‘f10001’, encrypt(‘ftpass’), 10001, 10001, ‘/var/www/u10001’);»
* f10001 — имя FTP-пользователя; ftpass — пароль пользователя.
4. Задаем права на каталоги:
chmod 4710 /var/www/u10001
chmod 4470 /home/mysql/b10001
chown u10001:virtwww /var/www/u10001
chown u10001:mysql /home/mysql/b10001
* где /home/mysql — путь, по которому хранятся базы.
Создание площадки
Для каждого клиента можно создать одну или несколько площадок, каждая из которых будет использоваться под определенный сайт.
1. Создаем каталоги:
mkdir -p /var/www/u10001/site1.ru/
mkdir -p /var/www/u10001/site1.ru/log/
* подразумевается, что мы создаем площадку для сайта site1.ru.
2. Задаем права на каталоги:
chown -R u10001:virtwww /var/www/u10001/site1.ru
chown -R root:u10026 /var/www/u10001/site1.ru/log
chmod -R 04770 /var/www/u10001/site1.ru
chmod 0710 /var/www/u10001/site1.ru/cgi
chmod -R 0750 /var/www/u10001/site1.ru/log
3. Создаем виртуальный домен в Apache:
Define root_domain site1.ru
Define root_path /var/www/u10001/site1.ru
ErrorLog $
TransferLog $
php_admin_value upload_tmp_dir $
php_admin_value doc_root $
php_admin_value user_dir www
php_admin_value open_basedir /var/www/u10001:/usr/local/share/smarty:/usr/local/share/pear
php_admin_value session.save_path «0;0660;$
php_flag display_errors off
AssignUserID u10001 virtwww
* где site1.ru — сайт, для которого мы создаем площадку; /var/www/u10001/site1.ru — путь, где будут расположены файлы сайта; AssignUserID определяет, под какими учетными данными будет работать виртуальный домен.
4. Создаем виртуальный домен в nginx:
server <
listen 80;
server_name site1.ru www.site1.ru;
set $root_path /var/www/u10001/site1.ru/www;
gzip on;
gzip_disable «msie6»;
gzip_min_length 1000;
gzip_vary on;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
access_log /home/www/u10001/site1.ru/log/nginx/access_log;
error_log /home/www/u10001/site1.ru/log/nginx/error_log;
location / <
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
>
* ^.+\.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ <
root $root_path;
expires modified +1w;
>
error_page 500 502 503 504 /50x.html;
location = /50x.html <
root /usr/local/www/nginx-dist;
>
>
Проверяем правильность настроек nginx и httpd:
Источник
Настройка выделенного сервера для работы сайта под управлением HostCMS
В «жизни» практически любого веб-проекта – будь то небольшой интернет-магазин или сайт набирающего популярность бара – рано или поздно случается момент, когда не хватает ни возможностей и ресурсов shared-хостинга, ни средств для тотальной реорганизации архитектуры приложения. Несколько лет назад, когда я ещё работал в небольшой веб-студии, мне частенько приходилось наблюдать такую картину. Практически во всех подобных случаях принималось одно и то же решение – аренда выделенного сервера и перенос на него проекта в том виде, в котором он есть. В то время в сети было доступно немало статей по настройке серверов с Linux на борту. Причём практически все они были не самого лучшего качества и зачастую содержали настолько вредные советы, что господин Остер мог бы стоя аплодировать авторам тех материалов.
«Всё это дела давно минувших дней» – так я думал ещё совсем недавно, пока ко мне не обратился мой давний приятель за помощью в решении аналогичной проблемы. Как оказалось, ситуация с тех пор сильно не изменилась: нужный раздел документации практически не обновился, сами разработчики в основном советуют воспользоваться shared-хостингом от своих партнёров, а толкового материала, учитывающего нюансы миграции на выделенный сервер проекта на HostCMS, так и не нашлось. Мне нравится сама CMS, поэтому я решил исправить это упущение. Если интересно – добро пожаловать под кат.
Прежде всего оговорюсь. В этой статье я не буду рассматривать вопросы выбора хостинг-провайдера – с этим, я думаю, вы справитесь сами. В качестве серверной ОС выбрана Ubuntu Server 14.04 как одна из наиболее дружелюбных к пользователю. Я предполагаю, что вы обладаете минимальным набором знаний для работы в Linux. К сожалению, здесь вы не найдете тонкой настройки PAM модуля для установки пользовательских лимитов на обращение к файлам и т.п. – если вы ищите такой материал, то скорее всего эта статья будет для вас скучна.
Первые шаги
Итак, у нас есть выделенный сервер и данные для доступа к нему по ssh. Правило первое, оно же главное, старайтесь избегать постоянной работы от имени привилегированного пользователя. Во время первого же сеанса создайте собственную учетную запись и установите для нее пароль. Например, так:
Дальнейшую работу будем проводить уже от имени только что созданного пользователя.
Установка необходимого ПО
nginx
В качестве HTTP-сервера будет использоваться nginx. Думаю, что в представлении он не нуждается. Устанавливать его будем из репозитория, любезно развёрнутого командой разработчиков. Для этого необходимо получить ключ, которым подписаны установочные пакеты:
И обновить список источников пакетов, добавив в файл /etc/apt/sources.list строки:
После этого обновляемся и устанавливаем nginx:
Чтобы задать лимиты на количество открываемых пользователем http-сервера файлов, нужно добавить в /etc/security/limits.conf строки:
Точные цифры следует подбирать, исходя из конфигурации вашего сервера. Активируется модуль лимитов добавлением следующей строки в /etc/pam.d/common-session:
Проверить, что лимиты установились можно следующей командой:
HostCMS требует, чтобы были включены следующие модули php: curl, gd, xslt и, естественно, mysql. Кроме того, обратите внимание, что теперь пакет php5-json не является виртуальным и его нужно устанавливать отдельно. Помимо прочего подключим модуль кеширования опкода xcache. В качестве SAPI (режим запуска интерпретатора) будем использовать PHP-FPM, однако, чтобы иметь возможность выполлять некоторые скрипты по расписанию будет установлен еще и PHP-CLI.
MySQL
Установка MySQL довольная проста. Несколько раз установщик запросит у вас пароль для root’а сервера баз данных, можете смело оставлять его пустым — мы сменим его позже, с помощью утилиты mysql_secure_installation. При ее запуске ответьте, что хотите сменить пароль root’a, удалить тестовую БД и тестовых пользователей и обновить права на таблицы службной БД.
Подробно почитать о настройке mysql-сервера можно здесь. Статья отлично написана, поэтому не вижу смысла дублировать сюда информацию.
Настройка загрузки файлов
В качестве протокола передачи файлов я предлагаю использовать SSH FTP (SFTP). Во-первых, он безопаснее обычного ftp, так как данные будут передаваться в зашифрованном виде. Во-вторых, не придется устанавливать дополнительное ПО: все что нужно — ssh-сервер — у нас уже есть. А минусов практически никаких — все современные IDE и клиенты загрузки данных умеют работать с этим протоколом.
Чтобы определить, кому можно подключаться по sftp, создадим дополнительную группу пользователей, например, sftp:
И активируем передачу данных, добавив в конец файла /etc/ssh/sshd_config строки:
Подготовка файловой системы
Традиционно, файлы, относящиеся к веб-сайтам, размещаются в каталоге /var/www/. И мы не будем отступать от этого негласного правила. Создадим папку для виртуальных хостов и будущую точку монтирования быстрого кэша:
Затем укажем, что при следующей загрузке, в эту папку будет смонтирована tmpfs. Добавим в /etc/fstab:
Стоит заметить, что некоторые редакции HostCMS имеют встроенный алгоритм кеширования ответов в файлы. Если вы используете одну из таких редакций имеет смысл примонтировать tmpfs к директории кеша самой CMS.
Настройка виртуальных хостов
Если вы планируете развернуть на своем сервере несколько сайтов под управлением HostCMS, то описанную ниже процедуру придется повторить несколько раз. В этом случае имеет смысл попытаться автоматизировать процесс заведения нового хоста. Советую для этих целей обратить внимание на небольшой набор скриптов, описанных в этой статье, и «допилить» их под себя.
Заведение пользователя хоста
По соображениям безопасности все файлы, связанные с нашим сайтом будут принадлежать специально заведенному в системе пользователю. Подключение по sftp и выполнение PHP-скриптов будет происходить от его же имени. Чтобы было проще, его можно назвать по имени своего сайта:
Для корректной работы chroot’а нужно сделать root’a владельцем домашнего каталога этого пользователя:
Заведение пула PHP-FPM
Создание конфига виртуального хоста
В файле настройки хоста nginx вам нужно будет указать доменное имя сайта, путь для записи логов доступа и адрес юникс-сокета, который слушает php-fpm. Для обработки запросов к несуществующим файлам будем использовать именованный location — таким образом мы будем эмулировать работу mod_rewrite для Apache2. Перед тем, как отдавать на обработку скрипт нашему бэкэнду, проверяем его существование. Это позволить избежать проблемы, описанной здесь. Для того, чтобы снизить нагрузку на сайт от незарегистрированных пользователей, будем использовать кеширование на стороне nginx. Для этого создадим конфигурационный файл /etc/nginx/conf.d/cache со следующим содержимым:
А затем подключим его в конфиге виртуального хоста.
Создание базы данных сайта
Сейчас почти всё готово, осталось только развернуть базу данных и создать пользователя, от имени которого будет осуществляться к ней подключение. Для этого нужно в консоли mysql выполнить несколько простых команд:
Обратите внимание, что подключение к базе от имени этого пользователя разрешается с любого адреса.
Если у вас имеется дамп использовавшейся ранее базы, то развернуть его можно следующим набором команд все в той же консоли mysql:
Настройка резервного копирования и ротации логов
Если вы всё сделали правильно, то у вас уже должно быть полностью настроенное окружение для запуска вашего проекта. Остаются два последних по списку, но не по значимости, шага — настройка резервного копирования и ротации логов. В качестве инструмента для создания бэкапов я рекомендую использовать backup-manager. На хабре есть отличная статья про него, поэтому подробно останавливаться на нём не будем.
Для осуществления ротации логов нам нужно всего лишь создать правильный конфиг для утилиты logrotate.
Источник