Teoría de Nginx + ejemplos explicados en detalle

1. Introducción a nginx

  • Nginx es un servidor web ligero/servidor proxy inverso y un servidor proxy de correo electrónico (IMAP/POP3).
  • Nginx fue desarrollado por el programador ruso Igor Sysoev y fue utilizado originalmente por Rambler, un gran portal y motor de búsqueda ruso.
  • La primera versión pública 0.1.0 se lanzó el 4 de octubre de 2004. Publica su código fuente bajo una licencia similar a BSD y es conocido por su estabilidad, su rico conjunto de funciones, archivos de configuración de muestra y su bajo consumo de recursos del sistema. El 1 de junio de 2011, se lanzó nginx 1.0.4.
  • Las características de nginx son que ocupa menos memoria y tiene fuertes capacidades de concurrencia. De hecho, las capacidades de concurrencia de nginx funcionan mejor entre servidores web del mismo tipo. Los usuarios de sitios web de nginx en China continental incluyen: Baidu, JD.com, Sina, NetEase, Tencent, Taobao, etc.

2. Características y ventajas de nginx.

1. características de nginx

Nginx es un servidor WEB y proxy inverso de muy alto rendimiento. Tiene muchas características muy superiores:
(1) En el caso de una alta concurrencia de conexiones, nginx es un buen sustituto del servidor Apache y puede admitir hasta 50.000 conexiones simultáneas. número correspondiente
(2) Utilice epoll y kqueue como modelo de desarrollo
(3) Nginx como servidor de equilibrio de carga: nginx puede admitir directamente servicios externos con programas PHP internamente y también puede admitir servicios externos como un servidor proxy HTTP
(4) Nginx es escrito en C, y su sobrecarga de recursos del sistema y eficiencia de uso de la CPU son mucho mejores que Perlbal.

2. Ventajas de nginx

(1) Altas conexiones concurrentes: la prueba oficial puede admitir 50 000 conexiones concurrentes, y en el entorno de producción real, el número de conexiones concurrentes alcanza entre 20 000 y 30 000. (2) Bajo consumo de memoria: se abren 10 procesos nginx con 30 000 conexiones concurrentes
. Solo consume 150M de memoria (15M*10=150M)
(3) El archivo de configuración es muy simple: el estilo es tan fácil de entender como el programa
(4) Bajo costo: nginx es un software de código abierto y puede usarse para gratis. La compra de conmutadores de equilibrio de carga de hardware como F5 BIG-IP y NetScaler requiere de más de 100.000 a cientos de miles de yuanes
(5) Admite reglas de reescritura: puede asignar solicitudes HTTP a diferentes servidores back-end en función de diferentes nombres de dominio y URL. Grupo
(6) Función de verificación de estado incorporada: si un servidor web en el backend de Nginx Proxy falla, el acceso frontal no se verá afectado (7) Ahorro de ancho de banda
: se admite la compresión GZIP y el encabezado del navegador se puede agregar caché local
(8) Alta estabilidad: se utiliza para proxy inverso, la probabilidad de tiempo de inactividad es mínima
(9) Diseño modular: los módulos se pueden compilar dinámicamente
(10) Buen soporte periférico: documentación completa, desarrollo secundario y más módulos (11 ) Admite implementación en caliente: puede recargar archivos de configuración sin tiempo de inactividad
(12) Admite impulsado por eventos, AlO (Asynclo, asincrónico l0), mmap (Memory Map, mapeo de memoria) y otras optimizaciones de rendimiento

3. Funciones y categorías de aplicaciones de nginx.

1. Funciones básicas de nginx

(1) Servidor web para recursos estáticos, capaz de almacenar en caché descriptores de archivos abiertos
(2) Servidor proxy inverso para protocolos http, smtp, pop3
(3) Aceleración de caché, equilibrio de carga
(4) Soporte FastcGl (fpm, LNMP), uwSGl (Python ), etc.
(5) Modularización (mecanismo no DSo), filtro zip, SSI y cambio de tamaño de imagen
(6) Soporte SSL

2. Funciones extendidas de nginx

(1) Host virtual basado en nombre e IP
(2) Admite keepalive
(3) Admite actualización sin problemas
(4) Personaliza los registros de acceso y admite el uso del búfer de registro para mejorar el rendimiento del almacenamiento de registros
(5) Admite la reescritura de URL
(6) Admite alias de ruta
( 7) Admite control de acceso basado en yo y usuario
(8) Límite de tasa de soporte y límite de concurrencia

3. Categorías de aplicaciones de nginx

(1) Utilice nginx combinado con FastcGl para ejecutar PHP, JSP, Perl y otros programas
(2) Utilice nginx_ para proxy inverso, equilibrio de carga y filtrado de reglas
(3) Utilice nginx para ejecutar páginas web e imágenes HTML estáticas
(4) nginx y aplicación combinada de otras nuevas tecnologías

4. Módulos y principios de funcionamiento de nginx.

  • nginx consta de kernel y módulos. Entre ellos, el diseño del kernel es muy pequeño y conciso, y el trabajo realizado también es muy simple: solo busca el archivo de configuración para asignar la solicitud del cliente a un bloque de ubicación (la ubicación es una directiva en la configuración de nginx, utilizada para coincidencia de URL), y en este Cada comando configurado en la ubicación iniciará un módulo diferente para completar el trabajo correspondiente.

1. Clasificación de módulos de nginx

Los módulos nginx se dividen estructuralmente en módulos principales, módulos básicos y módulos de terceros.

(1) El módulo HTTP, el módulo EVENTO y el módulo CORREO son módulos principales

(2) El módulo de acceso HTTP, el módulo HTTP FastCGl, el módulo de proxy HTTP y el módulo de reescritura HTTP son módulos básicos

(3) El módulo HTTP Upstream, el módulo Request Hash, el módulo Notice y el módulo HTTP Access Key son módulos de terceros

  • Los módulos desarrollados por los usuarios según sus propias necesidades son módulos de terceros. Es precisamente con el soporte de tantos módulos que las funciones de nginx pueden ser tan poderosas.

Los módulos nginx se dividen funcionalmente en tres categorías, a saber:

(1) Controladores (módulo procesador). Este tipo de módulo procesa directamente solicitudes y realiza operaciones como generar contenido y modificar la información del encabezado. Generalmente, sólo puede haber un módulo de procesador de controladores.

(2)Filtros (módulo de filtrado). Este tipo de módulo modifica principalmente el contenido generado por otros módulos del procesador y finalmente es generado por nginx.

(3) Proxies (módulo de agente). Se trata de módulos como HTTP Upstream de nginx, que interactúan principalmente con algunos servicios de back-end como fastcgi y otras operaciones para implementar funciones como proxy de servicio y equilibrio de carga.

El módulo nginx se divide en: módulo principal, módulo de eventos, módulo HTTP estándar, módulo HTTP opcional, módulo de correo electrónico, módulos y parches de terceros, etc.

nginx, módulo básico: el llamado módulo básico se refiere al módulo de función predeterminado de nginx. Las instrucciones que proporcionan le permiten usar variables que definen las funciones básicas de nginx y no se pueden deshabilitar durante la compilación, que incluyen:

(1) Módulo principal: funciones e instrucciones básicas, como gestión de procesos y seguridad. La mayoría de las directivas del módulo principal común se encuentran en la parte superior del archivo de configuración.

(2) Módulo de eventos: la capacidad de configurar el uso de la red dentro de Nginx. Directivas del módulo de eventos comunes, = la mayoría se colocan en la parte superior del archivo de configuración

(3) Módulo de configuración: proporciona un mecanismo de inclusión

2. Cómo funciona nginx

  • Los módulos de nginx se compilan directamente en nginx, por lo que son métodos de compilación estáticos.
  • Después de iniciar nginx, el módulo nginx se carga automáticamente. A diferencia de Apache, el módulo primero se compila en un archivo so y luego se especifica si se carga en el archivo de configuración.
  • Al analizar el archivo de configuración, cada módulo de nginx puede procesar una determinada solicitud, pero la misma solicitud de procesamiento solo puede ser completada por un módulo.
    Arquitectura del proceso nginx:
  • Cuando se inicia nginx, se iniciará un proceso maestro. Este proceso no procesa ninguna solicitud del cliente. Se utiliza principalmente para generar subprocesos de trabajo. Un subproceso de trabajo se utiliza para procesar n solicitudes.

1. Modelo de proceso de Nginx
Nginx adopta el modo de trabajo multiproceso de forma predeterminada. Después de iniciar Nginx, ejecutará un proceso maestro y varios procesos de trabajo. El maestro actúa como la interfaz interactiva entre todo el grupo de procesos y el usuario, monitorea el proceso al mismo tiempo y administra el proceso de trabajo para implementar funciones como reinicio del servicio, actualización sin problemas, reemplazo de archivos de registro y archivos de configuración que entran en vigencia. tiempo real. Los trabajadores se utilizan para manejar eventos básicos de la red. Los trabajadores son iguales y compiten entre sí para manejar las solicitudes de los clientes.

Insertar descripción de la imagen aquí

Al crear el proceso maestro, primero establezca el socket (listenfd) que necesita ser monitoreado y luego fork () varios procesos de trabajo del proceso maestro, de esta manera, cada proceso de trabajo puede escuchar el socket solicitado por el usuario. En términos generales, cuando se establece una conexión, todos los trabajadores recibirán una notificación, pero solo un proceso puede aceptar la solicitud de conexión y los demás fallan, este es el llamado fenómeno de la manada atronadora. nginx proporciona un Accept_mutex (bloqueo mutex). Con este bloqueo, solo habrá un proceso conectado en accpet al mismo tiempo, por lo que no habrá problemas de pánico.

Primero abra la opción aceptar_mutex, solo el proceso que haya obtenido aceptar_mutex agregará el evento de aceptación. nginx Utilice una variable llamada ngx_accept_disabled para controlar si se debe competir por el bloqueo Accept_mutex. ngx_accept_disabled = ngin...el número total de todas las conexiones en un solo proceso / 8 - el número de conexiones inactivas. Cuando ngx_accept_disabled es mayor que 0, no se intentará adquirir el bloqueo Accept_mutex. Cuanto mayor sea ngx_accept_disable, el Habrá más oportunidades de darse por vencido, para que otros procesos puedan adquirir el bloqueo. Las posibilidades son mayores. Sin aceptar, se controlará la cantidad de conexiones en cada proceso de trabajo y se utilizarán los grupos de conexiones de otros procesos.De esta manera, nginx controla el equilibrio de conexiones entre múltiples procesos.

Cada proceso de trabajo tiene un grupo de conexiones independiente y el tamaño del grupo de conexiones es trabajador_conexiones. Lo que se guarda aquí en el grupo de conexiones no es en realidad una conexión real, es solo una matriz de estructura ngx_connection_t del tamaño de Workers_connections. Además, nginx guardará todos los ngx_connection_t gratuitos a través de una lista vinculada free_connections. Cada vez que se obtiene una conexión, obtendrá una de la lista de conexiones gratuitas. Después de usarla, se volverá a colocar en la lista de conexiones gratuitas. El número máximo de conexiones que puede establecer un nginx... debe ser conexiones_trabajadores * procesos_trabajadores. Por supuesto, de lo que estamos hablando aquí es del número máximo de conexiones. Para solicitudes HTTP a recursos locales, el número máximo de concurrencias que se pueden admitir es conexiones_trabajadores * procesos_trabajadores. Si se utiliza HTTP como proxy inverso, el número máximo de conexiones las concurrencias deben ser conexiones_trabajadores * procesos_trabajadores/2 . Porque como servidor proxy inverso, cada conexión simultánea establecerá una conexión con el cliente y una conexión con el servicio back-end, que ocupará dos conexiones.

Cinco, instalación del código fuente de nginx

Preparación del entorno
: configure la fuente espejo y apague el firewall

[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo   epel.repo                  epel-testing.repo
epel-modular.repo  epel-testing-modular.repo


创建系统用户
[root@localhost ~]# useradd -rMs /sbin/nologin nginx
[root@localhost ~]# id nginx 
uid=995(nginx) gid=992(nginx) groups=992(nginx)


安装开发工具包
[root@localhost ~]# yum -y groups mark install 'Development Tools'


创建日志存放路径
[root@localhost ~]# mkdir /var/log/nginx
[root@localhost ~]# chown -R nginx.nginx /var/log/nginx/
[root@localhost ~]# ll -d /var/log/nginx/
drwxr-xr-x. 2 nginx nginx 6 Oct 10 16:56 /var/log/nginx/

Instalar nginx

[root@localhost ~]# wget http://nginx.org/download/nginx-1.20.2.tar.gz
--2022-10-10 17:04:05--  http://nginx.org/download/nginx-1.20.2.tar.gz
Resolving nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ...
Connecting to nginx.org (nginx.org)|3.125.197.172|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1062124 (1.0M) [application/octet-stream]
Saving to: ‘nginx-1.20.2.tar.gz’

nginx-1.20.2.tar.gz 100%[=================>]   1.01M   229KB/s    in 6.9s    

2022-10-10 17:04:13 (150 KB/s) - ‘nginx-1.20.2.tar.gz’ saved [1062124/1062124]

[root@localhost ~]# ls
anaconda-ks.cfg  nginx-1.20.2.tar.gz
[root@localhost ~]# tar -zxf nginx-1.20.2.tar.gz -C /usr/src/

预编译
[root@localhost nginx-1.20.2]# cd /usr/local/nginx-1.20.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx 
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http _realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
[root@localhost nginx-1.20.2]# make
[root@localhost nginx-1.20.2]# make install

配置环境变量以便启动nginx
[root@localhost nginx-1.20.2]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@localhost nginx-1.20.2]# . /etc/profile.d/nginx.sh 
[root@localhost nginx-1.20.2]# nginx
[root@localhost nginx-1.20.2]# ss -antl
State   Recv-Q  Send-Q     Local Address:Port     Peer Address:Port  Process  
LISTEN  0       128              0.0.0.0:22            0.0.0.0:*              
LISTEN  0       128              0.0.0.0:80            0.0.0.0:*              
LISTEN  0       128                 [::]:22               [::]:*    

// Inicie nginx y verifique el estado del puerto. Modo de control de servicio, use el comando nginx
-t para verificar la sintaxis del archivo de configuración
-v para generar la versión de nginx
-c para especificar la ruta del archivo de configuración
-s para enviar la señal de control del servicio. Los valores opcionales son detener, auit y volver a abrir., recargar

6. Explicación detallada de los archivos de configuración.

Archivo de configuración principal:/usr/local/nginx/nginx.conf.
Al iniciar nginx de forma predeterminada, el archivo de configuración utilizado es: ruta de instalación/conf/nginx.conf.
Puede especificar el archivo de configuración que se leerá a través de la opción -c al iniciar nginx.
// Archivos de configuración comunes de nginx y sus funciones
nginx.conf Archivo de configuración básica de nginx
mime.types Archivo de extensión asociado al tipo MIME
fastcgi.conf Configuración relacionada con fastcgi
proxy.conf Configuración relacionada con sitios proxy.conf
Configuración nginx , sitio web proporcionado, incluido alojamiento web

7. Implementar la organización lnmp

Los siguientes PHP-MySQL son todas instalaciones de código fuente. Puede consultar la instalación de MySQL que escribí antes.

1. Operación MySQL

[root@my ~]# ss -antl | grep 3306
LISTEN 0      80                 *:3306            *:*   

2. Operación lateral de PHP

Configuración de PHP
Después de una implementación exitosa, configure el siguiente contenido

[root@node1 php-fpm.d]# pwd
/usr/local/php7/etc/php-fpm.d
listen = 0.0.0.0:9000
listen.allowed_clients = 192.168.47.137
[root@node1 php-fpm.d]# ss -antl | grep 9000
LISTEN 0      128               0.0.0.0:9000      0.0.0.0:*  


网页测试目录
[root@node1 php-fpm.d]# mkdir /var/www/html -p
[root@node1 php-fpm.d]# cd /var/www/html/
[root@node1 html]# ls
[root@node1 html]# vim index.php
[root@node1 html]# useradd -Mrs /sbin/nologin nginx
[root@node1 html]# id nginx 
uid=975(nginx) gid=974(nginx) groups=974(nginx)
[root@node1 html]# chown -R nginx.nginx /var/www/html/
[root@node1 html]# ll
total 4
-rw-r--r-- 1 nginx nginx 21 Oct 11 19:02 index.php

Tres, operación nginx

[root@localhost conf]# cd /usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf
location / {
            root    html;
            index  index.php index.html index.htm;
        }
   location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   192.168.47.50:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
            include        fastcgi_params;
        }


拿nginxip访问
[root@localhost conf]# ss -antl | grep 80
LISTEN 0      128          0.0.0.0:80        0.0.0.0:* 

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-3YrgFFHM-1666171360698)(./1665487107955.png)]

8. Actualización fluida

//Pasos para una actualización sin problemas
1. Obtenga los parámetros de compilación anteriores
2. Descargue el nuevo módulo
3. Vuelva a compilar el software, agregue –add-module = ruta de descompresión del nuevo módulo
4. Detenga el servicio y haga una copia de seguridad del programa original
5. Utilice el programa fuente Cobertura de nuevo programa
6. Iniciar nuevo programa

1. Basado en nginx implementado previamente

Asegúrese de que la página web sea accesible, simplemente use el punto de acceso de su teléfono móvil y otros dispositivos
[https://github.com/openresty/echo-nginx-module]

Descargar a local

[root@localhost ~]# wget https://github.com/openresty/echo-nginx-module
解压
[root@localhost ~]# unzip echo-nginx-module-master.zip 

2. Obtenga los parámetros de compilación de nginx previamente instalado.
Se recomienda utilizar la versión nginx-1.20.0 del paquete nginx aquí.

Verifique su módulo nginx binario instalado original y cópielo

[root@localhost ~]# nginx -V
nginx version: nginx/1.20.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log


重新压缩一份nginx
[root@localhost ~]# tar -zxf nginx-1.20.0.tar.gz 


重新预编译软件
[root@localhost nginx-1.20.0]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log \
--add-module=../echo-nginx-module-master

//添加成功
[root@localhost nginx-1.20.0]# make
sed -e "s|%%PREFIX%%|/usr/local/nginx|" \
	-e "s|%%PID_PATH%%|/usr/local/nginx/logs/nginx.pid|" \
	-e "s|%%CONF_PATH%%|/usr/local/nginx/conf/nginx.conf|" \
	-e "s|%%ERROR_LOG_PATH%%|/var/log/nginx/error.log|" \
	< man/nginx.8 > objs/nginx.8
make[1]: Leaving directory '/root/nginx-1.20.0'

objs目录以有nginx这个可执行程序
[root@localhost nginx-1.20.0]# cd objs/
[root@localhost objs]# ls
addon         Makefile  nginx.8            ngx_auto_headers.h  ngx_modules.o
autoconf.err  nginx     ngx_auto_config.h  ngx_modules.c       src

3. Haga una copia de seguridad del programa fuente y detenga, sobrescriba e inicie el servicio
// Primero verifique la diferencia entre las versiones previa y posterior a la actualización, observando principalmente los parámetros de compilación
// Antes de la actualización

[root@localhost nginx-1.20.0]# objs/nginx -V
nginx version: nginx/1.20.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=../echo-nginx-module-master


重新停止启动下nginx,以便程序识别
[root@localhost nginx-1.20.0]# nginx -s stop
将其原有的程序备份到/opt下
[root@localhost nginx-1.20.0]# cp /usr/local/nginx/sbin/nginx /opt/
在用新的版本覆盖掉旧的版本
[root@localhost nginx-1.20.0]# cp objs/nginx /usr/local/nginx/sbin/
cp: overwrite '/usr/local/nginx/sbin/nginx'? 
[root@localhost nginx-1.20.0]# /usr/local/nginx
nginx/        nginx-1.20.2/ 
[root@localhost nginx-1.20.0]# /usr/local/nginx/sbin/nginx 
[root@localhost nginx-1.20.0]# ss -antl
State      Recv-Q     Send-Q         Local Address:Port           Peer Address:Port     Process     
LISTEN     0          128                  0.0.0.0:22                  0.0.0.0:*                    
LISTEN     0          128                  0.0.0.0:80                  0.0.0.0:*    
[root@localhost nginx-1.20.0]# nginx -V
nginx version: nginx/1.20.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-4) (GCC) 
built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-debug --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_stub_status_module --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --add-module=/root/echo-nginx-module-master

4. Prueba: haga referencia al módulo de eco

  #access_log  logs/host.access.log  main;

        location / {
                echo "good time";
        }

可以使用windos系统中的cmd进行
C:\Users\goodtime>curl 192.168.47.137
good time

9. Caso de ubicación

La sección de ubicación coincide con el URI solicitado por el cliente especificando un patrón.
Función:
permite hacer coincidir cada ubicación definida en función del URI solicitado por el usuario. Cuando coincide, la solicitud será procesada por la configuración en el bloque de configuración de ubicación correspondiente. por ejemplo Realizar control de acceso y otras funciones
Sintaxis:
ubicación [modificador] patrón {...}
modificador
= coincidencia exacta
~ Coincidencia de patrones de expresiones regulares, distingue entre mayúsculas y minúsculas
~* Coincidencia de patrones de expresiones regulares, no distingue entre mayúsculas y minúsculas
^~ Coincidencia de prefijos, similar a El comportamiento sin modificadores también comienza con el módulo especificado. La diferencia es que si el patrón coincide, entonces deja de buscar otros patrones. La expresión regular @ define secciones de ubicación con nombre. El cliente no puede acceder a
estas secciones. Solo se puede acceder a ellas. mediante solicitudes generadas internamente, como try_files o error_page, etc.

1. Definir un campo de prueba

[root@localhost sbin]# vim /usr/local/nginx/conf/nginx.conf
   location /hhh {
                echo "good time";
        }
[root@localhost sbin]# ./nginx -s reload

//可见不按添加的字段访问的话显示不了输出值
C:\Users\goodtime>curl 192.168.47.137
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

C:\Users\goodtime>curl 192.168.47.137/hhh
good time

2. = Coincidencia exacta
//Si se genera algo más, se informará un error

C:\Users\goodtime>curl 192.168.47.137 /hhh
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

3. ~ distingue entre mayúsculas y minúsculas y la búsqueda se basa en la ruta absoluta (siempre que esté dentro)

C:\Users\goodtime>curl 192.168.47.137/hhH
<html>
<head><title>404 Not Found</title></head>
//后面可以加任意的数值
C:\Users\goodtime>curl 192.168.47.137/hhhdadadawqeqw
good time

4. ~* no distingue entre mayúsculas y minúsculas

C:\Users\goodtime>curl 192.168.47.137/hHh
good time

5. ^~ coincide con la parte que comienza con un valor numérico

C:\Users\goodtime>curl 192.168.47.137/hhh
good time

Orden de prioridad, aquí si se le agrega todo, las reglas coincidirán en orden de prioridad.

Orden de búsqueda y prioridad: de mayor a menor
1. Se prefieren las coincidencias exactas con "="
2. Las expresiones regulares están en el orden en que están definidas en el archivo de configuración
3. Aquellas con modificadores "^~" coinciden al principio
4, con modificador o *, si la expresión regular coincide con el URI
5. Coincidencia exacta sin modificador

ubicación =
ubicación de la ruta ^~
ubicación de la ruta ~ regular (por ejemplo, debe agregar $ después de /hhh, terminando con esto)
ubicación ~*
ruta de ubicación regular

1 =
2 ^~
3 ~*
4 ~
5 Incontables

10. control de acceso nginx

//Se utiliza para el segmento de ubicación
Permitir: establece a qué host o hosts se les permite el acceso, separe los parámetros múltiples con espacios.
Denegar: establece a qué host o hosts se les prohíbe el acceso, separe los parámetros múltiples con espacios
. Por ejemplo:
permitir 192.168 .47.137 192.168.47.136;etc.negar
todo;

//Ver IP en el sistema cmd local

C:\Users\goodtime>ipconfig
以太网适配器 VMware Network Adapter VMnet8:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe80::70bb:164a:9969:5e53%21
   IPv4 地址 . . . . . . . . . . . . : 192.168.47.1
   子网掩码  . . . . . . . . . . . . : 255.255.255.0

模拟拒绝本机访问nginx状态页面
         location /status {
                echo "chenyu";
                deny 192.168.47.1;           //本机ip


C:\Users\goodtime>curl 192.168.47.137/status
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.2</center>
</body>
</html>

//Abrimos el módulo stub_status

stub_status模块主要作用于查看nginx的一些状态信息
         location /status {
                stub_status on;
		}


状态
C:\Users\goodtime>curl 192.168.47.137/status
Active connections: 1
server accepts handled requests
 8 8 6
Reading: 0 Writing: 1 Waiting: 0

Análisis:
Conexiones activas: la cantidad de conexiones activas que nginx procesa actualmente
El servidor acepta solicitudes manejadas: nginx procesó un total de 63 conexiones, creó con éxito 63 apretones de manos y procesó un total de 62 solicitudes Lectura
: la cantidad de información de encabezado que nginx leyó Escritura del cliente
: el número de información de encabezado devuelta por nginx al cliente.
Esperando: cuando se activa keep-alive, este valor es igual a activo (lectura + escritura), lo que significa que nginx ha completado el procesamiento y está esperando. la conexión residente de la siguiente instrucción de solicitud. Por tanto, cuando la eficiencia del acceso es alta y la solicitud se procesa rápidamente, es normal que el número de espera sea relativamente alto. Si la cantidad de lectura+escritura es grande, > indica que la cantidad de acceso simultáneo es muy grande y se está procesando.

//Cuando existe permitir todo, permite el acceso a otras IP

   location /status {
                stub_status on;
                allow 192.168.47.1;
                allow all;
        }


测试,本机成功
C:\Users\goodtime>curl 192.168.47.137/status
Active connections: 1
server accepts handled requests
 8 8 8
Reading: 0 Writing: 1 Waiting: 0


模拟在另一台虚拟机网页中访问主机ip
[root@my ~]# ip a | grep ens32
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc _codel state UP group default qlen 1000
    inet 192.168.47.136/24 brd 192.168.47.255 scope global noprefixroute ens32


可以ping通nginx主机
[root@my ~]# ping 192.168.47.137
PING 192.168.47.137 (192.168.47.137) 56(84) bytes of data.
64 bytes from 192.168.47.137: icmp_seq=1 ttl=64 time=0.408 ms


[root@my ~]# curl 192.168.47.137/status
Active connections: 1 
server accepts handled requests
 13 13 13 
Reading: 0 Writing: 1 Waiting: 0 



当添加deny后
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf



location /status {
                stub_status on;
                allow 192.168.47.1;
                deny all;
        }
[root@localhost ~]# nginx -s reload


失败
[root@my ~]# curl 192.168.47.137/status
<html>
<head><title>403 Forbidden</title></head>


在测试添加136访问
allow 192.168.47.136;
[root@localhost ~]# nginx -s reload
//成功
[root@my ~]# curl 192.168.47.137/status
Active connections: 1 
server accepts handled requests
 16 16 16 
Reading: 0 Writing: 1 Waiting: 0 

1. Modo de cifrado de autenticación de usuario

Agregue un conjunto de información cifrada para los usuarios de máquinas virtuales, de modo que cuando inicien sesión en la interfaz de la máquina virtual, se les solicite que ingresen una contraseña cifrada para garantizar su seguridad.

//授权用户
安装httpd-tools软件包
[root@localhost ~]# yum -y install httpd-tools


//创建用户密钥文件
[root@localhost ~]# cd /usr/local/nginx/conf/
//这里的密码为加密后的密码串,建议用htpasswd来创建文件,这里创建的jr用户是不存在系统中的
[root@localhost conf]# htpasswd -c -m .user_auth_file jr
New password: 
Re-type new password: 
Adding password for user jr
//密码信息
[root@localhost conf]# cat .user_auth_file 
jr:$apr1$ma8B3sAP$r24RhqreiU0O2pqBLnUNq/

//配置nginx(注意auth_basic_user_file必须用绝对路径)
[root@localhost conf]# vim nginx.conf
[root@localhost conf]# nginx -s reload
  location /status {
                stub_status on;
                auth_basic "欢迎光临";
                auth_basic_user_file "/usr/local/nginx/conf/.user_auth_file";
        }

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-d9SvLFy5-1666173270394)(./1665654224926.png)]

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-ZYogn81M-1666173270395)(./1665654235330.png)]

2. configuración https

Nginx: 192.168.47.137
CA: 192.168.47.136

//Generar un par de claves en el servidor CA

[root@CA ~]# mkdir  -p  /etc/pki/CA/private
[root@CA ~]# cd /etc/pki/CA/
//生成私钥
[root@CA CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
.....+++++
...........+++++
e is 65537 (0x010001)
//生成公钥
[root@CA CA]# openssl rsa -in private/cakey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuQfU9CLxicvy7XggXSSB
KJp/6VrVd6iHqG8Rfv89kx0X/AOXPKFHrTDiDj1fxwTNDOhPNSTXXVybxgjAdfXT
03DmbgFYoXp6C+SqeetdiDD3NbIBRJjyFb5bgXXt0Se11vN0oDPzp6PowRH+VhFI
gfsvdjpMvaDmuEoYwnefA5SjP4gO4i0CNdu8PSy/JFgXz7NGinp4Eiqxt5Ljtthj
IljqH6yIbuYoao2oW0GrPfFe5hhkKu8cXredNhFD5uz9HJU/ziwPecVqo88FC2af
8GtQCfBGRTewqkoTcLLoIsPum58aVvomnF0t5IU0hcpGl7jlqndk6dnBlqGNTrOp
OwIDAQAB
-----END PUBLIC KEY-----
生成自属签名颁发证书,并导入到cacert.pem中
[root@CA CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:HH^H
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:LL
Email Address []:[email protected]

//Generar solicitud de firma de certificado en nginix y enviarla a CA

[root@localhost ~]# cd /usr/local/nginx/conf/
//生成私钥
[root@localhost conf]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus (2 primes)
......+++++
...................................+++++
e is 65537 (0x010001)
//在生成一个请求,保持一个合同同步允许确认证书通过
[root@localhost conf]# openssl req -new -key httpd.key -days 1024 -out httpd.csr
Ignoring -days; not generating a certificate
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:HH^H
Organizational Unit Name (eg, section) []:linux
Common Name (eg, your name or your server's hostname) []:LL
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost conf]# ls
httpd.csr        httpd.key
//发送证书             
[root@localhost conf]# scp httpd.csr [email protected]:/root/
[email protected]'s password: 
httpd.csr                                       100% 1017   723.0KB/s   00:00  

//Ver en el host CA

[root@CA ~]# ls
anaconda-ks.cfg  httpd.csr
//CA签署证书并发送给NGINX
[root@CA ~]# mkdir /etc/pki/CA/newcerts          //将来颁发证书的存放路径
[root@CA ~]# touch /etc/pki/CA/index.txt          //网页数据显示
[root@CA ~]# echo "01" > /etc/pki/CA/serial       //设置序列号
//重新对证书进行签名,并生成httpd.crt
[root@CA ~]#  openssl ca -in httpd.csr -out httpd.crt -days 1024
Using configuration from /etc/pki/tls/openssl.cnf 
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Oct 13 09:50:22 2022 GMT
            Not After : Aug  2 09:50:22 2025 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = HB
            organizationName          = HH\08
            organizationalUnitName    = linux
            commonName                = LL
            emailAddress              = [email protected]
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                B9:E3:DC:E2:75:93:5A:8C:82:FD:80:30:75:99:CC:C5:5A:95:3B:56
            X509v3 Authority Key Identifier: 
                keyid:2C:A2:DB:98:54:06:EB:2D:24:A8:84:E4:8E:71:36:D0:70:88:BC:2D

Certificate is to be certified until Aug  2 09:50:22 2025 GMT (1024 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@CA ~]# ls
anaconda-ks.cfg  httpd.crt  httpd.csr



//将CA签署的证书httpd.crt和服务器的证书cacert.pem(密钥信息)发送给nginx
[root@CA ~]# scp httpd.crt [email protected]:/usr/local/nginx/conf/ 
The authenticity of host '192.168.47.137 (192.168.47.137)' can't be established.
ECDSA key fingerprint is SHA256:cdmo9f87/nd53T0zrSlRNvEDKskgEb2tSwNZINSW84U.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.47.137' (ECDSA) to the list of known hosts.
[email protected]'s password: 
httpd.crt                                              100% 4517     2.8MB/s   00:00    
[root@CA ~]# scp /etc/pki/CA/[email protected]:/usr/local/nginx/conf/
[email protected]'s password: 
cacert.pem                                             100% 1367     1.4MB/s   00:00 

//configuración de nginx https

[root@localhost conf]# vim /usr/local/nginx/conf/nginx.conf
 server {
        listen       443 ssl;                      //监听443加密
        server_name  localhost;
        ssl_certificate httpd.crt;              //证书位置
        ssl_certificate_key httpd.key;          //私钥信息
        ssl_session_cache    shared:SSL:1m;      //链接缓存
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

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

[root@localhost conf]# nginx -s reload
[root@localhost html]# echo "jrhh" > index.html 
[root@localhost html]# nginx -s reload

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-ZdGh5n1t-1666173270395)(./1665654999590.png)]

11. Reescribir la redirección

Al igual que Apache y otros programas de servicios web, la función principal de la reescritura es redirigir las direcciones URL. La función de reescritura de Nginx requiere el soporte del software PCRE, que utiliza declaraciones de expresiones regulares compatibles con Perl para la coincidencia de reglas. La compilación de nginx con parámetros predeterminados admitirá el módulo de reescritura, pero también debe ser compatible con PCRE.

La función Rewirte consiste en utilizar las variables globales proporcionadas por nginx o las variables establecidas por usted mismo, combinadas con expresiones regulares y bits de etiquetas para implementar la reescritura y redirección de URL.

La reescritura solo se puede colocar en el servidor{}, ubicación{}, if{} y, de forma predeterminada, solo puede funcionar en la cadena después del nombre de dominio, excluyendo los parámetros pasados. Por ejemplo, http://www.cy.com/abc/aa/index.php?a=1&b=2 solo reescribe /abc/aa/index.php

URL: Es una ruta/ubicación específica.
URI: se refiere a una colección de objetos con el mismo tipo/características.
La dirección URL, comúnmente conocida como dirección de página web, o URL para abreviar, es una cadena utilizada para describir completamente la dirección de páginas web y otros recursos en Internet
[Imagen del enlace externo La transferencia falló. El sitio de origen puede tener un mecanismo anti-sanguijuela. Se recomienda guardar la imagen y cargarla directamente (img-0uDhliX2-1666173614317)(./1665804328382. png)] Nginx: admite la reescritura de URL
a través del módulo ngx_http_rewrite_module y admite el juicio de condición, pero no es compatible de lo contrario.
Saltar: salta de una ubicación a otra. El bucle se puede ejecutar hasta 10 veces. Después de eso, nginx devolverá un error 500.
Compatibilidad con PCRE: coincidencia de reglas de sintaxis de expresiones regulares compatibles con Perl
Directiva de conjunto de módulos de reescritura: cree nuevas variables y establezca sus valores

//Formato gramatical:
reescribir [bandera];
expresión regular: indica la regla de coincidencia regular
reemplazo: indica el contenido después de la
bandera de salto: indica la marca de bandera admitida por reescritura

// descripción de la marca de bandera:
último: una vez completada la coincidencia de esta regla, continúe haciendo coincidir la nueva regla de URL de ubicación hacia abajo, generalmente utilizada en el servidor y si.
break: esta regla finaliza cuando se completa la coincidencia. No coincide con ninguna regla posterior. Generalmente se usa en la ubicación.
redirección: devolver la redirección temporal 302 representa un salto temporal. Cuando un usuario accede a una página, el servidor devolverá un código de estado 302 para indicarle al navegador que la página ha sido redirigida. Debe redirigir manualmente el navegador a la nueva URL. La dirección del navegador mostrará la dirección URL después del salto.permanente
: devuelve la redirección permanente 301 y la barra de direcciones del navegador mostrará la dirección URL después del salto.

La coincidencia de identificadores y significados regulares
^ debe comenzar con la entidad después de ^ y
debe terminar con la entidad antes de $
Coincidir con cualquier carácter
[] Coincidir con cualquier carácter en el conjunto de caracteres especificado
[^] Coincidir con cualquier carácter no incluido en el conjunto de caracteres especificado Cualquiera cadena
| coincide con la agrupación de entidades () antes o después
| para formar un grupo de entidades para hacer coincidir, generalmente con | para ayudar
\ escapar

  • *** coincide con el carácter anterior que aparece cero o más veces. Por ejemplo, "ab*" puede coincidir con a, ab, abb
  • +\ coincide con el carácter anterior que aparece una o más veces. Por ejemplo, "ab+" puede coincidir con ab, abb, pero no con a.
  • ? Coincide con el carácter anterior que aparece cero o una vez, como "ab(cd)?" puede coincidir con ab, abcd

(patrón) coincide con el patrón entre paréntesis y puede obtener la coincidencia correspondiente más adelante. El atributo $ 0-9 se usa comúnmente para obtener el contenido coincidente entre paréntesis. Por ejemplo, el atributo (hello ∣ chenyu) 9 obtiene el contenido coincidente entre paréntesis. Por ejemplo, el atributo ^(hello | chenyu)9 obtiene el contenido coincidente entre paréntesis. Como ( h e ll**oc h e n y**u ) // La cadena es "hello chenyu" y los resultados capturados son:
$1=hello$2=chenyu Estos datos capturados se pueden usar más adelante Usados ​​como una variable

La función de reescritura de nginx se usa ampliamente en las empresas:
1. Puede ajustar la URL que navegan los usuarios para que parezca más estandarizada y satisfacer las necesidades de los desarrolladores y el personal del producto.
2. Para permitir que los motores de búsqueda busquen contenido del sitio web y Proporcionar una mejor experiencia de usuario, las empresas La dirección URL dinámica se disfraza como una dirección estática para proporcionar servicios
3. Después de actualizar el nombre de dominio, las visitas anteriores saltarán al nuevo nombre de dominio, por ejemplo, el acceso a 360buy de JD.com. com saltará a jd.com
4. Según variables y directorios especiales, información del cliente para ajuste de URL, etc.

1. reescribir la configuración

//nginx accede a la página web personalizada de Xiaolizi

[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# ls
50x.html  index.html
[root@localhost html]# mkdir imgs
[root@localhost html]# cd imgs/
[root@localhost images]# ls
xlz.jpg
[root@localhost imgs]# vim /usr/local/nginx/conf/nginx.conf
location = /imgs {
        }
[root@localhost imgs]# nginx -s reload

¡Muy guapo!
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-6vnYmRkc-1666173614318)(./1665755821173.png)]

2. marca de bandera –romper

break: esta regla finaliza cuando se completa la coincidencia. No coincide con ninguna regla posterior. Generalmente se usa en la ubicación.
//Necesita reescribir
//La ruta absoluta de la página web es /images/, pero convertirla en una variable es diferente.

[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
  location = /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 break;       //$定义正则表达式访问网页
        }

[root@localhost images]# nginx -s reload

El acceso sigue siendo imgs.
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-76R9cQi1-1666173614318)(./1665757889785.png)]

//También podemos usar break para saltar a
la ubicación de la página de inicio de Baidu /imgs { rewrite ^/imgs/(.*.jpg)$ http://www.baidu.com break; }

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-BHEbskjA-1666173614319)(./1665758229034.png)]

3. marca de bandera-último

último: una vez completada la coincidencia de esta regla, continúe haciendo coincidir la nueva regla de URL de ubicación hacia abajo, generalmente utilizada en el servidor y si.
// Haga coincidir varios valores y vaya al sitio web gratuito para escuchar música (compartir)

[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf
   location /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 last;
        }
        location /images {
                rewrite ^/images/(.*\.jpg)$ https://music.y444.cn/#/ last;
        }

[root@localhost html]# nginx -s reload

//Puede usarse para escuchar las canciones de Jay mientras estudia
[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-6G2xvbLN-1666173614319)(./1665758631629.png)]

4. marca de bandera –redireccionar

redirección: devolver la redirección temporal 302 representa un salto temporal. Cuando el usuario accede a una página, el servidor devolverá un código de estado 302 para indicarle al navegador que la página ha sido redirigida. Debe redirigir manualmente el navegador a la nueva URL y la dirección del navegador mostrará la dirección URL después del salto.

   location /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 redirect;
        }

//Presione F12 para monitorear el estado
y F5 para actualizar la página web.
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-x4xiivh4-1666173614320)(./1665759378483.png)]

5. marca de bandera – permanente

Vuelva a la redirección permanente 301 y la barra de direcciones del navegador mostrará la dirección URL después del salto.

[root@localhost html]# vim /usr/local/nginx/conf/nginx.conf

       location /imgs {
                rewrite ^/imgs/(.*\.jpg)$ /images/$1 permanent;
        }
[root@localhost html]# nginx -s reload

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-U7rcwXuZ-1666173614320)(./1665759612819.png)]

6. si juicio

Se puede usar en el segmento de servidor y segmento de ubicación
Sintaxis:
if (condición) {...}
Condiciones comunes:
(1) nombre de variable
(2) expresión de comparación compuesta por nombre de variable y operando (puede usar =, != similar comparaciones Se prueban los caracteres)
(3) Operación de coincidencia de patrones de expresiones regulares

  • ~ Comprobaciones de coincidencia de patrones que distinguen entre mayúsculas y minúsculas
  • ~* Comprobación de patrón que no distingue entre mayúsculas y minúsculas
    (4) Pruebe la posibilidad de que la ruta especificada sea un archivo (-f !-f)
    (5) Pruebe la posibilidad de que la ruta especificada sea un directorio (-d !-d)
    (6) Archivo de prueba La existencia de (-e! -e)
    (7) Compruebe si el archivo tiene permiso de ejecución (-x! -x)

6.1 Configurar la redirección basada en nombres de dominio

Si el antiguo nombre de dominio de la empresa www.lty.com ahora tiene necesidades comerciales, debe ser reemplazado por el nuevo nombre de dominio www.liutianyang.com, pero el antiguo nombre de dominio no se puede abolir y debe pasar al nuevo nombre de dominio. y los siguientes parámetros permanecen sin cambios
//Modificar el nombre de host del servidor nginx www.lty.com

[root@localhost html]# hostnamectl set-hostname www.lty.com
[root@localhost html]# bash
[root@www html]# 

//将本机两个域名映射关系写入到/etc/hosts中,并传给客户端
[root@localhost html]# vim /etc/hosts 
192.168.47.137 www.lty.com
192.168.47.137 www.liutianyang.comm
[root@localhost html]# scp /etc/hosts [email protected]:/etc/hosts
[email protected]'s password: 
hosts                                     100%  220    42.1KB/s   00:00 
//修改配置文件,写入rewrite和if结合使用
[root@www html]# vim /usr/local/nginx/conf/nginx.conf
  server {
        listen       80;
        server_name  www.lty.com;
        
       location / {
                if ($host = 'www.lty.com') {
                        rewrite ^/(.*)$ http://www.liutianuang.com/$1 permanent;
                }
                root html;
                index index.html index.htm;
      
[root@www html]# echo "This is a test" > /usr/local/nginx/html/index.html
[root@www html]# nginx -s reload

// El cliente utiliza un navegador para acceder – http://www.lty.com – encontraremos que salta automáticamente al nuevo nombre de dominio www.liutianuang.com
[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-3FwBIWPO-1666173614321)(./1665798296829.png)]

6.2 Salto de acceso según IP del cliente

Si hoy se lanza una nueva versión del negocio de la empresa, se requiere que todas las IP accedan a cualquier contenido para mostrar una página de mantenimiento fija, solo la IP de la empresa: 192.168.47.50 puede acceder normalmente.

[root@www html]# vim /usr/local/nginx/conf/nginx.conf
  server {
        listen       80;
        server_name  www.lty.com;
        set $rewrite true;                         //开启重写规则
        if ($remote_addr = "192.168.47.50") {          //如果判断等于对应的ip则成立
                set $rewrite false;                                   //关闭重写
        }

        if ($rewrite = true) {    //当变量判断是其他ip成立时
                rewrite (.+) /weihu.html;   //.+代表配合任何ip并以/网页状态显示
        }
[root@www html]# nginx -s reload
//新建/var/www/html目录,并往该目录下写入文件weihu.html,内容为weihu
[root@www html]# mkdir /var/www/html -p
[root@www html]# echo "in  weihuing" >  /var/www/html/weihu.html

Verificación:
50 visitas de clientes
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-XW38lcHj-1666173614322)(./1665799618879.png)]

137 acceso a terminal
[root@www html]# curl http://www.lty.com
en weihuing

7. Separación basada en navegador

//Crea los siguientes directorios y archivos en el directorio /usr/local/nginx/html

[root@www html]# mkdir firefox chrome
[root@www html]# echo "firefox test" > firefox/index.html
[root@www html]# echo "chrome test" > chrome/index.html

//修改配置文件
[root@www html]# vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  localhost;


        location / {
                if ($http_user_agent ~ Firefox) {
                        rewrite ^(.*)$ /firefox/$1 break;
                }

                if ($http_user_agent ~ Chrome) {
                        rewrite ^(.*)$ /chrome/$1 break;
                }
                root html;
                index index.html index.htm;
        }

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /firefox {
                root html;
                index index.html;
        }
        location /chrome {
                root html;
                index index.html;
        }
[root@www html]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@www html]# nginx -s reload

Verificación
1. Acceso al navegador Chrome Google
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-TAbbCnTo-1666173614322)(./1665801439953.png)]

2. Acceso al navegador Firefox
[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-4YElJ7Qq-1666173614323)(./1665801467016.png)]

12. Casos anti-hotlinks

Antes de comprender el principio de anti-leeching, primero debemos aprender la información del encabezado del Referer de HTTP. Cuando el navegador envía una solicitud al servidor web, generalmente trae el Referer para decirle al navegador desde qué página está vinculada la página web.

El servidor backend puede determinar si es una dirección de sitio web en la que confía en función de la información de referencia obtenida. Si es así, permitirá el acceso continuo. De lo contrario, puede devolver una información de estado 403 (acceso denegado al servidor).
[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-vHETmPaF-1666173614324)(./1665801507579.png)]

Descripción:
valid_referers ninguno bloqueado server_names cadena

  • ninguno: si el referente en el encabezado está vacío, se permite el acceso
  • bloqueado: el referente en el encabezado no está vacío, pero el valor está disfrazado por el firewall o el proxy. Por ejemplo, se permite el acceso a recursos sin "http://", "https://" y otros encabezados de protocolo.
  • server_names: especifique un nombre de dominio o IP específico
  • cadena: puede admitir expresiones regulares y cadenas *. Si es una expresión regular, debe comenzar con ~.Caso
    :
    //Cree el directorio abc en el directorio /usr/local/nginx/html y coloque una imagen en este directorio.
[root@www html]# mkdir abc
[root@www html]# cd abc/
[root@www abc]# ls
悟蓝.png

[root@www abc]# vim /usr/local/nginx/conf/nginx.conf
  location ~* \.(jpg|png) {
                root html/abc;
        }
[root@www abc]# nginx -s reload

Insertar descripción de la imagen aquí

//Utilice el comando para ver la información de referencia. La protección anti-hotlink aún no se ha configurado](https://img-blog.csdnimg.cn/a37ddec96be740919d774758e2c9ebaf.png)

[root@www abc]# curl --referer http://baidu.com -I http://192.168.47.137/悟 蓝.png
HTTP/1.1 200 OK
Server: nginx/1.20.2
Date: Sat, 15 Oct 2022 02:57:12 GMT
Content-Type: image/png
Content-Length: 540902
Last-Modified: Sat, 15 Oct 2022 02:50:36 GMT
Connection: keep-alive
ETag: "634a1ffc-840e6"
Accept-Ranges: bytes

¡El estado aquí tampoco tiene encabezado
! [(img-qMmq8inY-1666173614326)(./1665802902479.png)]](https://img-blog.csdnimg.cn/37419da8250649189bf993c83695dd1c.png)

1. Comience a configurar el anti-hotlinking

[root@www html]# vim /usr/local/nginx/conf/nginx.conf
   location ~* \.(jpg|png) {                 //以~开始正则匹配(jpg|png)为结尾的后缀
                root html/abc;
                valid_referers  blocked www.cy.com;        //如果返回的头部referer为www.lty.com那么就不会执行valid_referer下面内容   
                if ($invalid_referer) {        //反之则会生成防盗链
                        return 403;
                        break;
                }
        }
[root@www html]# nginx -s reload

No es necesario agregar el parámetro none aquí. Esta forma de acceso es solicitar directamente el archivo 1.jpg en el html predeterminado en el servidor. No hay encabezado (solo dos o más solicitudes tendrán el encabezado de referencia), y lo tenemos en el archivo de configuración, se ha agregado el parámetro [none], lo que significa que aún podemos acceder al archivo cuando no hay un referente de encabezado, por lo que la protección anti-hotlink que configuramos no funciona en este momento.

verificar:
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-p5p7e28C-1666173614327)(./1665804020215.png)]

[root@www html]# curl --referer http://baidu.com -I http://192.168.47.137/悟蓝.png
HTTP/1.1 403 Forbidden
Server: nginx/1.20.2
Date: Sat, 15 Oct 2022 03:19:57 GMT
Content-Type: text/html
Content-Length: 153
Connection: keep-alive

13. Proxy inverso y equilibrio de carga

  1. nginx se usa generalmente como un proxy inverso para servidores back-end, de modo que se puede lograr fácilmente la separación dinámica y estática y el equilibrio de carga, mejorando así en gran medida las capacidades de procesamiento del servidor.
  2. nginx realiza una separación dinámica y estática. De hecho, durante el proxy inverso, si es un recurso estático, se puede leer directamente desde la ruta publicada por nginx, sin necesidad de obtenerlo del servidor backend.
  3. Sin embargo, debe tenerse en cuenta que en este caso, es necesario asegurarse de que los programas back-end y front-end sean consistentes. Puede usar Rsync para la sincronización automática del lado del servidor o usar almacenamiento compartido distribuido NFS o MFS.
    • El módulo Http Proxy tiene muchas funciones. Las más utilizadas son proxy_pass y proxy_cache.
      Si desea utilizar proxy_cache, debe integrar el módulo ngx_cache_purge de terceros para borrar el caché de URL especificado. Esta integración debe realizarse al instalar nginx, como:
      ./configure --add-module=…/ngx_cache_purge-1.0…

1. ¿Qué es un agente?

Hablando de agentes, primero tenemos que aclarar un concepto, el llamado agente es un representante y un canal,
en este momento diseñamos dos roles, uno es el rol de agente y el otro es el rol de destino. accede al rol objetivo a través de este agente. El proceso de algunas tareas se llama proceso de operación del agente; al igual que una tienda especializada en la vida: un cliente va a una determinada tienda especializada de Das y compra un par de zapatos. Esta tienda especializada es el agente. , el rol de agente es un determinado fabricante de Das y el rol de destino es el usuario

2. Proxy directo

Este modo de proxy se llama proxy de reenvío. La característica más importante de un proxy de reenvío es que el cliente tiene muy clara la dirección del servidor al que desea acceder; el servidor solo sabe de qué servidor proxy proviene la solicitud, pero no de qué cliente específico. proviene de: modo proxy directo La información real del cliente está bloqueada u oculta.
gota: https://maxiang.io/34804c1c-8b3d-406f-9658-8923f38d07b0

3. Proxy inverso

Después de recibir las solicitudes enviadas por varios clientes al servidor, el servidor nginx las distribuye al servidor de procesamiento empresarial back-end para su procesamiento de acuerdo con ciertas reglas. En este momento, la fuente de la solicitud es clara, es decir, el cliente, pero no está claro qué servidor maneja la solicitud, nginx desempeña el papel de un proxy inverso.

El proxy inverso se utiliza principalmente en la implementación distribuida de clústeres de servidores. ¡El proxy inverso oculta la información del servidor!
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-uj7OjlcK-1666168246998)(./1666151082692.png)]

// En proyectos de producción reales, la mayoría de ellos utilizan una combinación de proxy directo y proxy inverso.

Cuando operamos el proyecto real, es probable que existan proxy directo y proxy inverso en un escenario de aplicación. La solicitud del cliente proxy proxy directo para acceder al servidor de destino, el servidor de destino es un servidor proxy inverso y el proxy inverso es Múltiples negocios reales servidores de procesamiento

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-OUksK3Mh-1666168247000)(./1666151102613.png)]

4. Equilibrio de carga

  • nginx implementa un equilibrio de carga simple a través del módulo ascendente, que debe definirse en el segmento http.
  • Sondeo de peso (predeterminado): las solicitudes recibidas se asignan a diferentes servidores back-end uno por uno en orden. Incluso si un servidor back-end deja de funcionar durante el uso, nginx eliminará automáticamente el servidor de la cola y el estado de aceptación de la solicitud no verse afectado de ninguna manera.
  • De esta manera, se puede establecer un valor de peso (peso) para diferentes servidores back-end para ajustar la tasa de asignación de solicitudes en diferentes servidores; cuanto mayores sean los datos de peso, mayor será la probabilidad de ser asignado a la solicitud; el valor de peso Se ajusta principalmente a diferentes configuraciones de hardware del servidor back-end en entornos de trabajo reales.
  • ip_hash: cada solicitud coincide de acuerdo con el resultado hash de la IP del cliente iniciador. Según este algoritmo, un cliente con una dirección IP fija siempre accederá al mismo servidor back-end. Esto también resuelve el problema de la sesión en un entorno de implementación de clúster hasta cierto punto Cuestiones compartidas.

5. Caso de equilibrio de carga de Nginx

Anfitrión IP Instalar sistema
nginx 192.168.47.137 nginx RHEL8
1 rupias 192.168.47.136 httpd RHEL8
2 rupias 192.168.47.50 httpd RHEL8

//Apague el firewall y selinux en los tres hosts y configure el almacén yum
//El host nginx implementa el servicio nginx. Se ha implementado antes, por lo que no lo demostraré aquí.
//En el host rs1, instale httpd y luego agregue una página web de prueba.

[root@rs1 ~]# yum -y install httpd
[root@rs1 ~]# systemctl restart httpd
[root@rs1 ~]# systemctl enable --now httpd
[root@rs1 ~]# echo "This is a server1" > /var/www/html/index.html
[root@rs1 ~]# cat /var/www/html/index.html 
This is a server1
[root@rs1 ~]# systemctl restart httpd

//En el host rs2, instale httpd y luego agregue una página web de prueba

[root@rs2 ~]# yum -y install httpd
[root@rs2 ~]# systemctl restart httpd.service 
[root@rs2 ~]# systemctl enable --now httpd.service 
[root@rs2 ~]# echo "This is a server2" > /var/www/html/index.html
[root@rs2 ~]# systemctl restart httpd.service 

// En el host nginx, modifica el archivo de configuración y establece el equilibrio de carga

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
        upstream webserver {                    //定义负载模块为webserver
        server 192.168.47.136;
        server 192.168.47.50;
}

  server {
        listen       80;
        server_name  localhost;
        
  location / {
                proxy_pass http://webserver;
        }
[root@www ~]# nginx -t  		//检查配置文件是否正确
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@www ~]# nginx -s reload

//Utilice nginx ip para acceder correctamente a la configuración de equilibrio de carga
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-Ha9eQIps-1666168247001)(./1666151821145.png)]
del servidor2
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-pX3pwq19-1666168247002)(./1666151837666.png)]

6. Establecer pesos de equilibrio de carga

Si desea que uno de los servidores reales de back-end tenga suficientes datos y reciba más visitas, puede usar el peso para establecer el peso del acceso solicitado.

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
        upstream webserver {
        server 192.168.47.136 weight=2;     ///添加此行
        server 192.168.47.50;
}
[root@www ~]# nginx -s reload

Vuelva a cargar nginx y pruebe el acceso. En este momento, encontrará que el host (rs1) accede a 47.136 2 veces antes de ser sondeado a rs2.

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-tPjEKxYz-1666168247002)(./1666152292189.png)]

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-6IERC8z8-1666168247003)(./1666152293881.png)]

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-bNUwoqxY-1666168247003)(./1666152307993.png)]

7. Pruebe el acceso a diferentes puertos.

// En este momento, descubrimos que los tres hosts usan el puerto 80, por lo que el flujo ascendente utilizado en el archivo de configuración nginx corresponde al servidor backend real. Si no configuramos el puerto, ¿qué pasa si uno de los servidores backend usa el puerto 8080? ¿Cómo lo configuramos? rs1 es el puerto 8080, rs2 es el puerto 80
// Primero modifique el servicio httpd de rs1, escuche el puerto 8080 y reinicie el servicio httpd

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf

http {
        upstream webserver {
        server 192.168.47.136:8080 weight=2;
        server 192.168.47.50:80;
}
[root@www ~]# nginx -s reload

//第一台服务端修改端口
[root@rs1 ~]# vim /etc/httpd/conf/httpd.conf 
Listen 8080
[root@rs1 ~]# systemctl restart httpd
[root@rs1 ~]# ss -antl | grep 8080
LISTEN 0      128                *:8080            *:*    

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-3leMTIWR-1666168247005)(./1666152657490.png)]

8. configuración ip_hash

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
        upstream webserver {
        ip_hash
        server 192.168.47.136:8080 weight=2;
        server 192.168.47.50:80;
}
[root@www ~]# nginx -s reload

Según mi entendimiento personal, el modo de equilibrio de carga de ip_hash es: por ejemplo, varios usuarios acceden al clúster httpd back-end a través de nginx. En este momento, debido a que hay diferentes usuarios, las IP también son diferentes y los valores hash. ​calculados por el algoritmo ip+hash se transmiten a httpd. nginx registra la IP y el valor hash, por lo que la próxima vez que llegue la misma IP, aún se asignará a httpd.

  • Si un servidor en el clúster falla y queremos eliminarlo de la configuración del clúster nginx, no podemos eliminar directamente esa línea, como servidor 192.168.100.10:8080 peso=2; eliminar, si la eliminación directa hará que el algoritmo hash de nginx
    sea recalculado, la sesión del usuario o el caché se invalidarán, por lo tanto, si este servidor no se usa aquí, simplemente compárelo directamente con el servidor inactivo, es decir, el servidor 192.168.100.10:8080 inactivo
    .

9. Separación de nginx + tomcat dinámico y estático

O agregue un Tomcat adicional basado en el entorno Tomcat anterior
: 192.168.47.50

// Si desea implementar Tomcat, puede mirar Tomcat en mi implementación anterior del servicio jenkins. Lo omitiré en este momento. Después de la implementación, probemos el acceso a la siguiente página web de prueba dinámica basada en Tomcat.

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-9A9Vw5WC-1666168247006)(./1666155354420.png)]
implementación lateral de nginx

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf
http {
        upstream static {
        server 192.168.47.136;
        server 192.168.47.148 weight=2;   
}
        upstream tomcat {                           //动态测试
                server 192.168.47.50:8080;
        }


 server {
        listen       80;
        server_name  localhost;


        location / {
                proxy_pass http://static;
        }

        location /jenkins {
                proxy_pass http://tomcat;
        }
        
[root@www ~]# nginx -s reload

Acceso a página estática exitoso
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-g3c2UkU2-1666168247007)(./1666157238625.png)]

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-8DSfDCmc-1666168247008)(./1666157245983.png)]

(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-yAjV9GWu-1666168247008)(./1666157253986.png)]
acceso dinámico
(La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-ng9d4gqW-1666168247009)(./1666157287451.png)]

Supongo que te gusta

Origin blog.csdn.net/qq_36306519/article/details/131097273
Recomendado
Clasificación