faire nginx ignorer la configuration du site lorsque son amont ne peut pas être atteint

12

Il y a plusieurs configurations de sites dans mon nginx, et lorsque je redémarre la machine, si l'un des sites en amont ne peut pas être atteint, nginx ne démarrera pas du tout, et ces sites sains ne démarreront pas en conséquence, comment laisser nginx ignore-t-il ces sites invalides?

http {

##
# Basic Settings
##

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

##
# Gzip Settings
##

gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

##
# nginx-naxsi config
##
# Uncomment it if you installed nginx-naxsi
##

#include /etc/nginx/naxsi_core.rules;

##
# nginx-passenger config
##
# Uncomment it if you installed nginx-passenger
##

#passenger_root /usr;
#passenger_ruby /usr/bin/ruby;

##
# Virtual Host Configs
##

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}

et activé par les sites / exemple1 est

upstream example1 {
    server example1.service.example.com;
}
server {
listen 80;
server_name example1.com;
location / {
    proxy_pass http://example1/;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
}

et activé par les sites / example2 est

upstream example2 {
    server example2.service.example.com;
}
server {
listen 80;
server_name example2.com;
location / {
    proxy_pass http://example2/;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
}

Lorsque je redémarre la machine et qu'à ce moment example2.service.example.com est arrêté, nginx ne démarre pas du tout, c'est-à-dire que même example1.service.example.com est disponible, nginx ne sert pas pour example1

===== update Explication de "is down": Tous les sous-domaines sont automatiquement enregistrés / désenregistrés sur mon propre serveur DNS, donc si le serveur est en panne, le DNS ne répondra pas à un tel domaine lorsqu'il essaiera de le résoudre.

cgcgbcbc
la source
Pourriez-vous montrer votre config?
Tero Kilkanen
@TeroKilkanen ajouté.
cgcgbcbc
@ AD7six oui, je veux dire que l'amont ne résout pas, voir la mise à jour de la question pour plus de détails
cgcgbcbc
Je ne pense pas que vous puissiez forcer nginx à commencer par ce qui se résume à une mauvaise configuration. Puisque vous contrôlez le DNS, vous pouvez peut-être le configurer pour renvoyer un résultat valide avec nginx en utilisant un cache de résolveur court.
AD7six
@ AD7six effectuerait une sauvegarde en amont? Je veux dire que si j'ai ajouté un autre hôte (qui sera toujours résoluble) en amont en tant que sauvegarde, nginx démarrerait-il lorsque l'amont normal ne peut pas résoudre?
cgcgbcbc

Réponses:

15

Enfin, je découvre la solution, résoudre le problème de l'emplacement du domaine insdie!

exemple:

server {
    listen 9000;
    server_name example1.example.com;
    location / {
        set $target http://something.service.lab.mu;
        proxy_pass http://$target;
    }
}

Et nginx n'essaiera pas de résoudre http://something.service.lab.muau moment du démarrage.

cgcgbcbc
la source
1
N'a pas travaillé pour moi. Ce faisant proxy_pass $target;, j'obtiens "502 Bad Gateway", proxy_pass http://$targetme donne "500 Internal Server Error". C'est alors que Nginx est en mesure de résoudre l'hôte.
kba
3
Avec l'ajout de @ EmilBurzo, cela fonctionne.
kba
13

Pour quiconque tombe sur ce problème, @cgcgbcbc est correct.

Mais vous devez également ajouter un

resolver 8.8.8.8;

directive au-dessus de la

set $target http://something.service.lab.mu;

sinon vous obtiendrez une erreur dans nginx, comme:

no resolver defined to resolve
Emil Burzo
la source