Вопрос или проблема
В моей работе есть ряд внутренних инструментов, которые Depends: apache2
. Ни один из них не использует порт 80. Все они устанавливаются следующим образом:
Depends: apache2
- Разворачивают сайт (например,
/var/www/foo/index.html
) - Разворачивают конфигурацию сайта (например,
/etc/apache2/sites-available/foo.conf
) - Активируют эту конфигурацию через postinst (например,
/usr/sbin/a2ensite foo
)
Теперь я хотел бы развернуть инструмент без apache, который использует порт 80. К сожалению, apache поставляется с сайтом по умолчанию (000-default.conf
), который обслуживает страницу по этому порту. Поэтому я хотел бы сделать следующее в моем postinst
:
[ -e /usr/sbin/a2query ] && \
/usr/sbin/a2query -s 000-default && \
/usr/sbin/a2dissite 000-default && \
systemctl reload apache2
Это действительно отключает сайт, но lsof -i TCP | grep :http
все еще показывает, что apache2
связан с портом 80. Директива Listen 80
фактически находится вне конфигурации сайта, в /etc/apache2/ports.conf
.
Насколько я знаю, это выходит за рамки любых инструментов a2*
.
Есть ли хороший способ отвязать apache от порта 80?
Некрасивое решение — добавить это в postinst
, но я обычно не люблю редактировать конфигурации сайтов через скрипты.
sed -i 's/^Listen 80/# Listen 80/' /etc/apache2/ports.conf
Ответ или решение
Ваша задача — сделать так, чтобы Apache больше не прослушивал порт 80, тем самым освобождая его для другого инструмента, который не использует Apache. Это необходимо, поскольку Apache по умолчанию закрепляет этот порт посредством директивы Listen 80
, которая находится в файле /etc/apache2/ports.conf
. Учитывая контекст вашей задачи, давайте рассмотрим, как это можно безопасно реализовать в процессе установки (postinst).
Разбор Основных Шагов
-
Отключение Стандартного Сайта Apache:
- Использование
/usr/sbin/a2dissite 000-default
для отключения стандартного сайта — верный шаг. Это отключает зависимости на уровне конфигурации сайта, но не решает проблему самого закрепления порта.
- Использование
-
Изменение Конфигурационного Файла для Порта:
- Хотя изменение конфигурационного файла с помощью
sed
действительно «уродливое» решение, оно приносит нужные результаты. Использование скрипта для редактирования является неподходящим методом из-за возможных конфликтов с обновлениями или другими скриптами.
- Хотя изменение конфигурационного файла с помощью
Рекомендуемое Решение
Использование Файлов Конфигурации Apache
-
Настройка
/etc/apache2/ports.conf
Без Прямого Редактирования:- Вместо прямого редактирования предлагаем создать новый конфигурационный файл или использовать существующий ваш собственный файл в каталоге
sites-available
с директивой для добавления нужных нам настроек.
- Вместо прямого редактирования предлагаем создать новый конфигурационный файл или использовать существующий ваш собственный файл в каталоге
-
Добавление новой конфигурации:
Создайте новый файл конфигурации/etc/apache2/conf-available/custom-port-config.conf
:# отключаем прослушивание порта 80 Listen 8080
- Это освобождает порт 80 и меняет его на 8080, или другой порт, который вам нужен.
-
Включение новой конфигурации:
[ -e /usr/sbin/a2enconf ] && /usr/sbin/a2enconf custom-port-config systemctl reload apache2
Конечный Скрипт postinst
Создайте файл /etc/postinst
со следующим содержанием:
#!/bin/bash
# Отключение дефолтного конфигурационного файла
[ -e /usr/sbin/a2query ] && /usr/sbin/a2query -s 000-default && /usr/sbin/a2dissite 000-default
# Создание кастомной конфигурации
if [ ! -f /etc/apache2/conf-available/custom-port-config.conf ]; then
echo -e "# отключаем прослушивание порта 80\nListen 8080" > /etc/apache2/conf-available/custom-port-config.conf
fi
# Включение кастомной конфигурации
[ -e /usr/sbin/a2enconf ] && /usr/sbin/a2enconf custom-port-config
# Перезагрузка Apache для применения изменений
systemctl reload apache2
Заключение
Это решение позволяет избежать возможности конфликтов по мере обновлений системы и поддерживает гибкость внесения новых изменений. Оно соответствует современным стандартам конфигурирования системы и помогает в упрощении процессов за счет использования возможностей, предоставляемых самой архитектурой Apache.