Настройка базового веб-сервера
Рекомендуемым и полностью поддерживаемым веб-сервером Fedora является Apache, называемый в дистрибутиве httpd. Это ключевая функция Fedora Server, входящая в состав служб, указанных в технической спецификации. Эта статья посвящена настройке базового сервера для обслуживания статических HTML-страниц. Последующие статьи основаны на ней и описывают дополнительные конфигурации развёртывания.
|
Эта статья ещё не была окончательно проверена. Некоторые материалы могут быть изменены. |
Веб-сервер Fedora httpd — это, по сути, веб-сервер Apache. В этом документе подробно рассматриваются, в частности, настройка и обслуживание сертификатов для безопасных зашифрованных соединений, которые сегодня являются стандартом. Также рассматриваются различные другие конфигурации, такие как ограничение доступа посредством аутентификации или WebDAV для загрузки и изменения файлов. Основное внимание уделяется доставке статических веб-страниц. В последующих статьях описывается, как можно настроить httpd для других сценариев использования, таких как фронтенд для серверов приложений, прокси для контейнеров, интеграция динамических языков и другие варианты развёртывания.
Как это работает
Установка веб-сервера Fedora хранит конфигурацию в подкаталогах /etc/httpd. Для системного администратора важны только 2 подкаталога. Каталог /etc/httpd/conf.d является более важным и хранит, в частности, конфигурацию различных веб-сайтов. Именно в этом каталоге системный администратор работает чаще всего. Каталог /etc/httpd/conf.modules.d содержит модули, загружаемые динамически, и их конфигурацию. Здесь что-либо нужно менять крайне редко.
Данные для веб-сайта по умолчанию (или «главного» сайта) по умолчанию расположены в /var/www, html-файлы — в его подкаталоге html. Дополнительные каталоги предусмотрены для расширенных конфигураций, например подкаталог cgi-bin для хранения (классических) CGI-файлов.
Эта структура восходит к ранним дням Linux-систем, когда серверное оборудование было способно обслуживать только один сайт (то есть один домен). Когда оборудование стало мощнее и смогло обслуживать более одного домена, были добавлены «виртуальные серверы», предоставляющие дополнительные домены, различаемые либо по имени (виртуальные хосты), либо по IP. Эта ситуация до сих пор присутствует в термине «главный» сайт или «главный» сервер.
Все эти различия теперь устарели. Сегодня повсеместно сервер размещает несколько доменов как само собой разумеющееся. И теперь лучшей практикой является настройка всего как виртуального хоста, даже если сервер обслуживает только один домен.
В программном обеспечении Apache «главный» сервер всё ещё присутствует и служит конфигурацией по умолчанию для наиболее важных параметров, которые наследуются как настройки по умолчанию виртуальным(и) хостом(ами).
Это развитие имеет последствия для организации хранения данных.
Если вы обслуживаете только один домен, вы можете просто использовать каталог «главного» сайта и помещать файлы в подкаталог /var/www/html, используя его для своего единственного виртуального хоста. Этот каталог гарантирует, что сервер httpd полностью работоспособен из коробки для такой цели. Модуль mod_ssl даже предоставляет рабочую конфигурацию https на основе уже предоставленного самоподписанного сертификата.
Но во всех случаях вам нужна более подходящая альтернативная организация данных. Первым уровнем структурирования должен быть домен, а не технология (как html и cgi-bin по умолчанию).
Один из вариантов — использовать каталог /var/www/ для создания подкаталогов для конкретных доменов и дополнительных подходящих подкаталогов внутри них. Преимущество этого подхода в том, что он использует многие конфигурации httpd по умолчанию, например метки SELinux. Недостаток в том, что изменяется конфигурация дистрибутива по умолчанию. Обычно лучше оставить её нетронутой.
Альтернативный вариант, во многих случаях лучше соответствующий стандарту FHS, — это каталог /srv. Сегодня у вас будет много доменов, обслуживаемых одним или несколькими приложениями. Согласно FHS, каталог /srv является подходящим местом для хранения данных. Вы создаёте каталог для конкретного домена, например example.com, и в нём подкаталог htdocs для статических HTML-файлов, подкаталог webapps для вашего веб-приложения, например Ruby on Rails, подкаталог mail для почтового узла postfix/dovecot и т. д.
В этом руководстве мы используем последний вариант. Поэтому мы используем каталоги вида /srv/<DOMAINNAME>/ для хранения всех данных, относящихся к домену, и /srv/<DOMAINNAME>/htdocs/ для статических HTML-страниц. Если вы хотите использовать первый вариант, вы можете заменить /srv/ на /var/www/.
Подготовка хранилища
Перед установкой программного обеспечения необходимо подготовить хранилище. Концепция хранилища Fedora Server Edition требует создания логического тома LVM для хранения пользовательских данных. Есть как минимум два разумных варианта:
-
Создать логический том подходящего размера и смонтировать его в /srv (или /var/www).
-
Создать пул логических томов для тонко провизионированных томов и в нём по одному тонко провизионированному тому на домен.
Первый — хороший выбор, если доменов много и каждый содержит небольшой объём данных, например если веб-сервер в основном используется как фронтенд для серверов приложений, которые управляют своими данными по-своему, например Apache Tomcat в /var/lib/tomcat/webapps или /var/lib/tomcats/<domain>/webapps, или если они хранятся в базе данных или центральном GIT-репозитории (Jamstack CMS).
Последний — хороший выбор, если в каждом домене (или большинстве из них) генерируется большой объём данных, поскольку данные состоят из обширных статических HTML-файлов, или сервер приложений создаётся непосредственно в корне документов http, обычно с Ruby on Rails, например, или CMS на основе Jamstack с децентрализованными GIT-репозиториями.
И конечно, вы также можете комбинировать оба варианта.
Самый простой способ — создать необходимые тома с помощью Cockpit, веб-инструмента администрирования серверов.
Установка
-
Установите Apache HTTP Server. Сегодня вам почти всегда понадобятся модули для управления SSL-соединениями и модуль для мониторинга доменов. Сейчас всё работает через HTTPS.
$ sudo dnf install httpd mod_ssl mod_md $ sudo firewall-cmd --add-service=https --permanent $ sudo firewall-cmd --add-service=http --permanent $ sudo firewall-cmd --reload -
Запустите веб-сервер
$ sudo systemctl start httpd $ sudo systemctl status httpd $ sudo systemctl enable httpd Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service. -
Веб-сервер уже должен отвечать на запросы и показывать тестовую страницу Fedora. Введите адрес вашего сервера в адресную строку браузера.
-
Если вы планируете управлять сертификатами Let’s Encrypt с помощью инструмента EFF
certbot$ sudo dnf install letsencrypt
Настройка веб-сайта
-
Настройка корневого каталога документов веб-сайта
Как обсуждалось выше, есть несколько вариантов. В этом примере мы используем вариант /srv и базовое имя веб-сайта в качестве базового каталога.
$ sudo -i # mkdir -p /srv/SITENAME/htdocsЕсли вы выбираете тонко провизионированные тома, используйте Cockpit, чтобы создать том, отформатировать файловую систему и постоянно смонтировать его в базовом расположении
/srv/SITENAME/. Cockpit выполняет все эти шаги, вам нужно только создать подкаталогhtdocs.При использовании /srv/ в качестве базового каталога необходимо настроить метки SELinux.
# /usr/sbin/semanage fcontext -a -t httpd_sys_content_t -s system_u "/srv/SITENAME/htdocs(/.*)?" # /sbin/restorecon -R -vF /srv/SITENAME/htdocs Relabeled /srv/SITENAME/htdocs from unconfined_u:object_r:var_t:s0 to system_u:object_r:httpd_sys_content_t:s0Создайте простейшую индексную страницу в корневом каталоге документов
# vim /srv/SITENAME/htdocs/index.html <h1><center>It works!</center></h1> -
Настройка виртуального хоста для домена
Чтобы упростить вам задачу, мы предоставляем достаточно подробный шаблон. Скачайте его и сохраните в каталог
/etc/httpd/conf.d/. Скопируйте шаблон, например, какzvhost-SITENAME.conf, и адаптируйте его под свои требования.Хорошей практикой является следование систематическому соглашению об именовании. В примере мы используем префикс «vhost», чтобы чётко отличать конфигурации виртуальных хостов доменов от других конфигураций.
Конфигурационные файлы читаются в алфавитном порядке. Порядок важен. Первый найденный виртуальный хост становится хостом по умолчанию. Он всегда используется, если для запроса не найдено подходящее имя хоста (например, потому что используется IP-адрес).
Веб-сайт, использующий то же имя, что и имя хоста сервера или его запись DNS, требует особых мер. См. раздел «Устранение неполадок».
Отредактируйте скопированный файл шаблона и настройте его должным образом.
$ sudo vi /etc/httpd/conf.d/zvhost-SITENAME.conf # Apache vhost configuration for a static HTML server. # It manages SSL connections including certificates. # Initially, a self-signed certificate is active. # Incoming http traffic is automatically redirected to https. # Version 2.1 #==> To adjust in vi/vim copy and adjust to the vi command line: # : %s/SHORT_DESCR/real_short_descr/g e.g. my-domain.org production server # : %s/FQN_NAME/your_domain/g e.g. my-domain.org # : %s/BASE_NAME/your_shortname/g e.g. my-domain # : %s/OPTIONAL_ALIAS/your_alias/g e.g. www.my-domain.org # afterwards delete these lines # Certificates are managed by Apache md module. #==> To activate, remove the leading '#' character and comment out the # the default distribution provided certificates further down. #==> Adjust the mail address as appropriate! #MDContactEmail root@FQN_NAME #MDCertificateAgreement accepted #MDomain FQN_NAME <VirtualHost *:443> # Secure virtual WEB host configuration for # SHORT_DESCR # The site can be accessed by https/ssl only. Without a valid certificate # you have to use a self-signed certificate as a quick temporary fix. ServerName FQN_NAME ServerAlias OPTIONAL_ALIAS #==> Adjust the mail address as appropriate! ServerAdmin root@FQN_NAME # ########################################################################## # NOTE: We re-route everything from the insecure site to this secure site! # ########################################################################## # Optional: Ensure that all registered domain names are rewritten to the # official base name #RewriteEngine On #RewriteCond %{HTTP_HOST} !^FQN_NAME [NC] #RewriteCond %{HTTP_HOST} !^$ #RewriteRule ^(.*)$ https://FQN_NAME$1 [R=301,L] # ==================================================================== # Certificates configuration # ==================================================================== SSLEngine on # We rely on Fedora's systemwide configuration of SSL security. # By default, certificates are managed by Apache md module (see above) # In this case, no certificates needs to be configured here. # Otherwise, insert proper certificate configuration. # DEFAULT mod_ssl provided, needed for initial startup. #==> Comment OUT when module md created a certificate or you use # custom certificates. SSLCertificateFile /etc/pki/tls/certs/localhost.crt SSLCertificateKeyFile /etc/pki/tls/private/localhost.key # Let's Encrypt certificates managed by certbot (NOT by module md!) #SSLCertificateFile /etc/letsencrypt/live/DOMAIN_NAME/cert.pem #SSLCertificateKeyFile /etc/letsencrypt/live/DOMAIN_NAME/privkey.pem #SSLCertificateChainFile /etc/letsencrypt/live/DOMAIN_NAME/chain.pem # =============================================================== # Directory Locations # =============================================================== DirectoryIndex index.html DocumentRoot /srv/BASE_NAME/htdocs # Specific to default 2.4 configuration: # Enable access to server-specific base file location <Directory "/srv/BASE_NAME"> AllowOverride None # Allow open access: Require all granted </Directory> # Further relax access to the default document root <Directory "/srv/BASE_NAME/htdocs"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server: # Allow open access: Require all granted </Directory> # =============================================================== # Optional: Protect access to start page (and subsequent pages) #==> Ensure you created the additional auth.d directory # including SELinux labels # =============================================================== #<Location /> # AuthType Basic # AuthName "Access start page" # AuthUserFile /srv/BASE_NAME/auth.d/htuser # Require valid-user #</Location> # =============================================================== # Optional: Configure webDAV access #==> Ensure you created the additional davlock directory # including SELinux labels # =============================================================== #DavLockDB /srv/SERVER_SHORT_NAME/davlock/dav_lock_db #<Location /dav> # DAV On # ForceType text/plain # Order Allow,Deny # Allow from all # Options all # DirectoryIndex none # Optional: Protect basic dav page (and all subsequent page) #AuthType Basic #AuthName "Application Server WebDAV access" #AuthUserFile /srv/SERVER_SHORT_NAME/auth.d/htdavuser #Require valid-user #</Location> # =============================================================== # Logging configuration # =============================================================== # Use separate log files for the SSL virtual host; note that LogLevel # is not inherited from httpd.conf. # NOTE: fail2ban searches for ~/logs/*access_log and ~/logs/*error_log # to access log files to watch and analyze! ErrorLog logs/BASE_NAME-ssl_error_log CustomLog logs/BASE_NAME-ssl_access_log combined LogLevel warn </VirtualHost> <VirtualHost *:80> # INSECURE virtual WEB host configuration for # SHORT_DESCR # NOTE: Everything from the insecure port 80 is redirected to this instance' # SECURE site ServerName FQN_NAME ServerAlias OPTIONAL_ALIAS ServerAdmin root@FQN_NAME # ########################################################################## # NOTE: We re-route everything to the secure site! # We retain all aliase names for now. # There is no need for an exception for Let's Encrypt anymore. # Version 2.x can deal with self-signed certificates and https # ########################################################################## RewriteEngine On RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] # =============================================================== # Logging configuration # =============================================================== # Use separate log files for the SSL virtual host; note that LogLevel # is not inherited from httpd.conf. # NOTE: fail2ban searches for ~/logs/*access_log and ~/logs/*error_log # to access log files to watch and analyze! ErrorLog logs/BASE_NAME-error_log CustomLog logs/BASE_NAME-access_log combined </VirtualHost> -
Перезапуск и проверка веб-сервера
# systemctl restart httpd # systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled) Active: active (running) since ... ... ... -
Проверка конфигурации
Снова введите адрес вашего сервера в адресную строку браузера. Поскольку мы уже перенаправляем всё на защищённый сайт, который пока использует самоподписанный сертификат, вы получите предупреждающее сообщение. Выберите «Дополнительно» и примите «риск» здесь. Вы увидите временную тестовую страницу.
-
Окончательный ввод в эксплуатацию
Удалите временный файл
index.htmlи поместите ваше веб-содержимое в корневой каталог документов/srv/SITENAME/htdocs/.
Устранение неполадок
Веб-сайт имеет то же имя, что и сервер
Явление
-
Если веб-сайт использует каталог DocumentRoot, отличный от /var/www/html, то вариант протокола http сервера отобразит правильное содержимое, а вариант https вместо этого будет использовать /var/www/html или страницу по умолчанию, предоставленную дистрибутивом.
-
Если вы используете
certbotдля управления сертификатами, он устанавливает действительный сертификат, но HTTPS-запрос приводит к ошибке недействительного сертификата.
Причина
Служба httpd всегда задаёт «сервер по умолчанию». Его предназначение — отвечать на запросы, для которых служба httpd не может определить конфигурацию веб-сервера. Обычно это происходит, когда клиент обращается к веб-странице по IP-адресу сервера вместо его имени, или всё ещё существует старая запись DNS. Дистрибутив предоставляет конфигурацию SSL по умолчанию в составе mod_ssl. Эта конфигурация по умолчанию связывается с именем хоста или записью DNS сервера и имеет приоритет над конфигурацией, созданной пользователем.
Решение
К сожалению, единственный способ исправить это — изменить предоставленный дистрибутивом конфигурационный файл mod_ssl и удалить конфигурацию сервера по умолчанию. Сначала сделайте резервную копию файла, а затем измените его, как указано.
# cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.fc
# vi /etc/httpd/conf.d/ssl.conf
#
# When we also provide SSL we have to listen to the
# standard HTTPS port in addition.
#
Listen 443 https
##
## SSL Global Context
##
## All SSL configuration in this context applies both to
## the main server and all SSL-enabled virtual hosts.
##
...
...
##
## SSL Virtual Host Context
##
#### <VirtualHost _default_:443> #<======= comment out this line (near line 56)
# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"
#ServerName www.example.com:443
...
...
# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
####SSLEngine on #<======= comment out this line (near line 70)
# List the protocol versions which clients are allowed to connect with.
# The OpenSSL system profile is configured by default. See
...
...
# Point SSLCertificateFile at a PEM encoded certificate. If
# ...
####SSLCertificateFile /etc/pki/tls/certs/localhost.crt #<======= comment out (near line 101)
...
...
####SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #<======= comment out (near line 110)
# Per-Server Logging:
# The home of a custom SSL log file. Use this when you want a
# compact non-error SSL logfile on a virtual host basis.
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
#### </VirtualHost> #<======= comment out this line (last line, usually 218)
# systemctl restart httpd
Когда служба httpd снова запустится, всё должно работать как ожидалось.
Want to help? Learn how to contribute to Fedora Docs ›