Después del proxy nginx, cómo obtener la ip que el usuario realmente visita y cómo lidiar con el problema de que nginx informa 504 al acceder a la interfaz que consume mucho tiempo


prefacio

1. Cuando me encontré con la operación de grabar registros de acceso de usuarios en el trabajo, inmediatamente pensé en grabar un artículo sobre cómo obtener la IP real del usuario después del proxy nginx. 2.
Al acceder a la interfaz que consume mucho tiempo, nginx informó un error 504 y registró el funcionamiento de nginx configurando el tiempo de espera de la interfaz de acceso.


1. Obtenga la ip real del usuario después del proxy nginx

1.1 Antecedentes:

En aplicaciones prácticas, es posible que necesitemos obtener la dirección IP del usuario, como juzgar el inicio de sesión remoto o contar el número de visitas de IP, etc. Por lo general, podemos usar request.getRemoteAddr() para obtener la IP del cliente, pero cuando usamos Después de usar nginx como proxy inverso, la dirección IP del servidor nginx siempre se obtiene mediante request.getRemoteAddr().

1.2 Soluciones

Una solicitud definitivamente se puede dividir en un encabezado de solicitud y un cuerpo de solicitud, y la información de la dirección IP de nuestro cliente generalmente se almacena en el encabezado de la solicitud. Si su servidor usa Nginx para equilibrar la carga, debe configurar los encabezados de solicitud X-Real-IP y X-Forwarded-For en su ubicación.

location /api {
    
    
                limit_req zone=allipse burst=24000 nodelay;
                add_header 'Access-Control-Allow-Origin' '*';
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Headers' 'x-requested-with,content-type';
                proxy_pass http://api;
                proxy_set_header   Host    $host;
                proxy_set_header   Remote_Addr    $remote_addr;  
                proxy_set_header   X-Real-IP    $remote_addr;  //一层代理时是用户真实ip,二层代理时是第一台nginxip
                proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;//一层代理时没有值,多层代理里面会存储多个ip值,第一个值就是真实用户ip
       }

1)proxy_set_header X-real-ip $remote_addr;

Obtener la ip real del usuario del lado del servidor web.

Sin embargo, de hecho, para obtener la ip real del usuario, esta no es la única forma, sigamos analizándola a continuación.

2)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Echemos un vistazo a la variable X-Forwarded-For aquí, que es un estándar no RFC desarrollado por squid para identificar la dirección de un cliente que se conecta a un servidor web a través de un proxy HTTP o una IP original del balanceador de carga. -Si está configurado, habrá un registro cada vez que se reenvíe a través del proxy. El formato es cliente1,
proxy1,
proxy2, y las direcciones están separadas por comas. Dado que es un estándar que no es RFC, no hay valor predeterminado, y debe agregarse de forma predeterminada.En este caso, la solicitud enviada por el proxy, en la vista del backend, la dirección remota es la IP del lado del proxy
. Es decir, por defecto no podemos obtener la ip del usuario usando request.getAttribute("X-Forwarded-For"), si queremos obtener la ip del usuario a través de esta variable

1.3 Ejemplos

Hay una aplicación web, reenviada por dos nginx antes, www.linuxidc.com significa que el usuario accede a la web a través de dos nginx.

En el primer nginx, use

proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;

El error de análisis KaTeX actual: subíndice doble en la posición 12: proxy_add_x_̲forwarded_for variable... remote_addr, y el valor de $remote_addr es la IP del usuario, por lo que después de la asignación, el valor de la variable X-Forwarded-For es la dirección IP real del usuario .

Para el segundo nginx, use

proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;

El error de análisis actual de KaTeX: subíndice doble en la posición 12: proxy_add_x_̲forwarded_for variable... El valor de la parte remote_addr es la dirección IP del nginx anterior, por lo que después de esta asignación, el valor del X-Forwarded-For actual se convierte en "user's ip real, la ip del primer nginx", así quedará claro.

Finalmente, vemos que hay otro error de análisis de KaTeX: Subíndice doble en la posición 7: http_x_̲forwarded_for variable... http_x_forwarded_for encontrará que el valor obtenido al usar request.getAttribute("X-Forwarded-For") en el lado del servidor web es nulo. Si desea obtener la ip del usuario a través de request.getAttribute("X-Forwarded-For"), primero debe usar proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for; para que pueda obtener la ip real del usuario.

1.4 Resumen

Almacenamiento: configure el siguiente encabezado de solicitud proxy_set_header X-Real-IP $remote_addr en el bloque de ubicación de nginx
,
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Recuperar: en el backend a través de request.getHeader("X-Real-IP ''), request.getHeader("X-Forwarded-For '')

Conclusión: la ip real del usuario se puede obtener mediante la configuración de X-Real-IP en el primer nivel de proxy, el primer nginxip está en el segundo nivel de proxy, no hay valor en el primer nivel de proxy, múltiples valores de ip se almacenará en el proxy multicapa, el segundo valor One es la IP del usuario real, luego debe usar X-Forwarded-For

2. Acceda a la interfaz nginx que consume mucho tiempo informa el error 504

2.1, la causa del problema

nginx响应超时,页面出现504 gateway time-out

Este tipo de situación suele ocurrir cuando nginx se usa como proxy inverso. Por ejemplo, cuando nginx se usa como proxy inverso para reenviar una determinada interfaz swagger, cuando se informa un error al acceder a la interfaz, el código de estado generalmente es 504, cuál es el problema del tiempo de espera del proxy. Una interfaz lenta ha excedido el tiempo de espera predeterminado de nuestro acceso a la interfaz nginx.

2.2 Soluciones

Modo proxy
Generalmente, usamos el mecanismo de proxy de nginx como un proxy inverso. En este momento, necesitamos modificar el archivo de configuración de nginx nginx.conf y agregar el siguiente contenido en la sección http o servidor:

large_client_header_buffers 4 16k;
client_max_body_size 30m;
client_body_buffer_size 128k;

proxy_connect_timeout 90; #后端服务器连接的超时时间,发起握手等候响应超时时间
proxy_send_timeout 90;  #后端服务器数据回传时间,就是在规定时间内后端服务器必须传完所有的数据
proxy_read_timeout 90;  #连接成功后,等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间,页面等待服务器响应时间)
proxy_buffers 4 32k;  #4是数量 32k是大小 该指令设置缓存区的大小和数量,从被代理的后端服务器取得的第一部分响应内容,会放置到这里,默认情况下,一个缓存区的大小等于内存页面大小,可能是4k也可能是8k取决于平台
proxy_busy_buffers_size 64k; #nginx在收到服务器数据后,会分配一部分缓冲区来用于向客户端发送数据,这个缓存区大小由proxy_busy_buffers_size决定的。大小通常是proxy_buffers单位大小的两倍,官网默认是8k/16k

proxy_temp_file_write_size 64k;

Luego reinicie nginx, y el problema general de tiempo de espera se resolverá.

Modo Fastcgi
En la mayoría de los casos, usamos el modo proxy, pero a veces también encontramos el modo fastcgi, como la escena del uso de nginx para procesar páginas php. De hecho, el método de procesamiento es similar, también es modificar el archivo de configuración de nginx nginx.conf, y agregar el siguiente contenido en la sección http o servidor:

large_client_header_buffers 4 16k;
client_max_body_size 30m;
client_body_buffer_size 128k;
fastcgi_connect_timeout 600 :指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout 600 :向FastCGI传送请求的超时时间。
fastcgi_read_timeout 600 :指定接收FastCGI应答的超时时间。
fastcgi_buffer_size 64k :指定读取FastCGI应答第一部分需要用多大的缓冲区,默认的缓冲区大小为。fastcgi_buffers指令中的每块大小,可以将这个值设置更小。
fastcgi_buffers 4 64k :指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求,如果一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于磁盘。一般这个值应该为站点中php脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“8 32K”、“4 64k”等。
fastcgi_busy_buffers_size 128k :建议设置为fastcgi_buffers的两倍,繁忙时候的buffer。
fastcgi_temp_file_write_size 128k :在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGateway。

Luego reinicie nginx, y el problema general de tiempo de espera se resolverá.

ejemplo:
inserte la descripción de la imagen aquí

2.3 Conclusión

Agregue principalmente la siguiente configuración en el bloque http o en el bloque del servidor proxy específico para aumentar el tiempo de espera de respuesta de la interfaz

proxy_connect_timeout 90; #El tiempo de espera de la conexión del servidor backend, iniciar el protocolo de enlace y esperar el tiempo de espera de respuesta
proxy_send_timeout 90; #Tiempo de retorno de datos del servidor backend, es decir, el servidor backend debe transmitir todos los datos dentro del tiempo especificado
proxy_read_timeout 90;

Supongo que te gusta

Origin blog.csdn.net/wei1359765074410/article/details/127683608
Recomendado
Clasificación