Probleem: Nginx "Host Not Found In Upstream" Fout
De "Host Not Found In Upstream" fout in Nginx kan optreden bij het gebruik van Docker containers. Deze fout treedt op wanneer Nginx de upstream server in zijn configuratie niet kan oplossen of er geen verbinding mee kan maken. Het komt vaak voort uit netwerkproblemen of verkeerde instellingen in de Docker omgeving.
De Nginx "Host Not Found In Upstream" Fout Oplossen
Using depends_on in docker-compose.yml gebruiken
De depends_on directive in docker-compose.yml helpt bij het beheren van de opstartvolgorde van containers. Het vertelt Docker om bepaalde containers vóór andere te starten. Dit kan helpen om de "Host Not Found In Upstream" fout te voorkomen door ervoor te zorgen dat de vereiste services draaien voordat Nginx start.
Om depends_on in uw docker-compose.yml bestand te implementeren, voeg het toe onder de Nginx service en vermeld de services waarop het moet wachten:
version: '3'
services:
nginx:
image: nginx
depends_on:
- php
# Other Nginx configuration...
php:
image: php:fpm
# PHP configuration...
Tip: Controleer Service Gereedheid
Onthoud dat depends_on alleen wacht tot de container start, niet tot de service erin volledig gereed is. Voor complexere opstellingen, overweeg het gebruik van healthchecks of wait-for-it scripts om ervoor te zorgen dat services volledig operationeel zijn voordat Nginx start.
De Nginx configuratie bijwerken
Controleer de fastcgi_pass directive in uw Nginx configuratie. Zorg ervoor dat het de juiste servicenaam gebruikt zoals gedefinieerd in uw docker-compose.yml bestand. Als uw PHP service "php" heet in docker-compose.yml, zou uw fastcgi_pass er zo uit moeten zien:
fastcgi_pass php:9000;
Controleer ook of de servicenamen in uw Nginx configuratie overeenkomen met die in uw docker-compose.yml bestand. Niet-overeenkomende namen kunnen de "Host Not Found In Upstream" fout veroorzaken.
Wait-for-it scripts implementeren
Wait-for-it scripts zijn shell scripts die de opstart van een container pauzeren totdat een specifieke service gereed is. Deze scripts kunnen helpen om de "Host Not Found In Upstream" fout te voorkomen door ervoor te zorgen dat Nginx pas start nadat de vereiste services volledig operationeel zijn.
Om een wait-for-it script in uw Docker setup te gebruiken:
- Voeg het script toe aan uw projectdirectory.
- Update uw Dockerfile om het script op te nemen.
- Wijzig het commando in uw docker-compose.yml om het wait-for-it script te gebruiken:
nginx:
image: nginx
depends_on:
- php
command: ["./wait-for-it.sh", "php:9000", "--", "nginx", "-g", "daemon off;"]
# Other Nginx configuration...
Deze aanpak voegt bescherming toe tegen timingproblemen die de "Host Not Found In Upstream" fout kunnen veroorzaken.
Example: Aangepast Wait Script
U kunt een aangepast wait script maken dat is afgestemd op uw specifieke behoeften. Hier is een eenvoudig voorbeeld in bash:
#!/bin/bash
set -e
host="$1"
shift
cmd="$@"
until nc -z "$host" 9000; do
>&2 echo "PHP-FPM is unavailable - sleeping"
sleep 1
done
>&2 echo "PHP-FPM is up - executing command"
exec $cmd
Sla dit op als wait-for-php.sh in uw projectdirectory, maak het uitvoerbaar en update uw docker-compose.yml om het te gebruiken:
nginx:
image: nginx
depends_on:
- php
command: ["./wait-for-php.sh", "php", "nginx", "-g", "daemon off;"]
# Other Nginx configuration...
Alternatieve Oplossingen Voor Het Oplossen Van De Nginx Fout
Docker netwerken gebruiken
Het creëren van aangepaste Docker netwerken kan helpen om de "Host Not Found In Upstream" fout op te lossen. Aangepaste netwerken stellen containers in staat om te communiceren met behulp van hun servicenamen als hostnamen.
Om een aangepast netwerk te creëren:
- Definieer het netwerk in uw docker-compose.yml bestand:
networks:
myapp_network:
driver: bridge
- Verbind uw services met dit netwerk:
services:
nginx:
image: nginx
networks:
- myapp_network
php:
image: php:fpm
networks:
- myapp_network
Door een aangepast netwerk te gebruiken, verbetert u de containercommunicatie en vermindert u hostnaam resolutieproblemen.
Tip: Netwerk Isolatie
Creëer aparte netwerken voor verschillende delen van uw applicatie om de beveiliging te verbeteren en de verkeersstroom te beheren. U kunt bijvoorbeeld een frontend netwerk hebben voor webservers en een backend netwerk voor databases:
networks:
frontend:
driver: bridge
backend:
driver: bridge
services:
nginx:
networks:
- frontend
php:
networks:
- frontend
- backend
database:
networks:
- backend
Healthchecks implementeren
Healthchecks in docker-compose.yml kunnen de "Host Not Found In Upstream" fout voorkomen door ervoor te zorgen dat een service gereed is voordat andere services die ervan afhankelijk zijn starten.
Om healthchecks toe te voegen:
- Neem een healthcheck op in uw docker-compose.yml voor de PHP service:
services:
php:
image: php:fpm
healthcheck:
test: ["CMD", "php-fpm", "-t"]
interval: 10s
timeout: 5s
retries: 3
- Update de Nginx service om afhankelijk te zijn van de gezondheid van de PHP service:
services:
nginx:
image: nginx
depends_on:
php:
condition: service_healthy
Deze setup zorgt ervoor dat Nginx pas start nadat de PHP service gereed is om verbindingen te accepteren, waardoor de kans op de "Host Not Found In Upstream" fout wordt verminderd.





