4 votes

Nginx ip_hash ne répartit pas équitablement les connexions vers le backend meteor

Je ne parviens pas à faire en sorte que nginx équilibre les connexions internes avec ip_hash activé. J'ai besoin de sessions collantes car j'utilise Meteor en backend avec des sockets mais toutes les requêtes frappent toujours le même backend.

Le fichier journal d'accès nginx montre les adresses IP suivantes:

192.168.0.20 - - [xx/xxx/2017:xx:xx:xx +xxxx] "GET /favicon.ico HTTP/1.1"  404 5 "http://xxxx.lokal/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
192.168.0.11 - - [xx/xxx/2017:xx:xx:xx +xxxx] "GET /sockjs/602/dpkl6lfe/websocket HTTP/1.1" 101 55045 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
192.168.0.208 - - [xx/xxx/2017:xx:xx:xx +xxxx] "GET /sockjs/031/cx1kml79/websocket HTTP/1.1" 101 1146677 "-" "Mozilla/5.0 (iPad; CPU OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1"

Est-ce parce qu'elles proviennent toutes du même sous-réseau 192.168.0.*? Si c'est le cas, comment puis-je modifier ce comportement?

Voici mon fichier de configuration:

utilisateur  www;
processus_de_travail  4;
journal_erreurs  /var/log/nginx/error.log;

evenements {
 connexions_du_travailleur  1024;
}

http {
    map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
    }

    amont demo {
      ip_hash;
      serveur 127.0.0.1:5000;
      serveur 127.0.0.1:5001;
    }

    inclure       types_mimes;
    type_par_defaut  application/octet-stream;
    journal_acces  /var/log/nginx/access.log;

    protocoles_ssl TLSv1 TLSv1.1 TLSv1.2; # Abandon de SSLv3, ref : POODLE
    ciphers_preferred_server_ssl activé;
    nopush_tcp activé;
    nodelay_tcp activé;
    delai_maintien 65;
    taille_max_hachage_types 2048;

    gzip activé;
    gzip_desactiver "msie6";

    jetons_serveur_nginx desactives; # pour la sécurité par obscurcissement : ne plus afficher la version de nginx

     serveur {
          ecouter       80;
              nom_serveur xxxx.lokal;

          emplacement / {
            proxy_pass http://demo;
            redirection_proxy      off;
            definir_en_tete_proxy    Hote              $host;
            definir_en_tete_proxy    X-Real-IP         $remote_addr;
            definir_en_tete_proxy    X-Forwarded-For   $proxy_add_x_forwarded_for;
            definir_en_tete_proxy    X-Forwarded-Proto $scheme;
            version_http_proxy 1.1;
            definir_en_tete_proxy    Upgrade           $http_upgrade; # permettre les websockets
            definir_en_tete_proxy    Connection        "upgrade"; 
            mise_en_memoire_proxy     off;
            delai_connexion_proxy 43200000;
            delai_lecture_proxy    43200000;
            delai_envoi_proxy    43200000;

            si ($uri != '/') {
                expire 30d;
            }
    }
}

8voto

Tero Kilkanen Points 32968

Oui, cela se produit car ip_hash utilise uniquement les trois premiers octets de l'adresse IP pour sélectionner le nœud backend.

Vous pouvez utiliser la directive hash $remote_addr; pour que nginx utilise l'adresse IP distante complète pour le hachage. L'inconvénient est que si un nœud tombe en panne, toutes les correspondances de hachage changent et les sessions seront perdues.

Vous pouvez trouver plus d'informations sur les méthodes de sélection d'amont à l'adresse documentation du module amont nginx.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X