Рейтинг:0

Могу ли я заставить Apache запускаться только после того, как система получит свой адрес от DHCP?

флаг au

Я запускаю Ubuntu на виртуальной машине с целью локальной установки Wordpress, необходимой для локального тестирования.

С этой целью я настроил сетевой режим этой машины в VirtualBox на мостовой режим, настроил мой домашний маршрутизатор так, чтобы он всегда сдавал в аренду один и тот же IP-адрес (192.168.0.101) на MAC-адрес этой виртуальной машины и настроил Apache для прослушивания этого адреса в и т.д./apache2/ports.conf:

Прослушать 192.168.0.101:80

<IfModule ssl_module>
        Прослушать 192.168.0.101:443
</ЕслиМодуль>

<IfModule mod_gnutls.c>
        Прослушать 192.168.0.101:443
</ЕслиМодуль>

К сожалению, результатом этого является то, что Apache часто отказывается запускаться при загрузке системы:

m@m-VirtualBox:~$ sudo systemctl статус apache2
[sudo] пароль для m: 
à apache2.service — HTTP-сервер Apache
     Загружено: загружено (/lib/systemd/system/apache2.service; включено; предустановка поставщика: включена)
     Активно: сбой (результат: код выхода) с пятницы 22 октября 2021 г., 16:12:19 CEST; 28 с назад
       Документы: https://httpd.apache.org/docs/2.4/
    Процесс: 681 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
        ЦП: 19 мс

paź 22 16:12:19 m-VirtualBox systemd[1]: запуск HTTP-сервера Apache...
paź 22 16:12:19 m-VirtualBox apachectl[701]: (99) Невозможно назначить запрошенный адрес: AH00072: make_sock: не удалось привязать к адресу 192.168.0.101:80
paź 22 16:12:19 m-VirtualBox apachectl[701]: нет доступных прослушивающих сокетов, завершение работы
paź 22 16:12:19 m-VirtualBox apachectl[701]: AH00015: невозможно открыть журналы
paź 22 16:12:19 m-VirtualBox apachectl[681]: действие «старт» не выполнено.
paź 22 16:12:19 m-VirtualBox apachectl[681]: в журнале ошибок Apache может быть дополнительная информация.
paź 22 16:12:19 m-VirtualBox systemd[1]: apache2.service: Процесс управления завершен, код = завершен, статус = 1/FAILURE
paź 22 16:12:19 m-VirtualBox systemd[1]: apache2.service: Ошибка с результатом «код выхода».
paź 22 16:12:19 m-VirtualBox systemd[1]: не удалось запустить HTTP-сервер Apache.

Я всегда могу запустить Apache вручную с помощью sudo systemctl запустить apache2 и затем Apache запускается успешно.

Заставить Apache2 слушать 127.0.0.1 вместо 192.168.0.101 также обеспечивает успешный запуск Apache при загрузке системы без ошибок, подобных показанной выше.

Поэтому я подозреваю, что проблема может заключаться в том, что Apache пытается запуститься до того, как DHCP успевает завершить свою работу. Apache пытается прослушивать 192.168.0.101, но машине еще не назначен этот адрес, поэтому Apache отказывается и выдает ошибку.

Чтобы попытаться решить эту проблему и проверить, верна ли моя догадка, я хотел бы каким-то образом настроить apache на запуск только после завершения работы DHCP-клиента. Возможно ли это и как?

флаг in
Вам не нужно прослушивать `192.168.0.101`. Просто используйте значения по умолчанию, и все будет в порядке. У меня также есть несколько виртуальных машин VirtualBox, которые я использую для разработки и тестирования. Ни один из них не прослушивает определенный IP. Достаточно значения `localhost`.
gaazkam avatar
флаг au
@matigo `localhost` недостаточно, так как это запретит доступ к сайту из-за пределов виртуальной машины, и мне нужно это сделать. Прослушивание на всех интерфейсах («Listen 80») будет работать, но, хотя теоретически маршрутизатор должен блокировать внешние подключения, я не уверен, что меня это устраивает.
флаг in
Здесь вы можете использовать универсальный брандмауэр (`ufw`), чтобы разрешить трафик через порт 80 только из локальной сети.
Рейтинг:2
флаг au

Предыдущий (к сожалению, теперь удаленный) ответ полезного пользователя, чей ник уже вылетел из головы, был почти правильный.

Было предложено внести поправку в /lib/systemd/система/apache2.service файл, чтобы он зависел от сеть-online.target вместо стандартного сеть.цель или, лучше, добавить второй файл в /lib/системд/система называется мой-apache2.service с этой модификацией. Согласно документации, это правильный способ убедиться, что служба запускается только тогда, когда сеть действительно работает..

Пока это работает, проблема в том, что содержание /библиотека не подлежат редактированию и /etc/системд/система вместо этого следует использовать для этой цели. (Да, этот ответ, который я связал с системами, отличными от Ubuntu, но чтение иерархия файлов man 7 и человек 5 systemd.unit на Ubuntu показывает то же самое).

Вторая проблема заключается в том, что, по моему опыту, попытка дважды запустить Apache2 приводит к проблемам.

Чтобы устранить обе проблемы, в моем ответе ранее рекомендовалось создать конфликтующую службу в /etc/системд/система. Однако это было слишком сложно и не решило некоторые из вышеперечисленных проблем, а именно не было перспективным: изменения в исходном .оказание услуг файл, созданный вышестоящими авторами, не будет автоматически включен в наш новый .оказание услуг файл.

Правильное решение — создать выпадающий файл, который добавляет новый После зависимость от оригинала apache2.service, как задокументировано человек 5 systemd.unit. Для этого нужно ввести следующую команду:

# systemctl изменить apache2.service

(что задокументировано в человек 1 systemctl)

... и когда откроется редактор, нужно ввести следующее содержимое между в ### Что-нибудь между здесь и комментарием ниже... и ### Строки под этим комментарием... строки:

[Ед. изм]
After=network-online.target

И сохраните новый файл.

Обратите внимание, что согласно человек 5 systemd.unit это не заменит исходные After-зависимости службы; скорее, это добавит новую зависимость к тем, которые уже присутствуют.

Для справки, вот оригинальное содержание /lib/systemd/система/apache2.service:

[Ед. изм]
Description=HTTP-сервер Apache
After=network.target remote-fs.target nss-lookup.target
Документация = https://httpd.apache.org/docs/2.4/

[Оказание услуг]
Тип = разветвление
Среда = APACHE_STARTED_BY_SYSTEMD = истина
ExecStart=/usr/sbin/apachectl старт
ExecStop=/usr/sbin/apachectl изящная остановка
ExecReload=/usr/sbin/apachectl изящный
KillMode=смешанный
PrivateTmp=истина
Перезапустить = при прекращении

[Установить]
WantedBy=многопользовательская.цель

Отныне Apache2 больше не должен запускаться при загрузке системы.

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

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