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
.
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,
还有就是有些参数你不知道是啥意思,就不要加进去,不一定适合你的业务场景的
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这里着重解释一下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
. Ici, nous nous concentrons sur l'explication du paramètre
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🎜keepalive
en amontExcusez-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!