Как с нуля настроить свой хостинг для сайтов на Linux CentOS 7

Обновлено и опубликовано Опубликовано:

Обращаю особое внимание, что в данной инструкции идет речь о создании виртуального хостинга — веб-сервера для размещения сайтов изолированных друг от друга.

В качестве примера используются команды на Linux CentOS. Однако, справедливости ради, нужно заметить, что данными методами без проблем удастся настроить любой Linux и (с небольшими правками) FreeBSD.

Область применения:

  • Частный хостинг для небольшого количества клиентов.
  • Размещение сайтов компании.
  • Тестовый сервер для веб-мастера.
  • Установка корпоративных порталов.
  • Домашний сервер для компьютерных игр.

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

Содержание

Как выбрать сервер для хостинга

Железо

Основной потребляемый ресурс виртуального хостинга — объем жесткого диска. Небольшие сайты-визитки могут иметь размер менее 100 Мб. Но Интернет-магазины или фото- видео-порталы требуют больших ресурсов. В зависимости от целей, необходимо выделить от 50 Гб до 4 Тб. Больше или меньше для наших целей нецелесообразно.

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

Оперативной памяти также требуется небольшое количество — веб-сервер для 50 - 100 простых сайтов прекрасно себя будет чувствовать на 8 Гб.

Платформа

Прекрасно подойдут следующие варианты — обычный домашний компьютер, выделенный физический сервер, виртуальная машина, арендованный сервер.

Подробнее о том как выбрать сервер.

Выбор операционной системы

Для большинства хостинг-серверов, UNIX-системы являются лучшим выбором, так как:

  1. Преимущественно, они бесплатные.
  2. Работают стабильно.
  3. Основное программное обеспечение для веб-серверов, в первую очередь, разрабатывается для UNIX.

Напомню, что в данной инструкции применяется Linux CentOS 7.

Установка веб-сервера + все необходимое

Процесс настройки веб-сервера подробно описан в статье NGINX + Apache (httpd) + MariaDB (MySQL) + PHP + PHP-FPM (fastCGI) + FTP + PHPMyAdmin + Memcached + xCache + Postfix на CentOS 7. По данной инструкции можно настроить сервер для персонального использования или использования в компании. Но на хостинге будут находиться разные сайты, которые нужно изолировать друг от друга. Также необходимы квоты.

Настройка хостинга

На предыдущем шаге представлена ссылка на статью, по которой мы сконфигурировали полноценный веб-сервер. Но для хостинга необходимо внести некоторые дополнительные настройки.

Общий пользователь

Так как к одним и тем же каталогам необходимы права доступа для nginx и apache, создаем общую группу и добавим в нее учетные записи, от которых работают данные веб-сервисы.

Добавим группу virtwww:

groupadd virtwww

Задаем созданную группу как дополнительную для apache и nginx:

usermod apache -G virtwww

usermod nginx -G virtwww

Запуск виртуальных доменов от определенного пользователя

Чтобы каждый виртуальный домен apache мог работать от отдельного пользователя, устанавливаем модуль httpd-itk:

yum install httpd-itk

После открываем следующий файл:

vi /etc/httpd/conf.modules.d/00-mpm-itk.conf

и снимаем комментарий для LoadModule — получится:

LoadModule mpm_itk_module modules/mod_mpm_itk.so

Настройка Apache

Добавим разрешения на каталоги, в которых будут храниться файлы сайтов:

vi /etc/httpd/conf/httpd.conf

<Directory /var/www/*/*/www>
    AllowOverride All
    Options Indexes ExecCGI FollowSymLinks
    Require all granted
</Directory>

<Directory /var/www/*/*/cgi>
        AllowOverride All
        Options Indexes ExecCGI FollowSymLinks
        Require all granted
</Directory>

* по предложенной статье права были выданы на каталоги  /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/{www,cgi,tmp,log}

mkdir -p /var/www/u10001/site1.ru/log/{apache,nginx}

* подразумевается, что мы создаем площадку для сайта 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:

vi /etc/httpd/conf.d/site1.ru.conf

<VirtualHost *:8080>
        Define root_domain site1.ru
        Define root_path /var/www/u10001/site1.ru

        ServerName ${root_domain}
        ServerAlias www.${root_domain}
        DocumentRoot ${root_path}/www
        ScriptAlias  /cgi ${root_path}/cgi

        ErrorLog     ${root_path}/log/apache/error_log
        TransferLog  ${root_path}/log/apache/access_log

        php_admin_value upload_tmp_dir ${root_path}/tmp
        php_admin_value doc_root       ${root_path}
        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;${root_path}/tmp"
        php_flag display_errors   off

        AssignUserID u10001 virtwww
</VirtualHost>

* где site1.ru — сайт, для которого мы создаем площадку; /var/www/u10001/site1.ru — путь, где будут расположены файлы сайта; AssignUserID определяет, под какими учетными данными будет работать виртуальный домен.

4. Создаем виртуальный домен в nginx:

vi /etc/nginx/conf.d/site1.ru.conf

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;
        }

        location ~* ^.+\.(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:

nginx -t

apachectl configtest

Если ошибок нет, перезапускаем сервисы:

systemctl reload nginx

systemctl reload httpd

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

Устанавливаем пакет для квотирования диска:

yum install quota

Открываем fstab и добавляем опции квотирования для нужного раздела:

vi /etc/fstab

/dev/sdb          /var                   ext4    usrquota,grpquota       0 0

* в моем примере добавлены опции usrquota и grpquota для раздела /var.

Перемонтируем раздел, для которого должны работать квоты:

mount -o remount /var

Запускаем следующую команду для создания служебных файлов:

quotacheck -favugm

Включаем квоту для раздела:

quotaon -avug

Задаем квоту для пользователя виртуальной площадки:

edquota u10001

Disk quotas for user u10001 (uid 10001):
  Filesystem      blocks       soft       hard     inodes     soft     hard
  /dev/sdb        252432         2G         2G      10796        0        0

* в данном примере выставляем квоту в 2 Гб.

Проверить установленную квоту можно командой:

repquota /var

# Серверы # Интернет # Безопасность # Базы данных # UNIX # NGINX # MySQL # Linux # CentOS
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет