Escribe una guía de configuración de nginx

configuración de nginx.conf

nginx.confBusque el archivo en el directorio de instalación de Nginx , que es responsable de la configuración de la función básica de Nginx.

Información general del perfil

El archivo de configuración principal de Nginx ( conf/nginx.conf) está organizado en la siguiente estructura:

bloque de configuración Función descriptiva
bloque global Configuraciones globales relacionadas con la operación de Nginx
bloque de eventos Configuraciones relacionadas con las conexiones de red
bloque http Configuración de proxies, cachés, logs, hosts virtuales, etc.
bloque de servidor Configuración de parámetros del host virtual (un bloque http puede contener varios bloques de servidor)
bloque de ubicación Definir el enrutamiento de solicitudes y los métodos de procesamiento de páginas.

imagen.png

Ejemplo de archivo de configuración

Un ejemplo de archivo de configuración relativamente completo es el siguiente.

# 全局段配置
# ------------------------------

# 指定运行nginx的用户或用户组,默认为nobody。
#user administrator administrators;

# 设置工作进程数,通常设置为等于CPU核心数。
#worker_processes 2;

# 指定nginx进程的PID文件存放位置。
#pid /nginx/pid/nginx.pid;

# 指定错误日志的存放路径和日志级别。
error_log log/error.log debug;

# events段配置信息
# ------------------------------
events {
    # 设置网络连接序列化,用于防止多个进程同时接受到新连接的情况,这种情况称为"惊群"。
    accept_mutex on;

    # 设置一个进程是否可以同时接受多个新连接。
    multi_accept on;

    # 设置工作进程的最大连接数。
    worker_connections  1024;
}

# http配置段,用于配置HTTP服务器的参数。
# ------------------------------
http {
    # 包含文件扩展名与MIME类型的映射。
    include       mime.types;

    # 设置默认的MIME类型。
    default_type  application/octet-stream;

    # 定义日志格式。
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';

    # 指定访问日志的存放路径和使用的格式。
    access_log log/access.log myFormat;

    # 允许使用sendfile方式传输文件。
    sendfile on;

    # 限制每次调用sendfile传输的数据量。
    sendfile_max_chunk 100k;

    # 设置连接的保持时间。
    keepalive_timeout 65;

    # 定义一个上游服务器组。
    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #此服务器为备份服务器。
    }

    # 定义错误页面的重定向地址。
    error_page 404 https://www.baidu.com;

    # 定义一个虚拟主机。
    server {
        # 设置单个连接上的最大请求次数。
        keepalive_requests 120;

        # 设置监听的端口和地址。
        listen       4545;
        server_name  127.0.0.1;

        # 定义location块,用于匹配特定的请求URI。
        location  ~*^.+$ {
           # 设置请求的根目录。
           #root path;

           # 设置默认页面。
           #index vv.txt;

           # 将请求转发到上游服务器组。
           proxy_pass  http://mysvr;

           # 定义访问控制规则。
           deny 127.0.0.1;
           allow 172.18.5.54;          
        } 
    }
}

locationExplicación detallada del mapeo de rutas

Formato:

location [ = | ~ | ~* | !~ | !~* | ^~ | @ ] uri {...}

Explicación de cada marca:

  • =: Coincidencia exacta. Si la coincidencia es exitosa, detenga la búsqueda inmediatamente y procese la solicitud.
  • ~: Realiza coincidencias periódicas, distingue entre mayúsculas y minúsculas.
  • ~*: Realice coincidencias regulares, sin distinguir entre mayúsculas y minúsculas.
  • !~: Coincidencia regular, distingue entre mayúsculas y minúsculas y no coincide.
  • !~*: Coincidencia regular, no coincidencia que no distingue entre mayúsculas y minúsculas.
  • ^~: Coincidencia de prefijos. Si la coincidencia es exitosa, no se coincidirá con nada más locationy no se consultará la expresión regular.
  • @: Nombre especificado location, utilizado principalmente para solicitudes de redireccionamiento interno, como error_pagey try_files.
  • uri: La cadena de solicitud que debe coincidir. Puede ser una cadena normal o contener una expresión regular.

Prioridades y ejemplos

Orden de prioridad: sin identificador específico < ^~< =< coincidencia regular ( ~, ~*, !~, !~*)

Ejemplo:

location = / {
    # 精确匹配 /,主机名后面不能带任何字符串
    # http://abc.com [匹配成功]
    # http://abc.com/index [匹配失败]
}

location ^~ /img/ {
    # 以 /img/ 开头的请求,都会匹配上
    # http://abc.com/img/a.jpg [匹配成功]
    # http://abc.com/img/b.mp4 [匹配成功]
}

location ~* /Example/ {
    # 忽略 uri 部分的大小写
    # http://abc.com/test/Example/ [匹配成功]
    # http://abc.com/example/ [匹配成功]
}

location /documents {
    # 如果有正则表达式可以匹配,则优先匹配正则表达式
    # http://abc.com/documentsabc [匹配成功]
}

location / {
    # http://abc.com/abc [匹配成功]
}

proxy inverso

El proxy inverso es una de las funciones principales de Nginx. Le permite a Nginx reenviar solicitudes del cliente al servidor back-end y devolver la respuesta del servidor back-end al cliente, haciendo que el cliente sienta que se está comunicando directamente con el servidor de fondo. .

imagen.png

Configuracion basica

Para configurar Nginx como proxy inverso, debe utilizar las directivas locationdel bloque proxy_pass:

location /some/path/ {
    proxy_pass http://your_backend_address;
}

Comandos comunes

  • proxy_pass: Defina la dirección del servidor backend.
  • proxy_set_header: Modifique el encabezado de la solicitud pasado del cliente al servidor proxy.
  • proxy_hide_header: Oculta los encabezados de respuesta devueltos por el servidor proxy.
  • proxy_redirect: Modifique los campos de encabezado Locationy en el encabezado de respuesta devuelto por el servidor proxy .Refresh

Configuración de ejemplo

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

En esta configuración, todas example.comlas solicitudes enviadas a se enviarán mediante proxy a localhost:8080.

Precauciones

  1. Cuando utilice proxy_passla directiva, asegúrese de que el servidor backend esté disponible; de ​​lo contrario, Nginx devolverá un error.
  2. Úselo proxy_set_headerpara garantizar que el servidor backend reciba los encabezados de solicitud correctos.
  3. Si el servidor backend y Nginx están en máquinas diferentes, asegúrese de que la conexión de red sea estable.

Los proxies inversos no sólo mejoran el rendimiento y la confiabilidad de su sitio web, sino que también pueden usarse para una variedad de propósitos, como equilibrio de carga, almacenamiento en caché de contenido estático, mantenimiento y seguridad.

balanceo de carga

Cuando hay varios servidores, el servidor proxy distribuye la solicitud al servidor designado para su procesamiento de acuerdo con las reglas.

imagen.png

Nombre de directiva describir Ejemplo
RR (todos contra todos) El método de equilibrio de carga predeterminado se asigna a diferentes servidores backend uno por uno en orden cronológico. upstream web_servers { server localhost:8081; server localhost:8082; }
Modo de espera activo Cuando el servidor principal falla, el tráfico se reenvía al servidor de respaldo. upstream web_servers { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; }
Pesos Distribuya las solicitudes según pesos preestablecidos. Los servidores con pesos más altos reciben más solicitudes. upstream web_servers { server localhost:8081 weight=1; server localhost:8082 weight=2; }
ip_hash Distribuya las solicitudes según el resultado hash de la dirección IP del cliente para garantizar que las solicitudes para una IP de cliente específica siempre se envíen al mismo servidor backend. upstream test { ip_hash; server localhost:8080; server localhost:8081; }
justo (tercero) Las solicitudes se asignan en función del tiempo de respuesta del servidor backend, dándose prioridad a aquellas con tiempos de respuesta más cortos. upstream backend { fair; server localhost:8080; server localhost:8081; }
url_hash (tercero) Distribuya las solicitudes según el resultado hash de la URL solicitada para garantizar que las solicitudes para la misma URL siempre se envíen al mismo servidor backend. upstream backend { hash_method crc32; hash $request_uri; server localhost:8080; server localhost:8081; }

Estas estrategias de equilibrio de carga se pueden seleccionar y combinar de acuerdo con los escenarios y necesidades de la aplicación real.

Configurar la separación dinámica y estática

La separación dinámica y estática es una estrategia común de optimización de servidores web, principalmente para mejorar la velocidad de respuesta del servidor y reducir la presión sobre el servidor. En Nginx, la separación de lo dinámico y lo estático es muy fácil de lograr.

imagen.png

Conceptos básicos de separación dinámica y estática:

La separación de contenido dinámico y contenido estático se refiere al procesamiento de contenido dinámico y contenido estático por separado. El contenido estático generalmente incluye: imágenes, CSS, JavaScript, archivos HTML, etc. No es necesario cambiar estos contenidos con frecuencia. El contenido dinámico cambia con frecuencia, como el contenido generado por PHP, ASP, JSP, Servlet, etc.

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

  1. Establezca un alias o directorio raíz directamente para contenido estático :
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    root /path/to/static/files;
    expires 30d;  # 设置缓存时间
}

En la configuración anterior, todos los archivos estáticos se almacenan en /path/to/static/filesel directorio. expiresLa directiva establece el tiempo de caché de los archivos estáticos.

  1. Utilice alias alias :

Si sus archivos estáticos no están en el directorio principal del proyecto, puede utilizar aliaspara especificar la ruta real de los archivos estáticos.

location /static/ {
    alias /path/to/static/files/;
}

En esta configuración, las URL /static/se asignan al sistema de archivos /path/to/static/files/.

  1. Contenido dinámico del agente :

Para contenido dinámico, es posible que necesite enviar la solicitud al servidor de aplicaciones backend, como Tomcat, uWSGI, etc.

location / {
    proxy_pass http://backend_server_address;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

Cosas a tener en cuenta :

  • Asegúrese de que las rutas de sus archivos estáticos estén configuradas correctamente para evitar errores 404.
  • Utilice expiresdirectivas para configurar el almacenamiento en caché para contenido estático, lo que puede reducir la carga en su servidor y aumentar la velocidad de carga de la página.
  • La separación de lo dinámico y lo estático no solo puede mejorar la velocidad de respuesta del servidor, sino también reducir la presión sobre el servidor back-end, porque Nginx generalmente procesa los archivos estáticos directamente sin la necesidad de enviarlos por proxy al servidor back-end. .

Optimización de recursos estáticos

Para mejorar la eficiencia de transmisión de recursos estáticos, Nginx proporciona las siguientes tres instrucciones de optimización principales:

  • sendfile
  • tcp_nopush
  • tcp_nodelay

comando enviar archivo

sendfileSe utiliza para habilitar el modo de transferencia de archivos eficiente. Se implementa llamando a funciones del kernel del sistema sendfile, evitando así múltiples copias de archivos, al tiempo que reduce el cambio entre el modo de usuario y el modo kernel, mejorando así la eficiencia de transmisión de archivos estáticos.

Proceso tradicional de solicitud de recursos estáticos:

  1. El cliente envía una solicitud al servidor a través de la interfaz de red.
  2. El sistema operativo pasa estas solicitudes a la aplicación del lado del servidor.
  3. La aplicación del servidor maneja la solicitud.
  4. Una vez completado el procesamiento, el sistema operativo pasa los resultados del procesamiento al cliente a través del adaptador de red.

imagen.png

proyecto describir
gramática `enviar archivo en apagado`
valor por defecto sendfile off
Ubicación de configuración http块server块location块

Instrucciones tcp_nopush y tcp_nodelay

tcp_nopush

También se puede habilitar cuando sendfileestá activado . tcp_nopushSu objetivo principal es mejorar la eficiencia de transmisión de paquetes de datos de la red.

proyecto describir
gramática `tcp_nopush activado apagado`
valor por defecto tcp_nopush off
Ubicación de configuración http块server块location块

tcp_nodelay

Sólo tiene efecto keep-alivecuando la conexión está abierta . tcp_nodelaySu propósito es mejorar el rendimiento en tiempo real de los paquetes de datos de la red.

proyecto describir
gramática `tcp_nodelay activado apagado`
valor por defecto tcp_nodelay on
Ubicación de configuración http块server块location块

tcp_nopushEl principio de funcionamiento es configurar un búfer y enviar datos solo cuando el búfer esté lleno, lo que puede reducir en gran medida la sobrecarga de la red.

Compresión de recursos estáticos

Durante el proceso de transmisión de datos, para optimizar aún más, Nginx introduce el módulo gzip para comprimir los recursos transmitidos, reduciendo así el volumen de transmisión de datos y mejorando la eficiencia de la transmisión.

imagen.png

La compresión de recursos estáticos en Nginx se puede configurar en el bloque http, el bloque del servidor y el bloque de ubicación. Los principales módulos involucrados son:

  • Módulo ngx_http_gzip_module (integrado)
  • módulo ngx_http_gzip_static_module
  • módulo ngx_http_gunzip_module

Directivas de configuración del módulo Gzip

  1. gzip : activa o desactiva la función gzip.

    • gramática:gzip on | off
    • valor por defecto:gzip off
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
  2. gzip_types : habilita selectivamente la compresión gzip según el tipo MIME de la respuesta.

    • gramática:gzip_types mime-type
    • valor por defecto:gzip_types text/html
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
    • Ejemplo:gzip_types application/javascript
  3. gzip_comp_level : establece el grado de compresión Gzip, el nivel es del 1 al 9.

    • gramática:gzip_comp_level level
    • valor por defecto:gzip_comp_level 1
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
  4. gzip_vary : establece si se debe llevar el encabezado de respuesta "Vary:Accept-Encoding".

    • gramática:gzip_vary on|off
    • valor por defecto:gzip_vary off
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
  5. gzip_buffers : número y tamaño de buffers para manejar la compresión solicitada.

    • gramática:gzip buffers number size
    • valor por defecto:gzip_buffer 32 4k | 16 8K
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
  6. gzip_disable : activa y desactiva selectivamente la función gzip, según el indicador del navegador del cliente.

    • gramática:gzip_disable regex
    • valor por defecto:gzip_disable -
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
    • Ejemplo:gzip_disable "MSIE [1-6]."
  7. gzip_http_version : activa y desactiva selectivamente la función gzip para diferentes versiones del protocolo http.

    • gramática:gzip_http_version 1.0 | 1.1
    • valor por defecto:gzip_http_version 1.1
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
  8. gzip_min_length : determina si se utiliza la función gzip según el tamaño del contenido de la respuesta.

    • gramática:gzip_min_length length
    • valor por defecto:gzip_min_length 20
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación
  9. gzip_proxied : establece si se comprimirán con gzip los resultados devueltos por el servidor nginx al servidor en segundo plano.

    • gramática:gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any
    • valor por defecto:gzip_proxied off
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación

Problemas de coexistencia de gzip y sendfile

Gzip realiza la compresión dentro de la aplicación y sendfile puede enviar archivos de recursos estáticos directamente a través de los dispositivos de red del sistema, sin pasar por el proceso de usuario de la aplicación. Para resolver el conflicto entre los dos, Nginx proporciona directivas ngx_http_gzip_static_modulede módulo gzip_static.

imagen.png

  • gzip_static : comprime archivos estáticos por adelantado.
    • gramática:gzip_static on|off|always
    • valor por defecto:gzip_static off
    • Ubicación de configuración: bloque http, bloque de servidor, bloque de ubicación

A través de la configuración anterior, Nginx puede comprimir efectivamente recursos estáticos, mejorar la eficiencia de la transmisión de datos y coexistir con la función sendfile para garantizar una transmisión eficiente de recursos.

Dominio cruzado

El intercambio de recursos entre orígenes (CORS) es una política de seguridad que controla qué sitios web pueden acceder a sus recursos. A menudo se encuentran problemas entre dominios cuando la aplicación de front-end y la API de back-end están en dominios diferentes. Nginx puede ayudar a resolver este problema configurando encabezados de respuesta.

imagen.png

location / {
    # 其他配置...

    # 设置允许来自所有域名请求。如果需要指定域名,将'*'替换为您的域名。
    add_header 'Access-Control-Allow-Origin' '*';

    # 允许的请求方法。
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

    # 允许的请求头。
    add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

    # 允许浏览器缓存预检请求的结果,单位为秒。
    add_header 'Access-Control-Max-Age' 1728000;

    # 允许浏览器在实际请求中携带用户凭证。
    add_header 'Access-Control-Allow-Credentials' 'true';

    # 设置响应类型为JSON。
    add_header 'Content-Type' 'application/json charset=UTF-8';

    # 针对OPTIONS请求单独处理,因为预检请求使用OPTIONS方法。
    if ($request_method = 'OPTIONS') {
        return 204;
    }
}

Nota : en un entorno de producción, se recomienda no utilizar esto por razones de seguridad 'Access-Control-Allow-Origin' '*'y, en su lugar, especificar el nombre de dominio exacto.

Anti-hotlinking

imagen.png

Anti-hotlinking se refiere a evitar que otros sitios web se vinculen directamente a los recursos de su sitio web (como imágenes, videos, etc.), consumiendo así el ancho de banda de su servidor. Nginx proporciona un módulo muy conveniente: ngx_http_referer_module, que se utiliza para implementar la función anti-hotlinking.

Configuración básica anti-hotlink:

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
    valid_referers none blocked www.example.com example.com *.example.net;
    
    if ($invalid_referer) {
        return 403;
    }
}

En la configuración anterior:

  • valid_referersSe definen las páginas de fuentes legales. noneIndica acceso directo, blockedindica Refereracceso sin encabezados, www.example.comy example.comson nombres de dominio de origen legales, y todos los nombres de subdominio *.example.netrepresentados example.netson fuentes legales.

  • $invalid_refererLa variable se valid_referersvolverá "verdadera" cuando la fuente no esté en la lista.

  • Si la fuente es ilegal, el servidor devolverá un código de estado 403 Prohibido.

Utilice la imagen incorrecta en lugar de la imagen original:

Si no desea mostrar un error 403, pero desea mostrar una imagen de error (por ejemplo: una imagen "sin enlaces externos"), puede configurarlo de esta manera:

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
    valid_referers none blocked www.example.com example.com *.example.net;
    
    if ($invalid_referer) {
        rewrite ^/.*$ /path/to/error/image.jpg;
    }
}

En la configuración anterior, cuando se detecta un enlace activo, Nginx reescribirá la URL solicitada para apuntar a una imagen incorrecta.

Cosas a tener en cuenta :

  • La configuración anti-hotlinking puede afectar a los rastreadores de los motores de búsqueda, así que tenga cuidado al implementar una estrategia anti-hotlinking.

  • Si su sitio web utiliza una CDN, asegúrese de que el servidor de la CDN también esté valid_referersen la lista; de lo contrario, es posible que la CDN no funcione correctamente.

  • Para garantizar que el anti-hotlinking esté configurado correctamente, debe realizar pruebas adecuadas en un entorno de prueba antes de usarlo en un entorno de producción.

variables incorporadas

Las variables integradas que se pueden utilizar en los archivos de configuración de nginx comienzan con el signo de dólar $. Entre ellos, los valores de la mayoría de las variables predefinidas son enviados y transportados por el cliente.

nombre de la variable describir
$args Parámetros en la línea de solicitud, igual que$query_string
$content_length Campo de longitud del contenido en el encabezado de la solicitud
$content_type Campo de tipo de contenido en el encabezado de la solicitud
$document_root El valor especificado en la directiva raíz para la solicitud actual.
$host El nombre de host de la línea de solicitud o el nombre de host en el campo del encabezado de la solicitud.
$http_user_agent Información del agente del cliente
$http_cookie Información de cookies del cliente
$limit_rate Variables que pueden limitar la velocidad de conexión
$request_method La acción solicitada por el cliente, como GET o POST.
$remote_addr Dirección IP del cliente
$remote_port puerto de cliente
$remote_user Nombre de usuario que ha sido autenticado por el Módulo Básico de Autenticación
$request_filename Ruta del archivo solicitado actual
$scheme Métodos HTTP (como http, https)
$server_protocol El protocolo utilizado por la solicitud, como HTTP/1.0 o HTTP/1.1.
$server_addr dirección del servidor
$server_name nombre del servidor
$server_port El número de puerto donde la solicitud llega al servidor.
$request_uri URI original que contiene los parámetros de solicitud
$uri El URI actual sin parámetros de solicitud.
$document_uri $uriIgual que

Estas variables integradas brindan una gran flexibilidad en la configuración de nginx, lo que le permite a nginx tomar decisiones y procesar en función de varios atributos de la solicitud.

Supongo que te gusta

Origin blog.csdn.net/2301_76869453/article/details/132920627
Recomendado
Clasificación