1 configuração de domínio cruzado do Nginx

O problema de domínio cruzado é, na verdade, um problema relativamente raro no desenvolvimento de arquitetura única anterior, a menos que precise ser conectado a um terceiro SDK, esse problema precisa ser tratado. No entanto, com a popularidade da separação de front-end e back-end e da arquitetura distribuída, os problemas entre domínios se tornaram um problema que todo desenvolvedor Java deve saber como resolver.

Causas de problemas entre domínios

   O principal motivo para problemas entre domínios é a política de mesma origem . Para garantir a segurança das informações do usuário e impedir que sites maliciosos roubem dados, a política de mesma origem é necessária, caso contrário, cookieela pode ser compartilhada. Como httpos protocolos sem estado são geralmente usados cookie​​para obter registros de informações com estado, como identidade/senha do usuário, etc., uma vez cookiecompartilhados, as informações de identidade do usuário serão roubadas.
A política de mesma origem refere-se principalmente aos mesmos três pontos, duas solicitações com o mesmo protocolo + nome de domínio + porta podem ser consideradas como a mesma fonte, mas se algum ponto for diferente, significa que existem duas solicitações de fontes diferentes. As políticas de origem restringem a interação de recursos entre diferentes origens.

Nginx resolve problemas entre domínios

   Depois de descobrir a causa do problema entre domínios, Nginxcomo podemos resolver o problema entre domínios a seguir? Na verdade, é relativamente simples, nginx.confbasta adicionar um pouco de configuração em:

location / {
    # 允许跨域的请求,可以自定义变量$http_origin,*表示所有
    add_header 'Access-Control-Allow-Origin' *;
    # 允许携带cookie请求
    add_header 'Access-Control-Allow-Credentials' 'true';
    # 允许跨域请求的方法:GET,POST,OPTIONS,PUT
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';
    # 允许请求时携带的头部信息,*表示所有
    add_header 'Access-Control-Allow-Headers' *;
    # 允许发送按段获取资源的请求
    add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
    # 一定要有!!!否则Post请求无法进行跨域!
    # 在发送Post跨域请求前,会以Options方式发送预检请求,服务器接受时才会正式请求
    if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        # 对于Options方式的请求返回204,表示接受跨域请求
        return 204;
    }
}
复制代码

Depois que nginx.confa configuração acima for adicionada ao arquivo, a solicitação entre domínios entrará em vigor.

HandlerInterceptorAdapterMas se o back-end for desenvolvido usando uma arquitetura distribuída, às vezes as chamadas RPC também precisam resolver problemas entre domínios, caso contrário, também haverá exceções que não podem ser solicitações entre domínios, portanto, você pode herdar classes em seus projetos de back-end WebMvcConfigurer. @CrossOrginsão usados ​​para implementar a configuração entre domínios entre interfaces.

10. Projeto anti-sanguessuga Nginx

Autor: Bamboo Loves Panda
Link: https://juejin.cn/post/7112826654291918855
Fonte: Rare Earth Nuggets
Os direitos autorais pertencem ao autor. Para reimpressão comercial, por favor, entre em contato com o autor para autorização, para reimpressão não comercial, por favor, indique a fonte.

Depois que nginx.confa configuração acima for adicionada ao arquivo, a solicitação entre domínios entrará em vigor.

HandlerInterceptorAdapterMas se o back-end for desenvolvido usando uma arquitetura distribuída, às vezes as chamadas RPC também precisam resolver problemas entre domínios, caso contrário, também haverá exceções que não podem ser solicitações entre domínios, portanto, você pode herdar classes em seus projetos de back-end WebMvcConfigurer. @CrossOrginsão usados ​​para implementar a configuração entre domínios entre interfaces.

10. Projeto anti-sanguessuga Nginx

   Vamos primeiro entender o que é hotlinking: hotlinking refere-se à exibição externa de recursos introduzidos por sites externos no site atual . Vamos dar um exemplo simples para entender:

Assim como o site de papel de parede XZhan, YZhan, XZhan é uma forma de comprar direitos autorais e assinar autores pouco a pouco, acumulando assim uma grande quantidade de materiais de papel de parede, mas Ydevido a vários motivos, como fundos, Zhan <img src="X站/xxx.jpg" />copiou diretamente Xtodos os papéis de parede de Zhan através este método Recursos e, em seguida, fornecidos aos usuários para download.

Portanto, se somos deste Xsite Boss, devemos estar infelizes, então como podemos proteger esses problemas neste momento? Então a corrente antifurto a ser descrita a seguir está aqui!

NginxA implementação do mecanismo anti-leeching está relacionada a um campo de cabeçalho analisado no artigo anterior "HTTP/HTTPS"Referer : Este campo descreve principalmente de onde a solicitação atual é enviada, para que Nginxvocê possa obter o valor em , e então julgar se é é uma solicitação de referência de recurso deste site, caso contrário, o acesso não é permitido. NginxExiste um item de configuração em valid_referers, que pode atender aos requisitos anteriores. A sintaxe é a seguinte:

  • valid_referers none | blocked | server_names | string ...;
    • none: Indica que a solicitação de acesso sem Referercampos é aceita.HTTP
    • blocked: Indica que o acesso é permitido http://ou https//solicitado de outra forma.
    • server_names: A lista branca de recursos, aqui você pode especificar os nomes de domínio que podem ser acessados.
    • string: você pode personalizar a string, controlar curingas e expressões regulares.

Após um breve entendimento da sintaxe, a próxima implementação é a seguinte:

# 在动静分离的location中开启防盗链机制
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){
    # 最后面的值在上线前可配置为允许的域名地址
    valid_referers blocked 192.168.12.129;
    if ($invalid_referer) {
        # 可以配置成返回一张禁止盗取的图片
        # rewrite   ^/ http://xx.xx.com/NO.jpg;
        # 也可直接返回403
        return   403;
    }
    
    root   /soft/nginx/static_resources;
    expires 7d;
}
复制代码

Depois de configurar de acordo com o conteúdo acima, Nginxo mecanismo anti-leeching mais básico foi realizado e, finalmente, é necessário reiniciá-lo novamente! Claro, para a implementação do mecanismo anti-sanguessuga, também existem módulos especiais de terceiros ngx_http_accesskey_modulepara obter um design mais completo, e os amigos interessados ​​​​podem ir e ver por si mesmos.

PS: O mecanismo anti-leeching não pode resolver as referersinformações forjadas do rastreador, capturando dados dessa maneira.

Eleven, configuração de transferência de arquivos grandes do Nginx

   Em alguns cenários de negócios, alguns arquivos grandes precisam ser transferidos, mas geralmente haverá alguns problemas ao transferir arquivos grandes Bug, como arquivo excedendo o limite, tempo limite de solicitação durante a transferência de arquivo, etc., então você pode Nginxfazer algumas configurações neste momento , vamos entender primeiro Alguns itens de configuração que podem ser usados ​​ao transferir arquivos grandes:

item de configuração paráfrase
client_max_body_size Defina o tamanho máximo permitido para o corpo da solicitação
client_header_timeout O tempo limite para aguardar o cliente enviar um cabeçalho de solicitação
client_body_timeout Defina o tempo limite para ler o corpo da solicitação
proxy_read_timeout NginxDefina o tempo máximo de espera quando a solicitação for lida pelo servidor de back-end
proxy_send_timeout Defina Nginxo tempo limite quando o back-end retornar uma resposta para

Ao transferir arquivos grandes, client_max_body_size、client_header_timeout、proxy_read_timeout、proxy_send_timeoutesses quatro valores de parâmetros podem ser configurados de acordo com a situação real do seu projeto.

A configuração acima é necessária apenas como camada de proxy, porque o cliente final transfere arquivos ou interage diretamente com o backend. Aqui, a Nginxconfiguração como camada de gateway é ajustada apenas para um nível que possa "acomodar arquivos grandes" na transferência.
Claro, Nginxele também pode ser usado como servidor de arquivos, mas precisa usar um módulo especial de terceiros nginx-upload-module. Se não houver muitas funções para upload de arquivos no projeto, é recomendável construí- Nginxlo. Afinal, ele pode salvar um recurso de servidor de arquivos. No entanto, se o upload/download de arquivos for mais frequente, é recomendável configurar um servidor de arquivos adicional e entregar a função de upload/download ao back-end para processamento.

12. O Nginx configura o certificado SSL

   À medida que mais e mais sites são acessados HTTPS, não basta Nginxconfigurar apenas no meio HTTP, sendo muitas vezes necessário monitorar as requisições de porta, mas conforme mencionado no 443artigo anterior "HTTP/HTTPS"HTTPS , para garantir a segurança da comunicação, o servidor precisa ser configurado O certificado digital correspondente, quando o projeto é usado Nginxcomo um gateway, então o certificado Nginxtambém precisa ser configurado em , e então falar brevemente sobre SSLo processo de configuração do certificado:

  • ① Primeiro, vá para a organização CA ou solicite o SSLcertificado correspondente no console da nuvem e baixe Nginxo certificado da versão depois de passar na revisão.
  • ② Após o download do certificado digital, há um total de três arquivos completos: .crt、.key、.pem:
    • .crt: Arquivo de certificado digital, .crtque é .pemum arquivo estendido, portanto, algumas pessoas podem não tê-lo após o download.
    • .key: O arquivo de chave privada do servidor e a chave privada criptografada de forma assimétrica são usados ​​para descriptografar os dados transmitidos pela chave pública.
    • .pem: Base64-encodedO arquivo de texto do certificado de origem em formato codificado e o nome da extensão podem ser modificados de acordo com as necessidades.
  • ③Crie um Nginxnovo certificatediretório no diretório e carregue o certificado/chave privada baixado e outros arquivos para o diretório.
  • ④ Por fim, modifique nginx.confo arquivo, conforme a seguir:
# ----------HTTPS配置-----------
server {
    # 监听HTTPS默认的443端口
    listen 443;
    # 配置自己项目的域名
    server_name www.xxx.com;
    # 打开SSL加密传输
    ssl on;
    # 输入域名后,首页文件所在的目录
    root html;
    # 配置首页的文件名
    index index.html index.htm index.jsp index.ftl;
    # 配置自己下载的数字证书
    ssl_certificate  certificate/xxx.pem;
    # 配置自己下载的服务器私钥
    ssl_certificate_key certificate/xxx.key;
    # 停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥
    ssl_session_timeout 5m;
    # TLS握手时,服务器采用的密码套件
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    # 服务器支持的TLS版本
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 开启由服务器决定采用的密码套件
    ssl_prefer_server_ciphers on;
​
    location / {
        ....
    }
}

# ---------HTTP请求转HTTPS-------------
server {
    # 监听HTTP默认的80端口
    listen 80;
    # 如果80端口出现访问该域名的请求
    server_name www.xxx.com;
    # 将请求改写为HTTPS(这里写你配置了HTTPS的域名)
    rewrite ^(.*)$ https://www.xxx.com;
}
复制代码

OK~, de acordo com a configuração acima Nginx, seu site poderá https://ser acessado através do método, e quando o cliente utilizar http://o método para acessar, ele será reescrito automaticamente como HTTPSuma requisição.

Treze, alta disponibilidade do Nginx

   Se um único nó for implantado online Nginx, desastres naturais e desastres causados ​​pelo homem ocorrerão inevitavelmente, como anormalidades do sistema, tempo de inatividade do programa, falta de energia do servidor, explosões na sala de computadores e a destruição da terra... Hahaha, exagerado. No entanto, existem de fato perigos ocultos no ambiente de produção real. À medida que Nginxa camada de gateway de todo o sistema acessa o tráfego externo, uma vez desativado Nginx, todo o sistema acabará ficando indisponível. Isso é, sem dúvida, extremamente ruim para a experiência do usuário, portanto, também deve ser garantida Nginxalta disponibilidade .

Em seguida, o mecanismo será adotado para alcançar keepalivedalta disponibilidade. Não significa apenas membros, mas significa , ou seja, virtual .VIPNginx
VIPVirtual IPIP

keepalivedNo desenvolvimento anterior da arquitetura de nó único, era uma tecnologia de alta disponibilidade usada com relativa frequência. Por exemplo, o mecanismo fornecido MySQL、Redis、MQ、Proxy、Tomcatpor etc. será usado para obter alta disponibilidade de aplicativos de nó único.keepalivedVIP

Keepalived + script de reinicialização + construção de espera ativa de máquina dupla

①Primeiro crie um diretório correspondente e baixe keepalivedo pacote de instalação (código de extração: s6aq) para Linuxele e descompacte-o:

[root@localhost]# mkdir /soft/keepalived && cd /soft/keepalived
[root@localhost]# wget https://www.keepalived.org/software/keepalived-2.2.4.tar.gz
[root@localhost]# tar -zxvf keepalived-2.2.4.tar.gz
复制代码

②Entre no keepaliveddiretório descompactado e crie o ambiente de instalação, depois compile e instale:

[root@localhost]# cd keepalived-2.2.4
[root@localhost]# ./configure --prefix=/soft/keepalived/
[root@localhost]# make && make install
复制代码

③Entre no diretório de instalação /soft/keepalived/etc/keepalived/e edite o arquivo de configuração:

[root@localhost]# cd /soft/keepalived/etc/keepalived/
[root@localhost]# vi keepalived.conf
复制代码

④ Edite keepalived.confo arquivo de configuração principal do host, conforme a seguir:

global_defs {
    # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。
    notification_email {
        root@localhost
    }
    notification_email_from root@localhost
    smtp_server localhost
    smtp_connect_timeout 30
    # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)
	router_id 192.168.12.129 
}

# 定时运行的脚本文件配置
vrrp_script check_nginx_pid_restart {
    # 之前编写的nginx重启脚本的所在位置
	script "/soft/scripts/keepalived/check_nginx_pid_restart.sh" 
    # 每间隔3秒执行一次
	interval 3
    # 如果脚本中的条件成立,重启一次则权重-20
	weight -20
}

# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)
vrrp_instance VI_1 {
    # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)
	state MASTER
    # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置
	interface ens33 
    # 虚拟路由的ID号,主从两个节点设置必须一样
	virtual_router_id 121
    # 填写本机IP
	mcast_src_ip 192.168.12.129
    # 节点权重优先级,主节点要比从节点优先级高
	priority 100
    # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题
	nopreempt
    # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)
	advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将track_script块加入instance配置块
    track_script {
        # 执行Nginx监控的脚本
		check_nginx_pid_restart
    }

    virtual_ipaddress {
        # 虚拟IP(VIP),也可扩展,可配置多个。
		192.168.12.111
    }
}
复制代码

⑤ Clone uma máquina virtual anterior como a máquina escrava (em espera) e edite keepalived.confos arquivos da máquina escrava da seguinte forma:

global_defs {
    # 自带的邮件提醒服务,建议用独立的监控或第三方SMTP,也可选择配置邮件发送。
    notification_email {
        root@localhost
    }
    notification_email_from root@localhost
    smtp_server localhost
    smtp_connect_timeout 30
    # 高可用集群主机身份标识(集群中主机身份标识名称不能重复,建议配置成本机IP)
	router_id 192.168.12.130 
}

# 定时运行的脚本文件配置
vrrp_script check_nginx_pid_restart {
    # 之前编写的nginx重启脚本的所在位置
	script "/soft/scripts/keepalived/check_nginx_pid_restart.sh" 
    # 每间隔3秒执行一次
	interval 3
    # 如果脚本中的条件成立,重启一次则权重-20
	weight -20
}

# 定义虚拟路由,VI_1为虚拟路由的标示符(可自定义名称)
vrrp_instance VI_1 {
    # 当前节点的身份标识:用来决定主从(MASTER为主机,BACKUP为从机)
	state BACKUP
    # 绑定虚拟IP的网络接口,根据自己的机器的网卡配置
	interface ens33 
    # 虚拟路由的ID号,主从两个节点设置必须一样
	virtual_router_id 121
    # 填写本机IP
	mcast_src_ip 192.168.12.130
    # 节点权重优先级,主节点要比从节点优先级高
	priority 90
    # 优先级高的设置nopreempt,解决异常恢复后再次抢占造成的脑裂问题
	nopreempt
    # 组播信息发送间隔,两个节点设置必须一样,默认1s(类似于心跳检测)
	advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 将track_script块加入instance配置块
    track_script {
        # 执行Nginx监控的脚本
		check_nginx_pid_restart
    }

    virtual_ipaddress {
        # 虚拟IP(VIP),也可扩展,可配置多个。
		192.168.12.111
    }
}
复制代码

⑥Crie um novo scriptsdiretório e escreva Nginxum script de reinicialização check_nginx_pid_restart.sh:

[root@localhost]# mkdir /soft/scripts /soft/scripts/keepalived
[root@localhost]# touch /soft/scripts/keepalived/check_nginx_pid_restart.sh
[root@localhost]# vi /soft/scripts/keepalived/check_nginx_pid_restart.sh

#!/bin/sh
# 通过ps指令查询后台的nginx进程数,并将其保存在变量nginx_number中
nginx_number=`ps -C nginx --no-header | wc -l`
# 判断后台是否还有Nginx进程在运行
if [ $nginx_number -eq 0 ];then
    # 如果后台查询不到`Nginx`进程存在,则执行重启指令
    /soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf
    # 重启后等待1s后,再次查询后台进程数
    sleep 1
    # 如果重启后依旧无法查询到nginx进程
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        # 将keepalived主机下线,将虚拟IP漂移给从机,从机上线接管Nginx服务
        systemctl stop keepalived.service
    fi
fi
复制代码

⑦O arquivo de script gravado precisa alterar o formato de codificação e conceder permissão de execução, caso contrário, a execução pode falhar:

[root@localhost]# vi /soft/scripts/keepalived/check_nginx_pid_restart.sh

:set fileformat=unix # 在vi命令里面执行,修改编码格式
:set ff # 查看修改后的编码格式

[root@localhost]# chmod +x /soft/scripts/keepalived/check_nginx_pid_restart.sh
复制代码

⑧Como a instalação keepalivedé um local de instalação personalizado, alguns arquivos precisam ser copiados para o diretório do sistema:

[root@localhost]# mkdir /etc/keepalived/
[root@localhost]# cp /soft/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@localhost]# cp /soft/keepalived/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/
[root@localhost]# cp /soft/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
复制代码

⑨Adicione keepalivedo serviço do sistema e defina para ativar a inicialização automática e teste se a inicialização está normal:

[root@localhost]# chkconfig keepalived on
[root@localhost]# systemctl daemon-reload
[root@localhost]# systemctl enable keepalived.service
[root@localhost]# systemctl start keepalived.service

其他命令:
systemctl disable keepalived.service # 禁止开机自动启动
systemctl restart keepalived.service # 重启keepalived
systemctl stop keepalived.service # 停止keepalived
tail -f /var/log/messages # 查看keepalived运行时日志
复制代码

⑩Por fim, teste VIPse faz efeito, verificando se a máquina virtual foi montada com sucesso IP:

[root@localhost]# ip addr
复制代码

Na figura acima, pode-se ver claramente que a máquina virtual foi montada com sucesso, mas a máquina virtual não será montada em IPoutra máquina . Somente quando a máquina principal ficar offline, a máquina escrava ficará online e assumirá o controle . Por fim, teste se a rede externa consegue se comunicar normalmente, ou seja, diretamente em :192.168.12.130IP192.168.12.130VIPVIPWindowsping VIP

Quando a VIPcomunicação externa é passada, ela também pode Pingser comunicada normalmente, o que significa que a IPconfiguração virtual foi bem-sucedida.

Teste de alta disponibilidade do Nginx

   Após as etapas acima, keepalivedo VIPmecanismo foi construído com sucesso. Na última etapa, várias coisas foram feitas principalmente:

  • 1. NginxMontado para a máquina implantada VIP.
  • Em segundo lugar, através keepaliveddo estabelecimento de um hot backup de máquina dupla mestre-escravo.
  • Em terceiro lugar, através keepalivedda realização do Nginxreinício do tempo de inatividade.

Como não há nome de domínio na frente, a server_nameconfiguração inicial é a máquina atual IP, portanto, nginx.confa configuração precisa ser ligeiramente alterada:

sever{
    listen    80;
    # 这里从机器的本地IP改为虚拟IP
	server_name 192.168.12.111;
	# 如果这里配置的是域名,那么则将域名的映射配置改为虚拟IP
}
复制代码

Finalmente, vamos experimentar o efeito:

No processo acima, primeiro inicie keepalived、nginxos serviços respectivamente e, em seguida, nginxsimule Nginxa situação de inatividade parando manualmente. Depois de um tempo, verifique o processo em segundo plano novamente e descobriremos que nginxele ainda está ativo.

A partir desse processo, não é difícil descobrir que a função de reinicialização automática após o tempo de inatividade keepalivedfoi realizada para nós Nginx, então vamos simular a situação quando o servidor falha:

No processo acima, fechamos manualmente keepalivedo serviço para simular a falha de energia da máquina, danos ao hardware etc. (porque a falha de energia da máquina = o keepalivedprocesso no host desaparece) e, em seguida, verificamos IPas informações da máquina novamente , é óbvio que podemos ver VIPDesaparecido!

Agora mude para outra máquina: 192.168.12.130dê uma olhada na situação:

Neste momento, descobriremos que 192.168.12.129depois que o host cai, o VIP muda automaticamente do host para o escravo 192.168.12.130e, nesse momento, a solicitação do cliente acabará chegando a 130esta máquina Nginx.

No final, após a Keepalivedimplementação do hot backup mestre-escravo Nginx, o sistema de aplicativos pode fornecer aos usuários 7x24serviços por hora, independentemente de encontrar várias falhas, como tempo de inatividade on-line ou falha de energia na sala do computador.

Quatorze, otimização de desempenho do Nginx

   A extensão do artigo aqui é bastante longa. Finalmente, vamos falar sobre Nginxa otimização de desempenho. O principal é falar brevemente sobre os itens de otimização com maior rendimento. Não vou expandir a descrição aqui. Afinal, existem muitos razões para afetar o desempenho. Por exemplo, rede, hardware do servidor, sistema operacional, serviço de back-end, programa em si, serviço de banco de dados, etc. Ajuste de desempenho" .

Otimização 1: Abra a configuração de conexão longa

   Normalmente o Nginx atua como um serviço de proxy e é responsável por distribuir as requisições dos clientes, por isso é recomendado habilitar HTTPconexões longas para que os usuários possam reduzir o número de handshakes e diminuir a perda do servidor, conforme abaixo:

upstream xxx {
    # 长连接数
    keepalive 32;
    # 每个长连接提供的最大请求数
    keepalived_requests 100;
    # 每个长连接没有新的请求时,保持的最长时间
    keepalive_timeout 60s;
}
复制代码

Otimização 2. Habilitar a tecnologia de cópia zero

   O conceito de cópia zero aparece na maioria dos middlewares com desempenho relativamente bom, como Kafka、Nettyetc., e Nginxa tecnologia de cópia zero de dados também pode ser configurada no middleware, como segue:

sendfile on; # 开启零拷贝机制
复制代码

A diferença entre o mecanismo de leitura de cópia zero e o mecanismo de leitura de recurso tradicional:

  • Maneira tradicional: hardware --> kernel --> espaço do usuário --> espaço do programa --> espaço do kernel do programa --> soquete de rede
  • Método de cópia zero: hardware --> kernel --> espaço do kernel do programa --> soquete de rede

A partir da comparação do processo acima, é fácil ver a diferença de desempenho entre os dois.

Otimização 3. Abra o mecanismo de co-entrega sem atraso ou multipacote

NginxExistem dois parâmetros-chave de desempenho em , ou seja    , tcp_nodelay、tcp_nopusho método de abertura é o seguinte:

tcp_nodelay on;
tcp_nopush on;
复制代码

TCP/IPO protocolo usa o algoritmo Nagle por padrão, ou seja, no processo de transmissão de dados da rede, cada pacote de dados não será enviado imediatamente, mas aguardará um período de tempo e combinará os seguintes pacotes de dados em um datagrama. embora esse algoritmo melhore a taxa de transferência da rede, o desempenho em tempo real é reduzido.

Portanto, seu projeto é uma aplicação altamente interativa, então você pode habilitar manualmente tcp_nodelaya configuração, de forma que todo pacote de dados enviado pela aplicação ao kernel seja enviado imediatamente. Mas isso gerará um grande número de TCPcabeçalhos de pacotes e aumentará a sobrecarga da rede.

Pelo contrário, o negócio de alguns projetos não requer dados em tempo real, mas busca maior rendimento. Então você pode habilitar o tcp_nopushitem de configuração. Esta configuração é semelhante ao significado de "plugue". Primeiro, conecte a conexão para que Os dados ainda não serão enviados e serão enviados após a remoção do plugue. Depois de definir esta opção, o kernel tentará unir pequenos pacotes de dados em um grande pacote de dados (um MTU) e enviá-lo.

Claro, se depois de um certo período de tempo (geralmente 200ms), o kernel ainda não tiver acumulado uma MTUcerta quantia, ele também deve enviar os dados existentes, caso contrário, será sempre bloqueado.

tcp_nodelay、tcp_nopushOs dois parâmetros são "mutuamente exclusivos", caso a aplicação persiga velocidade de resposta, recomenda-se habilitar tcp_nodelayo parâmetro, como IM, financeiro e outros tipos de projetos. Para aplicações que buscam throughput, recomenda-se habilitar tcp_nopushparâmetros, como sistema de agendamento, sistema de relatórios, etc.

Observação:
tcp_nodelayGeralmente, deve ser usado quando o modo de conexão longa está ativado.
tcp_nopushOs parâmetros devem ser ativados sendfileantes de serem usados.

Otimização 4. Ajustar o Processo de Trabalho do Trabalhador

   NginxApós a inicialização, apenas um Workerprocesso de trabalho será aberto por padrão para lidar com as solicitações do cliente, e podemos iniciar o número correspondente de processos de trabalho de acordo com o número de núcleos de CPU da máquina, para melhorar o suporte geral à simultaneidade, da seguinte forma:

# 自动根据CPU核心数调整Worker进程数量
worker_processes auto;
复制代码

8Tudo bem se o número máximo de processos de trabalho for 1 e 8não haverá mais melhorias de desempenho após 1.

Ao mesmo tempo, você também pode ajustar ligeiramente o número de identificadores de arquivo que cada processo de trabalho pode abrir:

# 每个Worker能打开的文件描述符,最少调整至1W以上,负荷较高建议2-3W
worker_rlimit_nofile 20000;
复制代码

O kernel do sistema operacional ( kernel) usa descritores de arquivo para acessar arquivos. Seja abrindo, criando, lendo ou gravando arquivos, é necessário usar descritores de arquivo para especificar o arquivo a ser operado. Portanto, quanto maior o valor, ele representa a Quanto mais arquivos o processo puder operar (mas não pode exceder o limite do kernel, o 3.8Wlimite superior é recomendado no máximo).

Otimização 5. Ligue o mecanismo de afinidade da CPU

   Amigos que estão familiarizados com programação concorrente sabem que o número de processos/threads geralmente excede em muito o número de núcleos de CPU no sistema, porque o princípio de execução do sistema operacional é essencialmente usar o mecanismo de comutação de fatia de tempo, ou seja, um núcleo de CPU estará em vários processos. A alternância frequente entre eles causa uma grande perda de desempenho.

O mecanismo de afinidade da CPU refere-se à Nginxvinculação de cada processo de trabalho a um núcleo de CPU fixo, reduzindo assim a sobrecarga de tempo e o consumo de recursos causados ​​pela troca de CPU. O método de abertura é o seguinte:

worker_cpu_affinity auto;
复制代码

Otimização 6. Abra o modelo epoll e ajuste o número de conexões simultâneas

   Foi mencionado logo no início: Nginx、Redistodos os programas são implementados com base no modelo de multiplexação, mas o modelo de multiplexação original select/pollpode monitorar apenas 1024o máximo de uma conexão e epollpertence à select/pollversão aprimorada da interface, portanto, usar esse modelo pode melhorar Workerdesempenho em grande medida , como segue:

events {
    # 使用epoll网络模型
    use epoll;
    # 调整每个Worker能够处理的连接数上限
    worker_connections  10240;
}
复制代码

select/poll/epollO modelo não será elaborado aqui e será analisado em detalhes nos seguintes artigos do modelo IO.

Quinze, coloque no final

   Até agora, Nginxa maior parte do conteúdo foi explicada. Em relação ao conteúdo de otimização de desempenho da última seção, de fato, a separação dinâmica e estática, buffer de alocação, cache de recursos, anti-leeching, compactação de recursos, etc. mencionados anteriormente também podem ser resumido como Uma solução para otimização de desempenho.

Acho que você gosta

Origin blog.csdn.net/weixin_37855495/article/details/130082400
Recomendado
Clasificación