Разработка сайтов на домашней машине с Fedora

Разработка сайтов на домашней машине с ОС Fedora

Как установить apache, php и прочее необходимое для сайтов в интернете множество статей. Я хочу остановиться на некоторые нюансах, которые пришлось самому некоторое время разбирать.
Для себя я решил создать следующую иерархию для хранения и работы с сайтами на локальной машине:
/home/oleg/vhosts/site1.local (с каталогами внутри: log, sess, tmp, www)
/home/oleg/vhosts/site2.local (с каталогами внутри: log, sess, tmp, www)
и так далее... На все папки владелец:группа - я сам - oleg:oleg.

Конфиг Apache 2.4

По-умолчанию конфиг apache в Fedora находится в /etc/httpd/conf/httpd.conf
Обращаем внимание, что пользователь Apache (от имени, которого работает демон) apache и группа apache. В связи с этим, я добавил себя в группу apache и пользователя apache в свою группу:

sudo gpasswd -a apache oleg
sudo gpasswd -a oleg apache
В конфиге подправил под себя совсем немного. Так, запретил доступ для корневой директории:

<Directory />
  AllowOverride None
  Require all denied
</Directory>
И внёс небольшие правки в другие директории, обозначенные по-умолчанию:

<Directory "/var/www">
  AllowOverride None
  Require local
</Directory>


<Directory "/var/www/html">
  Options Indexes FollowSymLinks
  AllowOverride None
  Require local
</Directory>


<Directory "/home/oleg/vhosts">
  AllowOverride None
  Require local
</Directory>
Остальное оставил без изменений. Последняя строка в конфиге позволяет создавать другие конфиги, не трогая основной:

IncludeOptional conf.d/*.conf
В остальных конфигах как раз и будем плодить наши виртуальные хосты. Хочу посоветовать перезагружать Apache после каждой правки, чтобы проще было исправлять опечатки и ошибки. Делается это через консоль:

sudo service httpd restart
Если что-то пойдёт не так (Job for httpd.service failed.), подробности можно посмотреть, набрав в консоли:

sudo journalctl -xn

Плодим <VirtualHost *:80>


Для начала создадим конфиг для localhost (/etc/httpd/conf.d/localhost.conf):

<VirtualHost *:80>
    DocumentRoot /var/www/html
    ServerName localhost
    ServerAlias 127.0.0.1
    ServerAdmin your@mail.com
    ErrorLog /var/log/httpd/apache_error_localhost.log
    CustomLog /var/log/httpd/apache_access_localhost.log common
    <Directory /var/www/html>
        Require local
        Options Includes Indexes FollowSymLinks
        AllowOverride All
        DirectoryIndex info.php
    </Directory>
    php_admin_value error_log /var/log/httpd/php_localhost.log
</VirtualHost>
В директорию /var/www/html поместим info.php (для того, чтобы самому знать, что и как установлено) с содержимим:

<?php
phpinfo();
?>
В файле /etc/hosts прописываем наши хосты. Например:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 site1.local www.site1.local
127.0.0.1 site2.local www.site2.local
Если работаете через прокси, настроим исключения для своих сайтов. Например, в Opera: Opera -> Настройки -> Общие настройки... -> Расширенные -> Сеть -> Прокси серверы -> Список исключений
вводим список наших локальных сайтов:

localhost
127.0.0.1
site1.local
site2.local
В окне "Прокси серверы" снимаем галочку "Использовать прокси для локальных серверов". Перезапускаем Apache (sudo service httpd restart) и открываем в браузере наши творения: http://localhost или http://localhost/info.php Должны увидеть информацию по собственному серверу:


Если видим ошибку (Forbidden):
значит что-то не так с правами на каталоги/файлы или с SELinux (об этом ниже). Сразу стоит добавить себя в группу apache (oleg замените собственным именем пользователя Linux):

sudo usermod -a -G oleg apache
И сделать доступ для домашнего каталога:

sudo chmod -R 750 /home/oleg
Для остальных сайтов (с технологией Server-Side Includes) из домашней директории конфиг будет выглядеть примерно так:

<VirtualHost *:80>
    DocumentRoot /home/oleg/vhosts/site1.local/www
    ServerName site1.local
    ServerAlias www.site1.local
    ServerAdmin your@mail.com
    ErrorLog /home/oleg/vhosts/site1.local/log/apache_error.log
    CustomLog /home/oleg/vhosts/site1.local/log/apache_access.log common
    <Directory /home/oleg/vhosts/site1.local/www>
         Require local
         Options Includes Indexes FollowSymLinks
         AllowOverride All
         AddType text/html .html
         AddHandler server-parsed .html
         AddOutputFilter INCLUDES .html
         DirectoryIndex index.html
    </Directory>
    php_admin_value upload_tmp_dir /home/oleg/vhosts/site1.local/tmp
    php_admin_value error_log /home/oleg/vhosts/site1.local/log/php.log
    php_admin_value session.save_path /home/oleg/vhosts/site1.local/sess
</VirtualHost>

PHP вставки в файлах .html

Чтобы заработали php вставки в документах html, нужно добавить блок в конфигурационный файл /etc/httpd/conf.d/php.conf:

<FilesMatch \.html>
  SetHandler application/x-httpd-php
</FilesMatch>

Настраиваем phpMyAdmin

После установки в системе пакета phpMyAdmin в каталоге /etc/httpd/conf.d появится новый конфиг phpMyAdmin.conf. Чтобы эта система управления базами данных стала отзываться в браузере по адресу http://phpmyadmin, нужно дополнить конфиг. В самое начало конфига добавляем:

<VirtualHost *:80>
  DocumentRoot /usr/share/phpMyAdmin
  ServerName phpmyadmin
В конец конфига дописываем закрывающий тег:

</VirtualHost>
И в файле /etc/hosts дописываем новый хост:

127.0.0.1 phpmyadmin
После перезапуска Apache всё должно аработать.

Настраиваем права и SELinux для локальных сайтов

Проверим и настроим, если требуется права. Для моего пользователя это выглядит так:

sudo chown oleg:oleg /home/oleg/vhosts
sudo chmod 755 -R /home/oleg/vhosts
Можно задать права только на директории Yii - для всех разрешить чтение, а потом выборочно добавить некоторым права на запись. На чтение я сделал так (запуск из директории framework и testdrive):

sudo find . -type d -exec chmod -R 750{} \;
Разрешаем для SELinux работу локальных сайтов из домашнего раздела. В консоли вводим:

sudo setsebool -P httpd_enable_homedirs true
Для того, чтобы посмотреть все переключатели SELinux, в консоли пишем:

getsebool -a
Настраиваем правильные контексты для наших сайтов в SELinux (временно это можно сделать через chcon). Вообще, SELinux имеет много разных контекстов для работы с Apache. Кое-что про них можно узнать здесь. Список доступных в системе контекстов SELinux касательно Apache можно посмотреть с помощью пакета setools-console так:

seinfo -t | grep http
Для простого сайта без всяких движков, но с админкой на Yii и git репозиторием иерархия и контексты у меня получаются следующие:

/vhosts (httpd_sys_content_t)
  |---/site1.local (httpd_sys_content_t)
  |    |---/www (httpd_sys_content_t)
  |    |---/js (httpd_sys_content_t)
  |    |---/style (httpd_sys_content_t)
  |    |---/framework (httpd_sys_content_t)
  |    |---/.git (git_content_t)
  |    |---/admin (httpd_sys_content_t)
  |    |    |---/assets (httpd_sys_rw_content_t)
  |    |    |---/css (httpd_sys_content_t)
  |    |    |---/images (httpd_sys_content_t)
  |    |    |---/protected (httpd_sys_content_t)
  |    |    |    |---/commands (httpd_sys_content_t)
  |    |    |    |---/components (httpd_sys_content_t)
  |    |    |    |---/config (httpd_sys_content_t)
  |    |    |    |---/controllers (httpd_sys_rw_content_t)
  |    |    |    |---/data (httpd_sys_content_t)
  |    |    |    |---/extensions (httpd_sys_content_t)
  |    |    |    |---/messages (httpd_sys_content_t)
  |    |    |    |---/models (httpd_sys_rw_content_t)
  |    |    |    |---/runtime (httpd_sys_rw_content_t)
  |    |    |    |---/views (httpd_sys_rw_content_t)
  |    |    |---/themes (httpd_sys_content_t)
  |    |---/log (httpd_log_t)
  |    |---/tmp (httpd_tmp_t)
  |    |---/sess (httpd_var_run_t)
Устанавливаем временно контекст для каталога:

sudo chcon -R -t httpd_sys_content_t /home/oleg/vhosts
Для того чтобы установить постоянный контекст SELinux выполняем команды такого вида (указывая нужный контекст и каталог):

semanage fcontext -a -t httpd_var_run_t "/home/oleg/vhosts/site1.local/www/testdrive/protected/runtime(/.*)?"
restorecon -R /home/oleg/vhosts/site2.local/www/testdrive/protected/runtime
Framework Yii достаточно сложно настраивать в плане прав доступа и политик SELinux. Но сам движок подскажет, чего ему не хватает, - достаточно в браузере запустить нужную страницу. Для более подробного вывода ошибок, стоит пройтись по параметрам из файла /etc/php.ini и проставить все рекомендуемые в комментариях значения для разработки (Development Value). Уж точно настройки будут отличаться: на машине разработчика и на рабочем сервере.
Поэтому тут нет универсального средства настройки SELinux для каждого случая, но всё можно осилить. Например, если проанализировать предустановленные правила (sudo semanage fcontext -l | grep httpd) и сравнить со своими потребностями. Хотя все повсеместно и предлагают отключить SELinux (как самый быстрый вариант решения проблем запуска), лучше этого не делать, а настроить всё по-уму. Так же можно просмотреть/изменить политики SELinux в графическом интерфейсе утилиты system-config-selinux.


Apache Userdir

Можно настроить Apache так, чтобы при вводе в адресную строку в браузере http://localhost/~oleg, где oleg - имя вашего пользователя в системе, в домашней директории которого располагаются сайты, показывался список ваших сайтов. Ну и можно запускать сайты, как-то так: http://localhost/~oleg/site1.local/www/
Для этого создаём конфиг /etc/httpd/conf.d/userdir.conf с примерно таким содержимым:

<IfModule mod_userdir.c>
  UserDir enabled
  UserDir disabled root
  UserDir vhosts
</IfModule>
<Directory "/home/*/vhosts">
    AllowOverride All
    Options Indexes Includes FollowSymLinks
    Require all granted
</Directory>

Делаем доступ по HTTPS

Чтобы иметь доступ по защищённому протоколу HTTPS, нужно создать сертификат. В случае компьютера разработчика это может быть и самоподписный сертификат, который я рассмотрю. Приступим к генерации сертификата. Для этого нам потребуется установленный openssl (устанавливается по-умолчанию в Fedora). Согласно документации приводятся следующие шаги:
1) Генерируем личный ключ с именем нашего виртуального домена:
openssl genrsa -out site1.local.key 2048
2) Создаём запрос на подпись сертификата:
openssl req -new -key site1.local.key -out site1.local.csr -sha512
3) Подписываем CSR (Certificate Signing Request) собственным ключём:
openssl x509 -req -days 365 -in site1.local.csr -signkey site1.local.key -out site1.local.crt -sha512
Браузер при открытии сайта будет предупреждать, что подпись не доверенная, но можно будет внести в исключения безпасности.
4) Осталось разложить все сгенерированные файлы по своим местам:
sudo cp site1.local.crt /etc/pki/tls/certs/
sudo cp site1.local.key /etc/pki/tls/private/site1.local.key
sudo cp site1.local.csr /etc/pki/tls/private/site1.local.csr
5) Восстанавливаем контекст безопасности SELinux для скопированных файлов:
sudo restorecon -RvF /etc/pki

Итак, самоподписанный сертификат есть, осталось его прикрутить к виртуальному хосту. Apache требует для работы с ssl отдельную библиотеку. Установим:
sudo dnf install mod_ssl
Затем копируем существующий файл настройки Apache для нужного хоста:
sudo cp /etc/httpd/conf.d/site1.conf /etc/httpd/conf.d/z-ssl-site1.conf
Открываем новый файл для редактирования и исправляем порт. Было:
<VirtualHost *:80>
Стало:
<VirtualHost *:443>
Затем дописываем (согласно ещё одной полезной странице документации) следующие директивы:

SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/site1.local.crt
SSLCertificateKeyFile /etc/pki/tls/private/site1.local.key
Перезапускаем Apache:
systemctl restart httpd.service
Если закрыт порт для https на файерволле, то открываем. Постоянно:
sudo firewall-cmd --permanent --add-service=https
Временно:
sudo firewall-cmd --add-service=https
Всё. Можно пробовать открывать свой локальный сайт через https.

Ошибка Errcode: 24 "Too many open files"

Проверяем текущее ограничение:

sudo cat /var/run/mariadb/mariadb.pid
Полученное число подставляем в следующую команду:

cat /proc/число/limits
Скорее всего будет такая картина:
Max open files            1024                 4096                 files
Увеличиваем значение:

sudo mkdir /etc/systemd/system/mariadb.service.d
sudo touch /etc/systemd/system/mariadb.service.d/limits.conf
sudo nano /etc/systemd/system/mariadb.service.d/limits.conf
И вставляем код:

[Service]
LimitNOFILE=10000
Перезапускаем сервер баз данных:

sudo systemctl daemon-reload
sudo systemctl restart mariadb.service

Просмотр статистики сервера Apache

Создаём конфигурационный файл:
sudo nano /etc/httpd/conf.d/mod_status.conf
С содержимым:
<IfModule mod_status.c>
    ExtendedStatus On
    <Location /server-status>
        SetHandler server-status
        Order deny,allow
        Deny from All
        Allow from 127.0.0.1
        Allow from localhost ip6-localhost
    </Location>
</IfModule>
Перезагружаем настройки Apache:
sudo systemctl reload httpd.service
Смотрим отчёт о загрузке через консоль:
lynx -dump localhost/server-status
или в браузере по URL http://127.0.0.1/server-status?refresh=2 (число 2 в конце - это количество секунд, после которых страница перезагрузится)

Полезные ссылки по настройке HTTPS

Официальные инструкции по получению сертификата Let's Encrypt - https://certbot.eff.org/lets-encrypt/centosrhel7-nginx
 Генератор конфига SSL для web-сервера - https://mozilla.github.io/server-side-tls/ssl-config-generator/
Проверка качества настройки защищённого соединения - https://www.ssllabs.com/ssltest/index.html
Установка валидных локальных сертификатов:

mkcert -key-file /mnt/projects/sites/site1/ssl/cert-site11.key -cert-file /mnt/projects/sites/site1/ssl/cert-site11.pem site1.local *.site1.local
mkcert -install

Комментарии

  1. Ответы
    1. Думал, что я единственный читатель этой статьи )) Частенько подглядываю настройку SELinux

      Удалить

Отправить комментарий

Популярные сообщения из этого блога

Пропорциональное распределение суммы

Битрикс: своя геолокация

Bitrix24 API - разбор демо приложения третьего типа