Actualización en caliente de Nginx a la guía de proceso 1.23.4

1. Descripción del problema

inserte la descripción de la imagen aquí

El análisis de seguridad interno del entorno descubrió las vulnerabilidades CVE-2021-23017, CVE-2022-41741, CVE-2022-41742, CVE-2019-20372. Después del análisis, nginx debe actualizarse a la versión 1.23.4;

Entorno del sitio: centos7.4 1708, nginx 1.20.1

Información: descarga de software , seguridad 360 , referencia de compilación

2. Actualización y refuerzo

inserte la descripción de la imagen aquí
1) Confirmación de la versión

nginx -V   //输出如下
nginx version: nginx/1.20.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module-master --with-http_ssl_module --with-stream

2) copia de seguridad

#如果数据量不大,就整包复制一份
cp -pr ./nginx ./nginx_20230622_1.20.1

3) Descarga de medios, compilación e instalación

wget no-check-certificate https://nginx.org/download/nginx-1.23.4.tar.gz
tar -xzf nginx-1.23.4.tar.gz
#源码包目录
.
├── auto            自动检测系统环境以及编译相关的脚本
│   ├── cc          关于编译器相关的编译选项的检测脚本
│   ├── lib         nginx编译所需要的一些库的检测脚本
│   ├── os          与平台相关的一些系统参数与系统调用相关的检测
│   └── types       与数据类型相关的一些辅助脚本
├── conf            存放默认配置文件,在make install后,会拷贝到安装目录中去
├── contrib         存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html            存放默认的网页文件,在make install后,会拷贝到安装目录中去
├── man             nginx的man手册
└── src             存放nginx的源代码
    ├── core        nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数
    ├── event       对系统事件处理机制的封装,以及定时器的实现相关代码
    │   └── modules 不同事件处理方式的模块化,如select、poll、epoll、kqueue等
    ├── http        nginx作为http服务器相关的代码
    │   └── modules 包含http的各种功能模块
    ├── mail        nginx作为邮件代理服务器相关的代码
    ├── misc        一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持
    └── os          主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口
cd nginx-1.23.4
./configure --prefix=/usr/local/nginx --add-module=/data/spms/nginx-rtmp-module-master --with-http_ssl_module --with-stream  //输出如下
……
checking for getaddrinfo() ... found
configuring additional modules
adding module in /data/spms/nginx-rtmp-module-master
 + ngx_rtmp_module was configured
checking for PCRE2 library ... not found
checking for PCRE library ... found
checking for PCRE JIT support ... found
checking for OpenSSL library ... found
checking for zlib library ... found
creating objs/Makefile

Configuration summary
  + using system PCRE library
  + using system OpenSSL library
  + using system zlib library

  nginx path prefix: "/usr/local/nginx"
  nginx binary file: "/usr/local/nginx/sbin/nginx"
  nginx modules path: "/usr/local/nginx/modules"
  nginx configuration prefix: "/usr/local/nginx/conf"
  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
  nginx pid file: "/usr/local/nginx/logs/nginx.pid"
  nginx error log file: "/usr/local/nginx/logs/error.log"
  nginx http access log file: "/usr/local/nginx/logs/access.log"
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"
#编译
make -j4  //输出如下
……
objs/addon/nginx-rtmp-module-master/ngx_rtmp_proxy_protocol.o \
objs/addon/hls/ngx_rtmp_hls_module.o \
objs/addon/dash/ngx_rtmp_dash_module.o \
objs/addon/hls/ngx_rtmp_mpegts.o \
objs/addon/dash/ngx_rtmp_mp4.o \
objs/addon/nginx-rtmp-module-master/ngx_rtmp_stat_module.o \
objs/addon/nginx-rtmp-module-master/ngx_rtmp_control_module.o \
objs/ngx_modules.o \
-ldl -lpthread -lcrypt -lpcre -lssl -lcrypto -ldl -lpthread -lz \
-Wl,-E
make[1]: Leaving directory `/home/ygcg/nginx-1.23.4'

#验证
cd objs/
ls  //如下所示
addon         Makefile  nginx.8            ngx_auto_headers.h  ngx_modules.o
autoconf.err  nginx     ngx_auto_config.h  ngx_modules.c       src

inserte la descripción de la imagen aquí

4) Reemplazo y verificación de actualización en caliente

mv ./sbin/nginx ./sbin/nginx_1.20.1
cp -pr /home/ygcg/nginx-1.23.4/objs/nginx ./sbin/

#确认nginx.pid位置
find ./ -name nginx.pid
./logs/nginx.pid
cat ./logs/nginx.pid 
#热升级
kill -USR2 `cat /usr/local/nginx/logs/nginx.pid `
ll /usr/local/nginx/logs/nginx.pid.oldbin  //输出如下
-rw-r--r-- 1 ygcg root 5 Sep 14  2022 /usr/local/nginx/logs/nginx.pid.oldbin

kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin` //优雅退出

ln -s /usr/local/nginx/sbin/nginx /bin/  #绝对路径

nginx -V #验证
nginx version: nginx/1.23.4
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --add-module=/data/spms/nginx-rtmp-module-master --with-http_ssl_module --with-stream

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

3. Apéndice:

3.1 Módulos comunes de NGINX

Durante el proceso de precompilación de nginx, podemos usar el parámetro –add-module=PATH para especificar la ruta del módulo de terceros para agregar módulos. Los más comunes son:

1. El módulo nginx-module-vts implementa

el clon de git de monitoreo de tráfico https://github.com/vozlt/nginx-module-vts.git
./configure --prefix=/apps/nginx --add-module=/usr/
referencia de configuración local/src/nginx-module-vts :
http { ... vhost_traffic_status_zone; #Complete el módulo primero ... servidor { ... ubicación /estado { vhost_traffic_status_display; #Abra el módulo vhost_traffic_status_display_format html; #Module page } ##Compilar nuevos módulos necesita reiniciar Solo nginx puede acceder a la prueba, la recarga no es compatible y se puede acceder al navegador después de reiniciar: http://<nginx_ip>/status 2. El clon de git del módulo echo https://github. com.cnpmjs.org/openresty/echo-nginx- module.git /configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
















–con-http_v2_module
–con-http_realip_module
–con-http_stub_status_module –con-
http_gzip_static_module
–with-pcre
–with-stream
–with-stream_ssl_module
–with-stream_realip_module
–with-http_perl_module
–add-module=/usr/local/modules/echo- nginx-module

2. Abra el índice del directorio

Sintaxis: autoindex on | off;
Valor predeterminado: autoindex off;
Ubicación: http, servidor, ubicación

3. Formato del tamaño del archivo

Sintaxis: autoindex_exact_size on | off;
Valor predeterminado: autoindex_exact_size on;
Ubicación: http, servidor, ubicación
4. Formato de salida

Sintaxis: autoindex_format html | xml | json | jsonp
Predeterminado: autoindex_format html
Ubicación: http, servidor, ubicación
5. Usar zona horaria

Sintaxis: autoindex_localtime on | off;
Predeterminado: autoindex_localtime off;
Ubicación: http, servidor, ubicación

6. http_auth_basic_module Autenticación básica HTTP
Propósito: Proporcionar la función de autenticación básica HTTP.
Módulos incorporados: sí.
Habilitado por defecto: Sí. Si está deshabilitado, compile Nginx con --sin-http_auth_basic_module.
Alcance: http, servidor, ubicación, limit_except

server { listen 80; server_name test.com;

auth_basic   "登录认证";  
auth_basic_user_file /etc/nginx-htpasswd;
root   /mnt/html/www;
index  index.html;

}
7. Información de estado de http_stub_status_module
Propósito: Este módulo puede proporcionar información de estado de Nginx.
Módulos incorporados: sí.
Habilitado por defecto: No. Si está habilitado, use --with-http_stub_status_module al compilar Nginx.
Ámbito: servidor, ubicación
Este módulo tiene solo una instrucción stub_status.

ubicación /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } 8. http_gzip_module Uso de recursos comprimidos : se usa para admitir gzip on y otros comandos para reducir los problemas de ancho de banda del servidor, el tamaño de la página después de la compresión gzip puede convertirse en un 30 % o incluso más pequeño que el original. Módulos incorporados: sí. Habilitado por defecto: Sí. Si está deshabilitado, use --with-http_gzip_module al compilar Nginx. gzip activado; gzip_min_length 1k; gzip_buffers 4 16k; #gzip_http_version 1.0; gzip_comp_level 2;
















gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_vary off; gzip_disable “MSIE [1-6].

;

9 , http_gzip_static_module admite recursos .gz
Propósito: permite enviar archivos precomprimidos con extensión .gz en lugar de enviar archivos normales.
Módulos incorporados: sí.
Habilitado por defecto: No. Si está habilitado, use --with-http_gzip_static_module al compilar Nginx.

gzip_static on

10. Reemplazo de cadenas de http_sub_module
Propósito: Este módulo se utiliza para implementar el reemplazo de cadenas fijas del contenido de la respuesta.
Módulos incorporados: sí.
Habilitado por defecto: No. Si está habilitado, use --with-http_sub_module al compilar Nginx.
Ámbito: http, servidor, ubicación
Este módulo no admite el reemplazo regular y no es lo suficientemente flexible. Módulos de terceros que admiten el reemplazo de coincidencia regular:
1. ngx_http_substitutions_filter_module: https://github.com/yaoweibin/ngx_http_substitutions_filter_module
2、replace-filter-nginx-module:https://github.com/agentzh/replace-filter-nginx-module

location / { sub_filter '<a href="http://127.0.0.1:8080/' '< a href="https:// Error de análisis de KaTeX: Superíndice doble en la posición 36: …er 'nginx.com' '̲baidu.com'; INICIO/nginx_mod_h264_streaming-2.2.7 --sbin-path=/usr/local/sbin --with-debug \

Para obtener más información, consulte el sitio web oficial o el blog externo , y para el módulo de elementos de configuración, consulte el módulo nginx

3.2, variables del archivo de configuración nginx

1. Variables de formato de registro

$remote_addr # Registrar la dirección IP del cliente
$remote_user # Registrar el nombre de usuario del cliente
$time_local # Registrar la hora local general
$time_iso8601 # Registrar la hora local en el formato estándar ISO8601
$request # Registrar el método de solicitud y el protocolo http solicitado
$status # Registrar el código de estado de la solicitud ( para localizar información de error)
$body_bytes_sent # El número de bytes de recursos enviados al cliente, excluyendo el tamaño del encabezado de respuesta
Error de análisis de KaTeX: 'EOF' esperado, obtuvo '#' en la posición 12: bytes_sent #̲ enviar El número total de bytes al cliente mseg # tiempo de escritura del registro. La unidad es segundos, y la precisión es milisegundos.
$http_referer #Registrar a qué enlace de página se accede desde
$http_user_agent #Registrar información relacionada con el navegador del cliente
$http_x_forwarded_for #Registrar la dirección IP del cliente
$request_length #La longitud de la solicitud (incluida la línea de solicitud, el encabezado y el cuerpo de la solicitud).
$request_time # El tiempo dedicado a la solicitud, en segundos, milisegundos de precisión

Nota: si Nginx está ubicado en el balanceador de carga, detrás del proxy inverso nginx, el servidor web no puede obtener directamente la dirección IP real del cliente.

$remote_addr obtiene la dirección IP del proxy inverso. En la información del encabezado http de la solicitud de reenvío, el servidor proxy inverso,

Agregue información X-Forwarded-For para registrar la dirección IP del cliente y la dirección del servidor solicitada por el cliente

#日志格式定义示例
http {
    
    
log_format access_log_format  '$remote_addr - $remote_user [$time_local]
"$request" '
           '$status $body_bytes_sent "$http_referer" '
           '"$http_user_agent" "$http_x_forwarded_for"'
           '$server_name:$server_port';
 }
#Nginx 的默认访问日志记录内容相对比较单一,不方便后期做日志统计分析,生产环境中通常将nginx日志转换为json日志,然后配合使用ELK做日志收集,统计和分析。参考链接:http://json.cn/
http {
    
    
log_format access_json '{"@timestamp":"$time_iso8601",'
    '"host":"$server_addr",'
    '"clientip":"$remote_addr",'
    '"size":$body_bytes_sent,'
    '"responsetime":$request_time,' #总的处理时间
    '"upstreamtime":"$upstream_response_time",' #后端应用服务器处理时间
    '"upstreamhost":"$upstream_addr",' 
    '"http_host":"$host",'
    '"uri":"$uri",'
    '"xff":"$http_x_forwarded_for",'
    '"referer":"$http_referer",'
    '"tcp_xff":"$proxy_protocol_addr",'
    '"http_user_agent":"$http_user_agent",'
    '"status":"$status"}';
  access_log /usr/local/nginx/logs/access_json.log access_json;
}
#日志过滤
#比如请求favicon.ico时,不记录日志;是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的favicon.ico文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错
location /favicon.ico {
    
    
log_not_found off;
access_log off;
return 200;
}
#当有人访问gif、png等资源时,将日志丢入空
location ~* .*\.(gif|jpg|png|css|js)$ {
    
    
 access_log /dev/null;
}

2. Variables integradas de Nginx

$remote_addr; #La dirección del cliente se almacena, preste atención a la IP de la red pública del
cliente

$args;
#Todos los parámetros en la URL se almacenan en la variable, por ejemplo: http://www.ehuo.org/ main/index.do?id
=20190221&partner=search
#El resultado devuelto es: id=20190221&partner=search

$host;
#El nombre de host de la solicitud se almacena

echo $limit_rate;
#Si el servidor nginx usa limit_rate para configurar la red de visualización tarifa, se mostrará, si no se establece, se mostrará 0

$remote_port;
#El puerto se abrió aleatoriamente cuando el cliente solicita el servidor Nginx, que es el puerto propio de cada cliente

$remote_user;
#El nombre de usuario que ha sido verificado por el Módulo básico de autenticación

$request_body_file;
#Enviado a la publicación cuando se realiza un proxy inverso El nombre del recurso local del servidor final

$request_method;
#El método de solicitud de recursos, como GET/PUT/DELETE

$request_filename;
#La ruta del disco del archivo de recursos solicitado actualmente, la ruta absoluta del archivo generado por el comando raíz o alias y la solicitud de URI,

como :/apps/nginx/html/main/index.html

Error de análisis de KaTeX: se esperaba 'EOF', se obtuvo '#' en la posición 14: request_uri; #̲ contiene el URI original de los parámetros de solicitud, excluyendo... document_uri?$args, por ejemplo:
/main/index.do?id =20190221&partner=buscar

$esquema;
#Solicitar protocolo, como: http, https, ftp, etc.

$server_protocol;
#Guardar la versión del protocolo que utiliza el cliente para solicitar recursos, como: HTTP/1.0, HTTP/1.1 , HTTP/2.0, etc.

$server_addr;
# Guardar la dirección IP del servidor

$server_name;
#El nombre de host del servidor solicitado

$server_port;
#El número de puerto del servidor solicitado

$http_user_agent;
#Información detallada del navegador del cliente

$http_cookie;
#Toda la información de la cookie del cliente

$cookie_
#nombre Es el nombre clave de la cookie en el encabezado de cualquier mensaje de solicitud

$http_
#nombre es el campo de encabezado de cualquier mensaje de solicitud, indicando el campo de encabezado de la solicitud de registro mensaje, el nombre del campo de encabezado correspondiente de ame debe estar en minúsculas, si hay una línea horizontal, debe reemplazarse subrayada
campo de encabezado de solicitud arbitraria; la última parte del nombre de una variable es el nombre del campo
convertido a minúsculas con guiones reemplazados por guiones bajos #用下划线代替横线

3.3 Diagrama de flujo https de Nginx

inserte la descripción de la imagen aquí

https://nginx.org/en/docs/http/ngx_http_ssl_module.html
To reduce the processor load it is recommended to
set the number of worker processes equal to the number of processors,
enable keep-alive connections,
enable the shared session cache,
disable the built-in session cache,
and possibly increase the session lifetime (by default, 5 minutes):
worker_processes auto;
http {
    
    
 ...
 server {
    
    
   listen        443 ssl;
   keepalive_timeout  70;
   ssl_protocols    TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers     AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
   ssl_certificate   /usr/local/nginx/conf/cert.pem;
   ssl_certificate_key /usr/local/nginx/conf/cert.key;
   ssl_session_cache  shared:SSL:10m;
   ssl_session_timeout 10m;
   ...
 }
#自签名CA证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt
#自制key和csr文件
openssl req -newkey rsa:4096 -nodes -sha256 -keyout server.key -out server.csr
#自签发crt证书
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
#查看证书内容
openssl x509 -in server.crt -noout -text

3.4, http fuerza https

server {
    
    
 listen 443 ssl;
 server_name www.ehuo.org;
 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
 location / {
    
    
   if ( $scheme = http ) {
    
    
    rewrite ^/(.*)$ https://www.ehuo.org/$1 redirect;   #主要实现       
            
   }

3.5 Anti-sanguijuela

#配置完成 后可使用curl -e参数指定refer测试
vim /usr/local/nginx/conf/conf.d/pc.conf  //如下所示
server {
    
    
 index index.html;
 valid_referers none blocked server_names *.blue.com *.blue.org 
~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ; #定义有效的referer
  if ($invalid_referer) {
    
     #假如是使用其他的无效的referer访问
  return 403 "Forbidden Access"; #返回状态码403
   #return 302 http:/blue.com/test.jpg;
   #rewrite ^(.*)$ /daolian.jpg break;#或者返回错误图片
 }
......
}
#语法说明
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信
息。
blocked:#请求报文有referer首部,但无有效值,比如为空。
server_names:#referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string:#自定义指定字符串,但可使用*作通配符。示例: *.ehuo.org www.ehuo.*
regular expression:#被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:
~.*\.ehuo\.com

Supongo que te gusta

Origin blog.csdn.net/ximenjianxue/article/details/131343470
Recomendado
Clasificación