Разработка сайтов на домашней машине с 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
спасибо, выручил
ОтветитьУдалитьДумал, что я единственный читатель этой статьи )) Частенько подглядываю настройку SELinux
Удалить