Entrada y práctica de Nginx

1. Introducción básica

1.1 Descripción general de Nginx

Nginx ("motor x") es un servidor proxy inverso y HTTP de código abierto, alto rendimiento y alta confiabilidad, que se caracteriza por una menor ocupación de memoria y una fuerte capacidad de concurrencia. De hecho, la capacidad de concurrencia de Nginx es mejor que la mismo tipo de servidor web Bueno, puede soportar cargas altas, y hay informes de que puede soportar hasta 50,000 conexiones simultáneas. Los portales de sitios web que usan Nginx en China continental incluyen: Baidu, Jingdong, Sina, Netease, Tencent, Taobao, etc.

Sitio web oficial de Nginx: http://nginx.org/

1.2 Proxy de reenvío

Para hablar de proxy inverso, primero debemos hablar de proxy de reenvío. El proxy de reenvío se refiere a configurar el servidor proxy en el cliente para solicitar el servidor. El servidor proxy procesa la solicitud del cliente. El servidor no sabe cuál es la solicitud del cliente. Este tipo de proxy es un proxy de reenvío.

1.3 Proxy inverso

En el proxy inverso, el cliente desconoce el proxy y no sabe qué servidor maneja su solicitud. Debido a que el cliente puede acceder sin ninguna configuración, solo necesitamos enviar la solicitud al servidor proxy inverso, y el servidor proxy inverso selecciona el servidor de destino para obtener los datos y luego se los devuelve al cliente. servidor proxy y el destino Un servidor es un servidor para el mundo exterior. El proxy inverso expone la dirección del servidor proxy y oculta la dirección IP del servidor real. A diferencia del proxy directo que actúa como proxy del cliente, el proxy inverso actúa como proxy del servidor.

Por ejemplo:
inserte la descripción de la imagen aquí
En este proceso, el número 10086 es equivalente a un agente, y el operador que realmente brinda el servicio es el operador, pero para el cliente, no le importa qué operador brinda el servicio, solo necesita recordar el número. 10086. .

Todas las solicitudes se marcan al 10086 y luego el 10086 reenvía la solicitud a un determinado operador para su procesamiento. Por lo tanto, aquí, 10086 es equivalente a un proxy, excepto que representa al operador en lugar del cliente.Este proxy se denomina proxy inverso.

1.4 Equilibrio de carga

El cliente envía varias solicitudes al servidor, el servidor procesa las solicitudes y algunas pueden interactuar con la base de datos. Una vez que el servidor termina de procesar, los resultados se devuelven al cliente.

Este patrón arquitectónico es más adecuado para los primeros sistemas con relativamente pocas solicitudes concurrentes y relativamente únicas, y el costo también es bajo. Sin embargo, con el crecimiento continuo de la cantidad de información, el rápido crecimiento de la cantidad de acceso y datos, y la complejidad del negocio del sistema, esta arquitectura hará que la solicitud del cliente correspondiente del servidor sea cada vez más lenta, y cuando la concurrencia sea particularmente grande, es fácil hacer que el servidor se bloquee directamente. Obviamente, este es un problema debido a un cuello de botella en el rendimiento del servidor, entonces, ¿cómo resolver esta situación?

Nuestro primer pensamiento puede ser actualizar la configuración del servidor, como aumentar la frecuencia de ejecución de la CPU, aumentar la memoria, etc. para mejorar el rendimiento físico de la máquina para resolver este problema, pero sabemos que la Ley de Moore es cada vez más inválida, y la mejora del rendimiento del hardware ya no puede satisfacer la creciente demanda. El ejemplo más obvio es que el día de Tmall Double Eleven, el acceso instantáneo a un producto de gran venta es extremadamente grande, por lo que, similar a la arquitectura del sistema anterior, es imposible agregar máquinas a la configuración física de nivel superior existente. satisfacer las necesidades. ¿Entonces lo que hay que hacer?

En el análisis anterior, hemos eliminado el método de aumentar la configuración física del servidor para resolver el problema, lo que significa que la solución vertical al problema no funcionará, entonces, ¿qué hay de aumentar la cantidad de servidores horizontalmente? En ese momento surgió el concepto de agrupamiento y un solo servidor no podía resolverlo, aumentamos la cantidad de servidores y luego distribuimos la solicitud a cada servidor, en lugar de concentrar la solicitud original en un solo servidor, la solicitud se distribuyó a varios servidores. La carga se distribuye a diferentes servidores, que es lo que llamamos balanceo de carga.

1.5 Separación dinámica y estática

Para acelerar la velocidad de análisis del sitio web, diferentes servidores pueden analizar páginas dinámicas y páginas estáticas para acelerar la velocidad de análisis. Reduzca la presión sobre el servidor único original.

Por ejemplo, usar Nginx como servidor de recursos estáticos: los recursos en Java se pueden dividir en dinámicos y estáticos. Tomcat debe analizar los recursos dinámicos antes de devolverlos al navegador, como páginas JSP, páginas de Freemarker, datos JSON devueltos por el controlador, etc., todos los cuales se cuentan como recursos dinámicos, Tomcat procesa los recursos dinámicos y la velocidad inevitablemente disminuirá. Para los recursos estáticos, como imágenes, HTML, JS, CSS y otros recursos, Tomcat no necesita analizar dichos recursos. Cuando el cliente solicita estos recursos, es suficiente devolver los recursos al cliente. En este punto, puede usar Nginx para crear un servidor de recursos estáticos y devolver los recursos estáticos directamente al cliente.

Una vez que se separan el front-end y el back-end, la velocidad de acceso a los recursos estáticos se puede mejorar considerablemente. Incluso si los servicios dinámicos no están disponibles, el acceso a los recursos estáticos no se verá afectado.

inserte la descripción de la imagen aquí

2. Instalación de Nginx

A continuación se describe cómo instalar Nginx en el sistema Linux CentOS 7,
(1) Preparación del entorno:
1. Instale gcc

Para instalar nginx, primero debe compilar el código fuente descargado del sitio web oficial. La compilación depende del entorno gcc. Si no hay un entorno gcc, debe instalar:

yum install gcc-c++

2. Instalación PCRE pcre-devel

PCRE (Expresiones regulares compatibles con Perl) es una biblioteca de Perl que incluye una biblioteca de expresiones regulares compatible con Perl. El módulo http de nginx usa pcre para analizar expresiones regulares, por lo que la biblioteca pcre debe instalarse en Linux. pcre-devel es una biblioteca de desarrollo secundaria desarrollada con pcre. nginx también requiere esta biblioteca. Pedido:

yum install -y pcre pcre-devel

3. instalación de zlib

La biblioteca zlib proporciona muchas formas de comprimir y descomprimir.nginx usa zlib para comprimir el contenido del paquete http, por lo que la biblioteca zlib debe instalarse en Centos.

yum install -y zlib zlib-devel

4. Instalación
de OpenSSL OpenSSL es una poderosa biblioteca criptográfica de capa de conexión segura, que incluye los principales algoritmos criptográficos, funciones de administración de encapsulación de claves y certificados de uso común y protocolos SSL, y proporciona una gran cantidad de aplicaciones para pruebas u otros fines.
Nginx admite no solo el protocolo http, sino también https (es decir, transmite http a través del protocolo ssl), por lo que debe instalar la biblioteca OpenSSL en Centos.

yum install -y openssl openssl-devel

(2) Paso 1: Instale el paquete de software

wget http://nginx.org/download/nginx-1.17.0.tar.gz

Luego descomprima el directorio descargado

tar -zxvf nginx-1.17.0.tar.gz

(3) Paso 2: Comience a compilar e instalar

./configure

make

make install

(4) Paso 3: Inicie Nginx
Una vez completada la instalación, la ubicación de instalación predeterminada es:

/usr/local/nginx/sbin

Después de ingresar a este directorio, ejecute Nginx para iniciar Nginx:

./nginx

Después de que Nginx se haya iniciado correctamente, acceda directamente a la dirección de Nginx en el navegador. El número de puerto predeterminado utilizado por Nginx es 80. Puede acceder ingresando la IP de Linux en el navegador Aparece la siguiente interfaz, que indica que Nginx se instaló correctamente:
inserte la descripción de la imagen aquí
Si no puede conectarse, debe verificar si el grupo de seguridad de Alibaba Cloud tiene puertos abiertos, o si el firewall del servidor tiene puertos abiertos. Comandos relacionados con el cortafuegos:

# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
# 查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;

3. Comandos comunes de Nginx

Primero ingrese al directorio nginx
cd cd /usr/local/nginx/sbin
1. Verifique el número de versión de nginx

./nginx -v

inserte la descripción de la imagen aquí
2. Inicie nginx

./nginx

inserte la descripción de la imagen aquí

3. Detener nginx

./nginx -s stop

inserte la descripción de la imagen aquí

4. Recargar nginx

./nginx -s reload(快速停止nginx) 
或者
nginx -s quit(完整有序的停止nginx)

inserte la descripción de la imagen aquí
5. Establecer el inicio de Nginx

systemctl enable nginx

systemctl es el comando principal de la herramienta de administración de aplicaciones del sistema Linux systemd. Se usa para administrar el sistema. También podemos usarlo para administrar Nginx. Los comandos relevantes son los siguientes:

systemctl start nginx    # 启动 Nginx
systemctl stop nginx     # 停止 Nginx
systemctl restart nginx  # 重启 Nginx
systemctl reload nginx   # 重新加载 Nginx,用于修改配置后
systemctl enable nginx   # 设置开机启动 Nginx
systemctl disable nginx  # 关闭开机启动 Nginx
systemctl status nginx   # 查看 Nginx 运行状态

4. Archivo de configuración de Nginx

4.1 Introducción básica

En el directorio de instalación de Nginx, sus archivos de configuración predeterminados se colocan en el directorio conf de este directorio: /etc/nginx/nginx.confdebajo, y el archivo de configuración principal nginx.conf también se encuentra en él. El uso posterior de nginx es básicamente para modificar este archivo de configuración en consecuencia.
inserte la descripción de la imagen aquí
Hay muchos # en nginx.conf, cuyo comienzo indica el contenido de los comentarios, elimine todos los párrafos que comienzan con # y el contenido del archivo de configuración simplificado es el siguiente:

worker_processes  1;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;



    sendfile        on;


    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

Podemos dividir claramente el archivo de configuración de nginx.conf en tres partes. El diagrama de estructura de nginx.conf se puede resumir de la siguiente manera:

main        # 全局配置,对全局生效
├── events  # 配置影响 Nginx 服务器或与用户的网络连接
├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│   ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│   ├── server   # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│   ├── server
│   │   ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri
│   │   ├── location
│   │   └── ...
│   └── ...
└── ...

La primera parte: el contenido del bloque global
desde el comienzo del archivo de configuración hasta el bloque de eventos, establece principalmente algunas instrucciones de configuración que afectan el funcionamiento general del servidor nginx, principalmente incluida la configuración del usuario (grupo) que ejecuta el servidor Nginx, la cantidad de procesos de trabajo que se permite generar y la cantidad de procesos, la ruta de almacenamiento de PID, la ruta y el tipo de almacenamiento de registros, y la introducción de archivos de configuración, etc.
Por ejemplo, la primera línea de configuración anterior:

worker_processes  1;

Esta es la configuración clave del servicio de procesamiento concurrente del servidor Nginx. Cuanto mayor sea el valor de worker_processes, más procesamiento concurrente puede soportar, pero estará restringido por hardware, software y otros equipos.

Parte 2: El bloque de eventos
La configuración por defecto es:

events {
    
    
    worker_connections  1024;
}

Las instrucciones involucradas en el bloque de eventos afectan principalmente a la conexión de red entre el servidor Nginx y el usuario. Las configuraciones comúnmente utilizadas incluyen habilitar la serialización de conexiones de red bajo múltiples procesos de trabajo, permitir que se reciban múltiples conexiones de red al mismo tiempo, y qué modelo event-driven elegir para el procesamiento de solicitudes de conexión, el número máximo de conexiones que cada proceso de trabajo puede soportar al mismo tiempo, etc.

El ejemplo anterior significa que la cantidad máxima de conexiones admitidas por cada proceso de trabajo es 1024.

Esta parte de la configuración tiene un gran impacto en el rendimiento de Nginx y debe configurarse de manera flexible en la práctica.

La tercera parte: bloque http
Esta es la parte más frecuente de la configuración del servidor Nginx.La mayoría de las funciones como las definiciones de proxy, caché y registro y la configuración de módulos de terceros están aquí.

La configuración por defecto es la siguiente:

http {
    
    
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;


    server {
    
    
        listen       80;
        server_name  localhost;

        location / {
    
    
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
    
            root   html;
        }

    }
}    

Cabe señalar que los bloques http también pueden incluir bloques globales de http y bloques de servidor.
3.1 Bloque global
http Las instrucciones de configuración del bloque global http incluyen la importación de archivos, la definición de TIPO MIME, la personalización del registro, el tiempo de espera de la conexión y el límite superior del número de solicitudes de enlace único.
3.2 bloque de servidor
Este bloque está estrechamente relacionado con el host virtual.Desde el punto de vista del usuario, el host virtual es exactamente igual que un host de hardware independiente.Esta tecnología se produce para ahorrar el costo de hardware del servidor de Internet.

Cada bloque http puede contener múltiples bloques de servidor y cada bloque de servidor es equivalente a un host virtual.
Y cada bloque de servidor también se divide en un bloque de servidor global y puede contener múltiples bloques de ubicación al mismo tiempo.

1. Bloque de servidor global
La configuración más común es la configuración de monitoreo del host de la máquina virtual y el nombre o configuración IP del host virtual.
2. Bloque de ubicación
Un bloque de servidor se puede configurar con varios bloques de ubicación.

La función principal de este bloque se basa en la cadena de solicitud (como server_name/uri-string) recibida por el servidor Nginx, a la cadena (como la anterior /uri-string) distinta del nombre de host virtual (o alias de IP). ) Match para procesar una solicitud específica. Aquí también se realizan funciones como la orientación de direcciones, el almacenamiento en caché de datos y el control de respuesta, así como la configuración de muchos módulos de terceros.

4.2 Configuraciones comunes

Configuración típica para Nginx:

user  nginx;                        # 运行用户,默认即是nginx,可以不进行设置
worker_processes  1;                # Nginx 进程数,一般设置为和 CPU 核数一样
error_log  /var/log/nginx/error.log warn;   # Nginx 的错误日志存放目录
pid        /var/run/nginx.pid;      # Nginx 服务启动时的 pid 存放位置

events {
    
    
    use epoll;     # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
    worker_connections 1024;   # 每个进程允许最大并发数
}

http {
    
       # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
    # 设置日志模式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;   # Nginx访问日志存放位置

    sendfile            on;   # 开启高效传输模式
    tcp_nopush          on;   # 减少网络报文段的数量
    tcp_nodelay         on;
    keepalive_timeout   65;   # 保持连接的时间,也叫超时时间,单位秒
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;      # 文件扩展名与类型映射表
    default_type        application/octet-stream;   # 默认文件类型

    include /etc/nginx/conf.d/*.conf;   # 加载子配置项
    
    server {
    
    
    	listen       80;       # 配置监听的端口
    	server_name  localhost;    # 配置的域名
    	
    	location / {
    
    
    		root   /usr/share/nginx/html;  # 网站根目录
    		index  index.html index.htm;   # 默认首页文件
    		deny 172.168.22.11;   # 禁止访问的ip地址,可以为all
    		allow 172.168.33.44;# 允许访问的ip地址,可以为all
    	}
    	
    	error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面
    	error_page 400 404 error.html;   # 同上
    }
}

4.3 Variables globales

Nginx tiene algunas variables globales de uso común, puede usarlas en cualquier parte de la configuración, como se muestra en la siguiente tabla:
inserte la descripción de la imagen aquí

Hay más variables predefinidas integradas, puede buscar directamente la palabra clave "variables predefinidas integradas de nginx", puede ver un montón de blogs que escriben esto, estas variables se pueden usar directamente en el archivo de configuración.

4. Configuración de separación dinámica y estática de Nginx

La separación dinámica y estática consiste en separar las solicitudes dinámicas y estáticas. Hay dos formas principales: una es simplemente separar los archivos estáticos en nombres de dominio separados y colocarlos en servidores separados, que también es la solución principal actual. Otra forma es mezclar y distribuir archivos dinámicos y estáticos juntos, separados por la configuración de Nginx.

Se pueden lograr diferentes reenvíos de solicitudes especificando diferentes nombres de sufijos por ubicación. Al configurar el parámetro expires, puede hacer que la memoria caché del navegador caduque y reducir la solicitud y el tráfico antes del servidor. La definición específica de caduca: es establecer un tiempo de caducidad para un recurso, es decir, no necesita ir al servidor para su verificación, y puede confirmar directamente si caduca a través del navegador, por lo que no hay tráfico adicional. se generará. Este enfoque es ideal para los recursos que cambian con poca frecuencia. (Si el archivo se actualiza con frecuencia, no se recomienda usar expires to cache), configuro 3d aquí, lo que significa que se accede a la URL dentro de estos 3 días, se envía una solicitud y no hay cambios en la última actualización tiempo del archivo en comparación con el servidor. No se obtendrá del servidor y se devolverá el código de estado 304. Si hay alguna modificación, se descargará directamente del servidor y se devolverá el código de estado 200.

server {
    
    
  location /www/ {
    
    
  	root /data/;
    index index.html index.htm;
  }
  
  location /image/ {
    
    
  	root /data/;
    autoindex on;
  }
}

5. Instancia de proxy inverso de Nginx

Configure Nginx, ingrese el nombre de dominio http://www.javahai.top y salte al puerto 8080 monitoreado por el servidor Tomcat en el servidor Linux de manera predeterminada, de la siguiente manera:
inserte la descripción de la imagen aquí

Visite http://192.168.17.129:9001/edu/ Vaya directamente a 127.0.0.1:8080 Visite http://192.168.17.129:9001/vod/ Vaya
directamente a 127.0.0.1:8081

inserte la descripción de la imagen aquí

La directiva de ubicación se utiliza para hacer coincidir las URL. La sintaxis es la siguiente:

location [= | ~ | ~* | ^*] uri {
    
    
}

1. =: antes de usarse para uri sin expresión regular, se requiere que la cadena de solicitud coincida estrictamente con el uri. Si la coincidencia
es exitosa, dejará de continuar buscando y procesará la solicitud de inmediato.
2. ~: se usa para indicar que el uri contiene expresiones regulares y distingue entre mayúsculas y minúsculas.
3. ~*: se usa para indicar que el uri contiene expresiones regulares y no distingue entre mayúsculas y minúsculas.
4. ^~: antes de usar el uri sin expresiones regulares, se requiere que el servidor Nginx encuentre la ubicación con el mayor grado de coincidencia entre el identificador uri y la cadena de solicitud, y luego use esta ubicación para procesar la solicitud de inmediato en lugar de usar el uri regular en el bloque de ubicación coincide con la cadena de solicitud.

Nota: si el uri contiene expresiones regulares, debe marcarse con ~ o ~*.

6. Estrategia de equilibrio de carga

El equilibrio de carga consiste en distribuir la carga de manera uniforme y razonable entre varios servidores para lograr el propósito de la distribución de la presión. La configuración principal es la siguiente:

http {
    
    
  upstream myserver {
    
    
  	# ip_hash;  # ip_hash 方式
    # fair;   # fair 方式
    server 127.0.0.1:8081;  # 负载均衡目的服务地址
    server 127.0.0.1:8080;
    server 127.0.0.1:8082 weight=10;  # weight 方式,不写默认为 1
  }
 
  server {
    
    
    location / {
    
    
    	proxy_pass http://myserver;
      proxy_connect_timeout 10;
    }
  }
}

Nginx proporciona varios métodos de asignación, el predeterminado es el sondeo, que es por turnos. Existen los siguientes métodos de distribución:

  1. Sondeo, el método predeterminado, cada solicitud se asigna a diferentes servidores de back-end uno por uno en orden cronológico, si el servicio de back-end se bloquea, se puede eliminar automáticamente;
  2. peso, distribución de peso, especifica la probabilidad de sondeo, cuanto mayor sea el peso, mayor será la probabilidad de acceso, que se utiliza en el caso de un rendimiento desigual del servidor de fondo;
  3. ip_hash, cada solicitud se asigna de acuerdo con el resultado del hash de la IP de acceso, de modo que cada visitante acceda de forma fija a un servidor de back-end, lo que puede resolver el problema de compartir sesiones de páginas web dinámicas. Cada solicitud de equilibrio de carga se reubicará en uno de los clústeres de servidores.Si un usuario que ha iniciado sesión en un determinado servidor se reubica en otro servidor, su información de inicio de sesión se perderá, lo que obviamente es inapropiado;
  4. fair (terceros), asignado de acuerdo con el tiempo de respuesta del servidor back-end, y se da prioridad al tiempo de respuesta corto, y primero se debe instalar el complemento de terceros nginx-upstream-fair.

Leyenda de solicitud de procesamiento de sondeo:
inserte la descripción de la imagen aquí

Leyenda ponderada de la solicitud de procesamiento por turnos:
inserte la descripción de la imagen aquí

Leyenda de solicitud de procesamiento de iphash:

inserte la descripción de la imagen aquí

Obtenga más información: ¡No hablemos de
escenarios de aplicaciones nginx
, aprendamos Nginx!
Inicio rápido de Nginx
Más información sobre las operaciones de Nginx: Nginx desde el inicio hasta la práctica, ¡explicación detallada de 10 000 palabras!

  1. Configuración de CORS entre dominios
  2. Habilitar compresión gzip
  3. Configuración de un clúster de alta disponibilidad (Hot Standby de sistema dual)
  4. Compatible con PC o dispositivo móvil
  5. Configurar HTTPS, etc

Supongo que te gusta

Origin blog.csdn.net/huangjhai/article/details/109544736
Recomendado
Clasificación