recherche

Maison  >  Questions et réponses  >  le corps du texte

Problème de connexion longue du proxy inverse Nginx

J'ai plusieurs serveurs A, B, C, D, E... Parmi eux, A peut accéder au réseau externe, mais les autres ne le peuvent pas. J'utilise la méthode http_proxy pour accéder au réseau externe via A. Le but principal est de. accédez à l'interface du partenaire, telle que http ://api.xxx.com/get/user, probablement des centaines de fois par seconde.

Ces derniers jours, j'ai essayé de voir si je pouvais maintenir une connexion longue entre A et le serveur partenaire (supposé être Z). Après modification et tests, l'en-tête renvoyé par Z montre déjà que le http/1.1. la connexion est maintenue, mais le temps d'attente du socket est toujours très élevé. De plus, dans le journal de A, le paramètre $connection de nginx augmente toujours. Pourquoi est-ce ?

.

Voici la configuration du proxy-pass sur A :

server{

  resolver 10.10.2.118;

  listen 1080;
  error_log   /var/log/nginx/proxy.error.log   error;
  access_log  /var/log/nginx/proxy.access.log  proxy_access;

  location / {
    proxy_pass http://$host$request_uri;
    proxy_redirect off;
    proxy_set_header  Host $host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Connection "keep-alive";
    proxy_http_version 1.1;
    proxy_ignore_client_abort on;
    proxy_connect_timeout 600;
    proxy_read_timeout 600;
    proxy_send_timeout 600;
    proxy_buffer_size 64k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;

    allow 10.0.0.0/8;
    deny all;
  }
}

Est-ce un problème avec ma configuration ? Je ne comprends pas Internet et je ne fais que déconner. J'espère que quelqu'un a des connaissances et pourra me donner des conseils

.
PHP中文网PHP中文网2745 Il y a quelques jours781

répondre à tous(2)je répondrai

  • 高洛峰

    高洛峰2017-05-16 17:26:38

    J'ai vu le blog officiel et transmis cette question, alors je suis venu vous aider à la vérifier. Je ne sais pas si vous l'avez résolu vous-même

    .

    Tout d'abord, parlons de votre configuration. Je ne sais pas d'où elle vient. Elle contient un tas de paramètres sur le proxy. Prenons votre proxy_pass comme exemple
    $host$request_uri. pointe vers votre configuration d'origine. L'adresse, par exemple, accède à 10.0.0.100/api/user de votre machine A (supposée être 10.0.0.100), où $host est 10.0.0.100, $request_uri est/api/user, donc quelque chose de bizarre s'est produit, l'accès A puis les délégués à A. Est-ce qu'il s'est effondré ? Je n'ai pas sommeil. Je ne vais pas continuer à expliquer ce qui va se passer dans cette situation, je vais juste vous proposer une solution simple$host$request_uri就是指向你原来的地址,例如访问你的A机器(假设为10.0.0.100)的10.0.0.100/api/user,其中$host就是10.0.0.100,$request_uri就是/api/user,所以这里奇葩的事情发生了,访问A然后又代理到A,是不是已经崩溃了,有点儿困,我就不继续解释这种情况下到底会发生什么了,直接说下简单地解决办法
    ----------------就决定是你了,upstream----------------
    这里设你需要访问的外网ip为123.123.123.123,

    upstream backend {
        server 123.123.123.123;
        keepalive 10;
    }
    location / {
        proxy_pass http://$backend;
        proxy_http_version 1.1;
        proxy_ignore_client_abort on;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        proxy_buffer_size 64k;
        proxy_buffers   4 32k;
        proxy_busy_buffers_size 64k;
        proxy_temp_file_write_size 64k;
    
        allow 10.0.0.0/8;
        deny all;
    }
    

    还有就是有些参数你不知道是啥意思,就不要加进去,不一定适合你的业务场景的
    这里着重解释一下upstream里面的这个keepalive. ----------------La décision vous appartient, en amont----------------
    Ici, définissez l'adresse IP du réseau externe auquel vous devez accéder au 123.123.123.123,
    rrreee

    De plus, si vous ne savez pas ce que signifient certains paramètres, ne les ajoutez pas. Ils pourraient ne pas convenir à votre scénario commercial

    . Ici, nous nous concentrons sur l'explication du paramètre keepalive en amont

    Nous savons que dans la spécification HTTP 1.1, il n'y a pas d'identifiant de requête comme dans HTTP/2. Une connexion TCP keepalive ne peut envoyer qu'une seule requête http à la fois. La deuxième requête ne peut pas être envoyée jusqu'au retour de la requête. performances Pourquoi les serveurs Web (tels que Tengine) fusionnent-ils des fichiers statiques tels que js en un seul (pour gagner du temps et des connexions)🎜 Pourquoi dois-je utiliser le nombre 10 ici ? En supposant qu'il faut 100 ms pour demander un hôte externe et le renvoyer, un seul TCP peut effectuer 10 requêtes en 1 s. Pour répondre à votre exigence de 100 fois par seconde, il doit s'agir d'une longue connexion. , en gros L'algorithme est comme ceci. Dans des situations réelles, vous pouvez configurer ce nombre pour qu'il soit correctement supérieur à la valeur calculée, et la stabilité peut être meilleure🎜 🎜Si vous avez des questions, laissez un message🎜

    répondre
    0
  • phpcn_u1582

    phpcn_u15822017-05-16 17:26:38

    Excusez-moi : si le serveur backend est dynamique en ce moment, comment utiliser le keepalive d'amont pour garantir que nginx et le backend ont une longue connexion ? Merci!

    répondre
    0
  • Annulerrépondre