Виртуальный хостинг (Shared hosting)

Материал из MediaWiki
Перейти к навигации Перейти к поиску

Хостинг

Цель данной статьи рассказать как стать хостером уровня Enterprise на localhost (без баз данных, панелей управления, биллинга, https и прочего ненужного хлама! Только статика, html, php и вечная молодость! Mandala). Речь пойдет о настройке всех возможных демонов (iptables, openssh, vsftpd, nginx + php, postfix и другое), чтобы на вашем собственном компьютере (а для каких целей — не важно) вы собстенноручно могли создать сервис хостинга. Кого вы собираетесь размещать у себя — не важно, может только сами себя, а может 100500 клиентов, все упирается лишь в ресурсы вашего компьютера.

Да, на просторах интернета много информации о том, как настроить демоны в отдельности, но нет информации о том, как должно быть правильно все взаимосвязано, в результате чего пользователи «лиж бы работало» начинают, например, лепить костыли вроде mount --bind для связи $HOME пользователя и директории www. Я (Spoofing) считаю такой подход не верным. Тред на форуме, для подробностей и пущей ясности.
Статья будет написана не за один день (в конце концов, я сам только-только начал изучать этот вопрос), но в оглавлении всегда будет содержаться, что уже написано.

О том, что такое Хостинг

Вопрос на Хабрахабр

Оглавление

На данный момент описана установка и настройка так называемого Shared-хостинга, который годится только для размещения сайта на нем, — на котором крутится nginx, php-fpm, а пользователи заливают файлы через vsftpd. Сколько угодно доменов, сколько угодно пользователей. С этим, на самом деле, справится любой. :)

Теория

Рекомендую обсуждать теорию, — каким конкретно образом сервисы должны быть взаимосвязаны и функционировать друг с другом в комментариях к этой статье

К вопросу о дистрибутивах, на котором все это добро заведется. Конечно, дистрибутив может быть любым, но сразу уточним, что «как установить» в статье не будет — вы либо должны сами это сделать, либо скачать пакеты из репозиториев, так как в каждом дистрибутиве это происходит по-разному. В также статье не будет написано тонкостей настройки демонов (если того не требуется для работоспособности хостинга). Если на вашем дистрибутиве из статьи что-то не завелось, но вы смогли решить проблему — просьба дополнить об этом статью, уточнив что за дистрибутив, какая возникла проблема и ее решение.

О виртуализации, как основе хостинга, может кто-нибудь расскажет в статье, но нет: я не собираюсь использовать ни виртуализацию, ни красивые менеджеры настройки типа ISP… ничего. Только консоль, только пошаговая инструкция по развертке хостинга на установленном дистрибутиве.

Автоматизация

Скриптов автоматизирующий процесс установки, добавления новых (виртуальных) пользователей, управление доменами и прочее — не будет, поскольку у каждого будущего хостера свои задачи. Написать скрипты под каждого, когда одному нужен какой-либо демон, а кому нет, просто невозможно и тяжело такие скрипты поддерживать. Поэтому все действия по добавлению пользователей и прочему будут выполняться командами вручную, — вы, когда уже определитесь со своими целями и ваш хостинг начнет более-менее работать, можете писать такие скрипты для себя и делиться с обществом.

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

Shared hosting

На shared hosting множество сайтов расположены на одном сервере. Настроим nginx + php-fpm, vsftpd с виртуальными пользователями для управления содержимым сайта.

Настройка

nginx

Пусть вы уже установили nginx, настроили nginx.conf под свои нужды (в интернете много howto, дублировать их не будем), теперь сразу к основе хостинга.

Мы будем разделять все наши домены (сайты) друг от друга, поэтому в nginx.conf в директиву http { } в самый конец добавляем строку include

... какие-то настройки ...

http {

  ... какие-то настройки ...

  include sites-conf/*;

}

Соответственно рядом с конфигом создаем две директории

root@linux:/etc/nginx# mkdir sites-conf
root@linux:/etc/nginx# mkdir sites-avail

nginx будет подключать конфигурации сайтов (директивы server) из директории sites-conf.

В sites-conf будут расположены симлинки на файлы конфигурации в sites-avail.

Надо подключить сайт — создаем симлинк типа ln -s sites-avail/localhost.localdomain.conf sites-conf/, надо удалить сайт — удаляем симлинк.

php-fpm

Не знаю как в других дистрибутивах, но в Arch Linux nginx + php-fpm настроены и работают из репозиториев.

Ничего специфичного для хостинга не требуется.

vsftpd

vsftpd мы будем использовать для управления файлами сайтов на нашем shared hosting’е.

О том, как настроить vsftpd для работы с виртуальными пользователями читайте в статье Spoofing’а на Хабрахабр. Вы можете просто скопипастить конфиг в конце статьи.

После настройки ничего специфичного для хостинга делать не нужно.

Домены

Создадим один домен localhost.localdomain.

nginx

В sites-avail/localhost.localdomain.conf запишем конфигурацию сервера (сайта) с поддержкой php.

  server {
    listen 80 default_server;
    server_name localhost.localdomain;
    
    root /srv/http/localhost.localdomain/w3;

    location /default.php {
      include fastcgi.conf;
      fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    }
    location / {
      try_files $uri $uri/ /default.php;
    }
  }

  server {
    listen 80;
    server_name localhost;

    return 301 $scheme://localhost.localdomain$request_uri;
  }

Для пущей безопасности работает только один /default.php на сервере, чтобы хацкеры не смогли выполнить залитый шелл.

Для включения сервера в конфигурацию nginx создаем симлинк

root@linux:~# cd /etc/nginx
root@linux:/etc/nginx# ln -s sites-avail/localhost.localdomain.conf sites-conf/

Теперь создаем директории для нашего сайта

root@linux:~# cd /srv/http
root@linux:/srv/http# mkdir localhost.localdomain
root@linux:/srv/http# mkdir localhost.localdomain/w3

Убедившись, что сервер сконфигурирован правильно (nginx -t), nginx можно запускать.

php-fpm

Запускаем.

vsftpd

Настроив сервер с вирутальными пользователями, просто запускаем.

Пользователи

nginx

Ничего.

php-fpm

Ничего.

vsftpd

В файл ~/vsftpd_logins.txt вписываем имена пользователей, например

localhost.localhost
password
test
password

где localhost.localhost и test это пользователи vsftpd, а следом их пароли.

Конвертируем базу

root@linux:~# rm /etc/vsftpd_login.db
root@linux:~# db_load -T -t hash -f ~/logins.txt /etc/vsftpd_login.db

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

В двух файлах /etc/vsftpd_user_conf/localhost.localhost и /etc/vsftpd_user_conf/test (соответствуют именам пользователей на сервере) пишем одно и тоже

allow_writeable_chroot=YES

guest_username=http

local_root=/srv/http/localhost.localdomain

И теперь, при логине под пользователем localhost.localdomain или test — они оба попадают в одну директорию /srv/http/localhost.localdomain, в котором лежит их сайт.

Безопасность

Данная статья или раздел ещё не завершены
Кто-то посчитал, что статья или раздел ниже не содержит какой-то важной информации или имеет проблемы с вёрсткой/текстом. Указана причина: необходимо еще написать, как настроить права доступа{{#ifeq: {{{1}}} | nopoint | | . }}

{{#if: Доработка | }}


Только основы, так как по каждой теме можно по книге написать:

  • Права доступа мандатные (SELinux и пр.)
  • Избирательное управление доступом (DAC, ACL — unix права)
  • Межсетевой экран
  • Fail2ban и прочее