Puncte:0

Pot face Apache să pornească numai după ce sistemul și-a primit adresa de la DHCP?

drapel au

Rulez Ubuntu într-o VM cu scopul de a avea o instalare locală Wordpress, necesară pentru a face niște teste locale.

În acest scop, am configurat modul de rețea al acestei mașini în VirtualBox la bridge, mi-am configurat routerul de acasă să închirieze întotdeauna aceeași adresă IP (192.168.0.101) la adresa MAC a acestei VM și a configurat Apache să asculte la această adresă în etc/apache2/ports.conf:

Ascultă 192.168.0.101:80

<IfModule ssl_module>
        Ascultă 192.168.0.101:443
</IfModule>

<IfModule mod_gnutls.c>
        Ascultă 192.168.0.101:443
</IfModule>

Un rezultat nefericit al acestui lucru este că Apache refuză adesea să pornească la pornirea sistemului:

m@m-VirtualBox:~$ sudo systemctl status apache2
[sudo] parola pentru m: 
à apache2.service - Serverul Apache HTTP
     Încărcat: încărcat (/lib/systemd/system/apache2.service; activat; prestabilit furnizor: activat)
     Activ: eșuat (Rezultat: cod de ieșire) din Vineri 2021-10-22 16:12:19 CEST; acum 28 de ani
       Documente: https://httpd.apache.org/docs/2.4/
    Proces: 681 ExecStart=/usr/sbin/apachectl start (cod=exit, status=1/FAILURE)
        CPU: 19 ms

paź 22 16:12:19 m-VirtualBox systemd[1]: Se pornește serverul Apache HTTP...
paź 22 16:12:19 m-VirtualBox apachectl[701]: (99)Nu se poate atribui adresa solicitată: AH00072: make_sock: nu s-a putut lega la adresa 192.168.0.101:80
paź 22 16:12:19 m-VirtualBox apachectl[701]: nu există prize de ascultare disponibile, se închide
paź 22 16:12:19 m-VirtualBox apachectl[701]: AH00015: Nu se pot deschide jurnalele
paź 22 16:12:19 m-VirtualBox apachectl[681]: Acțiunea „pornire” a eșuat.
paź 22 16:12:19 m-VirtualBox apachectl[681]: Jurnalul de erori Apache poate conține mai multe informații.
paź 22 16:12:19 m-VirtualBox systemd[1]: apache2.service: Proces de control ieșit, cod=ieșit, stare=1/Eșec
paź 22 16:12:19 m-VirtualBox systemd[1]: apache2.service: A eșuat cu rezultatul „exit-code”.
paź 22 16:12:19 m-VirtualBox systemd[1]: Nu s-a pornit serverul Apache HTTP.

Pot întotdeauna să pornesc Apache manual cu sudo systemctl start apache2 apoi Apache pornește cu succes.

Faceți ca Apache2 să asculte 127.0.0.1 în loc de 192.168.0.101 de asemenea, face ca Apache să pornească cu succes la pornirea sistemului, fără erori precum cea prezentată mai sus.

Prin urmare, bănuiesc că problema poate fi că Apache încearcă să pornească înainte ca DHCP să reușească să-și termine treaba. Apache încearcă să asculte 192.168.0.101, dar mașinii nu are încă această adresă, așa că Apache este refuzat și erorile sunt eliminate.

Pentru a încerca să rezolv această problemă și să verific dacă presupunerea mea este corectă, aș dori să setez cumva apache să pornească numai după ce clientul DHCP este terminat. Este posibil și cum?

drapel in
Nu trebuie să ascultați pe „192.168.0.101”. Doar mergeți cu setările implicite și veți fi bine. De asemenea, am o serie de VM VirtualBox pe care le folosesc pentru dezvoltare și testare. Niciunul dintre ei nu ascultă un anumit IP. Valoarea `localhost` este suficientă.
gaazkam avatar
drapel au
@matigo `localhost` nu este suficient, deoarece acest lucru va interzice accesarea site-ului din afara VM-ului și trebuie să fac asta. Ascultarea pe toate interfețele (`Listen 80`) va funcționa, dar - chiar dacă, teoretic, routerul ar trebui să oprească conexiunile din afara - nu sunt sigur dacă mă simt confortabil cu asta.
drapel in
Aici puteți utiliza Universal Firewall (`ufw`) pentru a permite traficul pe portul 80 numai din rețeaua locală
Puncte:2
drapel au

Răspunsul anterior (din păcate, acum șters) al unui utilizator util al cărui pseudonim mi-a scăpat deja din minte a fost aproape corect.

Acesta a sugerat modificarea /lib/systemd/system/apache2.service fișier de care să depindă network-online.target în loc de implicit reţea.ţintă sau, mai bine, pentru a adăuga un al doilea fișier la /lib/systemd/system numit my-apache2.service cu această modificare. Conform documentației, aceasta este modalitatea corectă de a vă asigura că un serviciu pornește numai atunci când rețeaua este cu adevărat activată.

În timp ce acest lucru funcționează, problema aici este aceea continutul de /lib nu trebuie să fie editate și /etc/systemd/system ar trebui folosit în acest scop. (Da, acest răspuns pe care l-am legat se referă la alte sisteme decât Ubuntu, dar citind man 7 fişier-ierarhie și man 5 systemd.unit pe Ubuntu arată același lucru).

A doua problemă este că, din experiența mea, încercarea de a rula Apache2 de două ori duce la probleme.

Pentru a remedia ambele probleme, răspunsul meu a recomandat anterior crearea unui serviciu conflictual în /etc/systemd/system. Cu toate acestea, acest lucru a fost prea complicat și nu a reușit să rezolve unele dintre problemele de mai sus, și anume nu a fost o dovadă viitoare: modificări la originalul .serviciu fișierul realizat de autorii din amonte nu ar fi încorporat automat în noul nostru .serviciu fişier.

Soluția corectă este să creați un fișier drop-in care adaugă unul nou După dependență de original apache2.service, după cum este documentat de man 5 systemd.unit. Pentru a face acest lucru, trebuie să introduceți următoarea comandă:

# systemctl edit apache2.service

(care este documentat în om 1 systemctl)

...și când se deschide editorul trebuie să introduceți următorul conținut între cel ### Orice între aici și comentariul de mai jos... și ### Rânduri sub acest comentariu... linii:

[Unitate]
După=network-online.target

Și salvați noul fișier.

Rețineți că conform man 5 systemd.unit aceasta nu va înlocui dependențele originale ale serviciului After; mai degrabă, aceasta va adăuga o nouă dependență celor care sunt deja prezente.

Pentru referință, iată conținutul original al /lib/systemd/system/apache2.service:

[Unitate]
Descriere=Serverul Apache HTTP
După=network.target remote-fs.target nss-lookup.target
Documentație=https://httpd.apache.org/docs/2.4/

[Serviciu]
Tip = bifurcare
Mediu=APACHE_STARTED_BY_SYSTEMD=adevărat
ExecStart=/usr/sbin/apachectl start
ExecStop=/usr/sbin/apachectl graceful-stop
ExecReload=/usr/sbin/apachectl grațios
KillMode=mixt
PrivateTmp=adevărat
Restart=la anulare

[Instalare]
WantedBy=multi-user.target

De acum înainte, Apache2 nu ar trebui să mai eșueze să pornească la pornirea sistemului.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.