Konfigurieren Sie Apache vhost, auf dem mehrere Server ausgeführt werden

834
Xorifelse

Ich möchte einen Python 3. * - und einen PHP 7. * -Server ausführen, der direkt nebeneinander ausgeführt wird und Folgendes verwendet:

php.localhost py.localhost 

Meine /etc/httpd/conf/httpd.conf:

# Dynamic Shared Object (DSO) Support LoadModule wsgi_module modules/mod_wsgi.so LoadModule php7_module modules/libphp7.so AddHandler php7-script php Include conf/extra/php7_module.conf WSGIScriptAlias / /var/www/python/app.py  ServerName localhost  # Virtual hosts Include conf/extra/httpd-vhosts.conf 

Vollständige httpd.confDatei hier .

Meine /etc/httpd/conf/extra/httpd-vhosts.conf:

<VirtualHost *:80> ServerAdmin yesididuse@google.com DocumentRoot "/var/www/php" ServerName php ServerAlias php.localhost ErrorLog "/var/log/httpd/php-error.log" CustomLog "/var/log/httpd/php-access.log" common </VirtualHost>  <VirtualHost *:80> ServerAdmin yesididuse@google.com DocumentRoot "/var/www/python" ServerName python ServerAlias py.localhost ErrorLog "/var/log/httpd/py-error.log" CustomLog "/var/log/httpd/py-access.log" common </VirtualHost> 

Meine /etc/hosts:

# Static table lookup for hostnames. # See hosts(5) for details. 127.0.0.1 php.localhost 127.0.0.1 py.localhost 

Und mein Hostname ist L702X.

Ich bin ratlos hier, ich habe Suchmaschinen durchforstet, die Anleitungen befolgt haben und nichts scheint hier sinnvoll zu sein. Wie kann eine Route nach 127.0.0.1 zu zwei verschiedenen Adressen gehen?

Wenn mir Konfigurationsdateien fehlen, kommentiere ich und ich werde hinzufügen. Jede Hilfe wird geschätzt.

1

2 Antworten auf die Frage

2
grawity

Wie kann eine Route zu 127.0.0.1 an zwei verschiedene Adressen gehen

Nein, die hostsDatei sollte umgekehrt interpretiert werden: Zwei verschiedene Namen werden in dieselbe Adresse 127.0.0.1 übersetzt ("wenn Sie py.localhost erreichen möchten, wenden Sie sich an 127.0.0.1") - wie zwei Personen, die eine Telefonnummer teilen.

Dies hat keinerlei Auswirkungen auf das IP-Layer-Routing. Es ist immer noch dasselbe 127.0.0.1, egal wie es erhalten wurde, und Pakete dorthin gehen auf die gleiche Weise.

(Das Gleiche geschieht im Internet sehr häufig, wobei Hunderte von DNS-Domänen in die IP-Adresse des gleichen Webservers aufgelöst werden.)

Der einzige interessante Aspekt besteht darin, wie Apache zwischen HTTP-Anforderungen unterscheidet, die zu verschiedenen Domänen gehören. Dies wurde bereits auf dieser Site wiederholt. Die Antwort ist jedoch, dass Browser den Domänennamen in die HTTP-Anforderung aufnehmen (durch Hinzufügen eines Host:HTTP-Headers).

Ich kann nicht glauben, dass ich so lange gebraucht habe, um es zu markieren. Ich las und stimmte zu, als ich sah, dass es bei Ihrem letzten Absatz wusste, wo ich suchen musste. Es war etwas anstrengend, aber es funktionierte teilweise so, wie ich es wollte. Ich habe mich dann entschlossen, Apache zu entfernen und mit Nginx zu gehen, und ich habe es viel einfacher einsatzbereit. Ich habe einfach vergessen, es zu markieren, ich entschuldige mich. Xorifelse vor 6 Jahren 0
1
Anaksunaman

Als Ergänzung zu @ grawitys hervorragender Antwort sollten Sie bedenken, dass DNS (oder in diesem Fall Ihre hostsDatei, die demselben Zweck dient) nur einer IP-Adresse einen Namen zuordnet. In diesen Namen ist jedoch kein IP-Limit enthalten. Zu-IP-Zuordnungen. @ grawitys Beispiel, dass eine Telefonnummer (IP) verschiedene Personen (Namen / Programme) erreichen kann, ist ein gutes Beispiel.

Wenn es eine Zuordnungsregel gab, bei der eine einzelne IP nur einmal verwendet werden konnte, konnten Sie nicht mehrere Dienste (auch unterschiedlicher Art) von derselben IP aus ausführen, was eine erhebliche technische Einschränkung darstellen würde. Sie benötigen separate IPs (und möglicherweise Server) für HTTP, DNS, E-Mail usw. und alle Subdomains ( www.example.com ist beispielsweise eine Subdomain von example.com und würde eine separate IP von example.com erfordern. ) .

Da in diesen Zuordnungen keine solche Beschränkung besteht, wenden sich Programme normalerweise an einen Server an verschiedenen Ports, um den Datenverkehr zu trennen. Beachten Sie, dass Ports nicht in DNS-Einträgen (oder in Ihrer hostsDatei) enthalten sind. Es ist Sache der einzelnen Softwarekomponenten, zu entscheiden, welche Ports sie zur Kommunikation verwenden sollen. Wenn mehrere Anfragen nach unterschiedlichen Namen auf einem einzigen Port empfangen werden (Port 80 oder 443 für normalen Web-Verkehr), muss der Server (der sich in Ihrem Fall auf 127.0.0.1 befindet) entscheiden, was er tun soll, wenn z Bitte um php.localhostoder py.localhost.

Hier kommt das namenbasierte virtuelle Hosting (technisch Server Name Indication [SNI] für HTTPS) zum Einsatz. Ihre virtuelle Hosts-Datei enthält die Anweisungen für Apache, die besagen "Wenn wir eine Anfrage für diesen Hostnamen erhalten, tun Sie X." Wenn kein passender Name vorhanden ist, gibt der Server normalerweise einen HTTP-Statuscode 404 (Nicht gefunden) zurück. Wenn dies der Fall ist, teilt der Eintrag des virtuellen Hosts dem Server mit, wie er vorgehen soll (Seiten aus diesem Verzeichnis bedienen usw.).


Beachten Sie, dass Ihr ServerName localhostEintrag httpd.confein Standardhost ist. Dieser Host wird manchmal bereitgestellt, anstatt einen 404 zurückzugeben, wenn in Ihrer virtuellen Hosts-Datei kein übereinstimmender Hostname gefunden wird.


Vielen Dank für die ausführliche und klare Erklärung, es hat definitiv einige Fragen geklärt, die sich beim Durcheinander ergeben. Ich hatte schon oben auf diese Frage gestimmt, sorry kann nur eine markieren. Sie wissen, wie SE rollt;) Xorifelse vor 6 Jahren 0
Lol, das tue ich. Ich schätze alles ehrlich. ;) Wirklich, ich bin nur froh zu wissen, dass es zumindest ein bisschen geholfen hat. =) Anaksunaman vor 6 Jahren 0
Es hat definitiv geholfen, keine der 2 Antworten löste das Problem direkt. Aber ich bin eher ein Programmierer (aktiv auf so), also wusste ich, dass ich frustriert war, als ich die meiste Terminologie kannte, aber ich konnte es nicht alleine herausfinden. Ich habe es schließlich geschafft, es teilweise zum Laufen zu bringen (vor 2 Wochen oder auch mit Hilfe dieser 2 Antworten), etwa 1 Minute später entschied ich mich, stattdessen mit Nginx zu gehen und Apache zu entfernen. Stellen Sie alles in ungefähr 10 Minuten auf, wenig bis keine Probleme. Ich denke, ich bin mit Apache fertig (das hat mir gut über 9 Jahre gedient). Xorifelse vor 6 Jahren 0