Am două servere fizice care rulează pe aceeași rețea LAN. Ambele rulează servere web; unul rulează apache2, celălalt nginx. Fiecare are un nume de domeniu diferit, dar aceeași adresă IP WAN externă. Să presupunem că aspectul rețelei arată astfel:
WAN
10.20.30.40
|----------|----------|
| |
Domeniul 1 Domeniul 2
exampleABC.com (sub.)exampleXYZ.com
| |
|----------|----------|
|
LAN unic
|
|----------|----------|
| |
Adresă IP 1 Adresă IP 2
192.168.0.10 192.168.0.20
| |
| |
Server 1 Server 2
apache2 nginx
Serverul apache2 îmi aparține, în timp ce serverul nginx nu. Ambele servere au subdomenii dedicate pentru fiecare serviciu pe care îl furnizează - de exemplu, (www.)exampleABC.com pentru pagina web principală, cloud.exampleXYZ.com pentru un serviciu cloud cu proxy invers, media.exampleXYZ.com pentru media etc.
Din motive necunoscute, serverul nginx este cel care are prioritate atunci când se conectează la adresa IP WAN - inițial, ambele domenii ar duce la pagina web principală găzduită de nginx, dar cu următoarea configurație (actuală) nginx, exampleABC.com va duce corect la serverul apache2, în timp ce exampleXYZ.com continuă să conducă la serverul nginx.
Server {
asculta 80;
# asculta pe toate subdomeniile
nume_server exampleABC.com *.exampleABC.com;
Locație / {
# proxy transparent către alt server (port 443)
proxy_pass http://192.168.0.10:80;
# setați antetul „Gazdă” transmis către alt server la FQDN solicitat de client, astfel încât celălalt server să știe ce subdomeniu este solicitat
proxy_set_header Gazdă $http_host;
}
}
Server {
asculta 443 ssl;
nume_server exampleABC.com *.exampleABC.com;
Locație / {
trece_proxy https://192.168.0.10:443;
proxy_set_header Gazdă $http_host;
}
}
Cu toate acestea, subdomeniile găzduite de serverul apache2 (docs.exampleABC.com etc.) continuă să se conecteze la nginx. (Subdomeniile nginx funcționează bine.)
Iată una dintre configurațiile de subdomeniu pe care le-am configurat prin apache2:
<VirtualHost *:80>
ServerName ft.exampleABC.com
Redirecționare permanentă / https://ft.exampleABC.com/
RewriteEngine activat
RewriteCond %{SERVER_NAME} =ft.exampleABC.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
# Directiva ServerName stabilește schema de solicitare, numele gazdă și portul
# serverul îl folosește pentru a se identifica. Acesta este folosit la creare
# adrese URL de redirecționare. În contextul gazdelor virtuale, ServerName
# specifică ce nume de gazdă trebuie să apară în antetul solicitării Gazdă: către
# potriviți această gazdă virtuală. Pentru gazda virtuală implicită (acest fișier) aceasta
# valoarea nu este decisivă deoarece este folosită ca gazdă de ultimă instanță, indiferent.
# Cu toate acestea, trebuie să îl setați pentru orice altă gazdă virtuală în mod explicit.
ServerName ft.exampleABC.com
#ServerAlias *.exampleABC.com
ServerAdmin webmaster@localhost
DocumentRoot /mnt/external/webserver/ft
# Niveluri de jurnal disponibile: trace8, ..., trace1, debug, info, notice, warn,
# eroare, critică, alertă, emerg.
# De asemenea, este posibil să configurați nivelul de jurnal pentru un anumit
# module, de ex.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combinat
# Pentru majoritatea fișierelor de configurare din conf-available/, care sunt
# activat sau dezactivat la nivel global, este posibil să
# includeți o linie doar pentru o anumită gazdă virtuală. De exemplu cel
# următoarea linie activează configurația CGI numai pentru această gazdă
# după ce a fost dezactivat global cu „a2disconf”.
#Include conf-available/serve-cgi-bin.conf
<Director /mnt/external/webserver/ft>
Opțiuni Indexuri FollowSymLinks
AllowOverride Nici unul
Solicitați toate acordate
</Director>
# Comutator motor SSL:
# Activați/dezactivați SSL pentru această gazdă virtuală.
SSLEngine activat
< tăiat: linii adăugate de certbot >
</VirtualHost>
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Aș dori să fac astfel încât, atunci când mă conectez la exampleABC.com, ft.exampleABC.com, etc., clientul să fie conectat corect la serverul apache2. exampleXYZ.com și subdomeniile sale ar trebui să se conecteze în continuare la serverul nginx, desigur.
Alte informații:
Inițial, clientul (de exemplu, browserul web) nu a putut verifica autenticitatea certificatului TLS de la exampleABC.com.(Rețineți că am avut certificate TLS configurate corect sub apache2.) Acest lucru a fost rezolvat prin adăugarea domeniilor mele apache2 la certificatele serverului nginx.
Cu toate acestea, nu cred că acest lucru ar fi trebuit să fie necesar - certificatele mele (sub apache2) ar trebui să fie transmise prin proxy invers, nu?
Dacă încerc să mă conectez la serverul apache2 prin curl în timp ce specific manual antetul Host (prin curl -vL -H „Gazdă: ft.exampleABC.com” https://192.168.0.10
), voi fi redirecționat către pagina web principală a serverului nginx. Nu sunt sigur ce înseamnă asta.
EDITAȚI | ×:
Aceasta este rezultatul nginx -T
, conform administratorului de sistem al sistemului nginx:
- taie -
De asemenea, serverul nginx rulează într-un container prin „SWAG” de la LinuxServer.io.
EDITAȚI | ×:
SWAG de la LinuxServer.io încarcă o configurație nginx diferită de cea implicită. Următoarea comandă primește conf. corecte:
docker exec -it swag /usr/sbin/nginx -c /config/nginx/nginx.conf -T
Rezultatul comenzii menționate poate fi găsit la această pastă. (prea multe caractere pentru StackExchange)