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, cookie
ela pode ser compartilhada. Como http
os 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 cookie
compartilhados, 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, Nginx
como podemos resolver o problema entre domínios a seguir? Na verdade, é relativamente simples, nginx.conf
basta 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.conf
a configuração acima for adicionada ao arquivo, a solicitação entre domínios entrará em vigor.
HandlerInterceptorAdapter
Mas 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-endWebMvcConfigurer
.@CrossOrgin
sã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.conf
a configuração acima for adicionada ao arquivo, a solicitação entre domínios entrará em vigor.
HandlerInterceptorAdapter
Mas 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-endWebMvcConfigurer
.@CrossOrgin
sã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
X
Zhan,Y
Zhan,X
Zhan é uma forma de comprar direitos autorais e assinar autores pouco a pouco, acumulando assim uma grande quantidade de materiais de papel de parede, masY
devido a vários motivos, como fundos, Zhan<img src="X站/xxx.jpg" />
copiou diretamenteX
todos 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 X
site 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!
Nginx
A 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 Nginx
você 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. Nginx
Existe 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 semReferer
campos é aceita.HTTP
blocked
: Indica que o acesso é permitidohttp://
ouhttps//
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, Nginx
o 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_module
para 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
referers
informaçõ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 Nginx
fazer 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 |
Nginx Defina o tempo máximo de espera quando a solicitação for lida pelo servidor de back-end |
proxy_send_timeout |
Defina Nginx o 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_timeout
esses 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
Nginx
configuração como camada de gateway é ajustada apenas para um nível que possa "acomodar arquivos grandes" na transferência.
Claro,Nginx
ele também pode ser usado como servidor de arquivos, mas precisa usar um módulo especial de terceirosnginx-upload-module
. Se não houver muitas funções para upload de arquivos no projeto, é recomendável construí-Nginx
lo. 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 Nginx
configurar apenas no meio HTTP
, sendo muitas vezes necessário monitorar as requisições de porta, mas conforme mencionado no 443
artigo 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 Nginx
como um gateway, então o certificado Nginx
também precisa ser configurado em , e então falar brevemente sobre SSL
o processo de configuração do certificado:
- ① Primeiro, vá para a organização CA ou solicite o
SSL
certificado correspondente no console da nuvem e baixeNginx
o 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,.crt
que é.pem
um 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-encoded
O 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
Nginx
novocertificate
diretório no diretório e carregue o certificado/chave privada baixado e outros arquivos para o diretório. - ④ Por fim, modifique
nginx.conf
o 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 HTTPS
uma 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 Nginx
a 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 Nginx
alta disponibilidade .
Em seguida, o mecanismo será adotado para alcançar
keepalived
alta disponibilidade. Não significa apenas membros, mas significa , ou seja, virtual .VIP
Nginx
VIP
Virtual IP
IP
keepalived
No 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、Tomcat
por etc. será usado para obter alta disponibilidade de aplicativos de nó único.keepalived
VIP
Keepalived + script de reinicialização + construção de espera ativa de máquina dupla
①Primeiro crie um diretório correspondente e baixe keepalived
o pacote de instalação (código de extração: s6aq) para Linux
ele 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 keepalived
diretó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.conf
o 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.conf
os 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 scripts
diretório e escreva Nginx
um 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 keepalived
o 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 VIP
se 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
IP
outra 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.130
IP
192.168.12.130
VIP
VIP
Windows
ping VIP
Quando a VIP
comunicação externa é passada, ela também pode Ping
ser comunicada normalmente, o que significa que a IP
configuração virtual foi bem-sucedida.
Teste de alta disponibilidade do Nginx
Após as etapas acima, keepalived
o VIP
mecanismo foi construído com sucesso. Na última etapa, várias coisas foram feitas principalmente:
- 1.
Nginx
Montado para a máquina implantadaVIP
. - Em segundo lugar, através
keepalived
do estabelecimento de um hot backup de máquina dupla mestre-escravo. - Em terceiro lugar, através
keepalived
da realização doNginx
reinício do tempo de inatividade.
Como não há nome de domínio na frente, a server_name
configuração inicial é a máquina atual IP
, portanto, nginx.conf
a 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、nginx
os serviços respectivamente e, em seguida,nginx
simuleNginx
a situação de inatividade parando manualmente. Depois de um tempo, verifique o processo em segundo plano novamente e descobriremos quenginx
ele 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 keepalived
foi realizada para nós Nginx
, então vamos simular a situação quando o servidor falha:
No processo acima, fechamos manualmente
keepalived
o serviço para simular a falha de energia da máquina, danos ao hardware etc. (porque a falha de energia da máquina = okeepalived
processo no host desaparece) e, em seguida, verificamosIP
as informações da máquina novamente , é óbvio que podemos verVIP
Desaparecido!
Agora mude para outra máquina: 192.168.12.130
dê uma olhada na situação:
Neste momento, descobriremos que
192.168.12.129
depois que o host cai, o VIP muda automaticamente do host para o escravo192.168.12.130
e, nesse momento, a solicitação do cliente acabará chegando a130
esta máquinaNginx
.
No final, após a Keepalived
implementação do hot backup mestre-escravo Nginx
, o sistema de aplicativos pode fornecer aos usuários 7x24
serviç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 Nginx
a 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 HTTP
conexõ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、Netty
etc., e Nginx
a 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
Nginx
Existem dois parâmetros-chave de desempenho em , ou seja , tcp_nodelay、tcp_nopush
o método de abertura é o seguinte:
tcp_nodelay on;
tcp_nopush on;
复制代码
TCP/IP
O 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_nodelay
a 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 deTCP
cabeç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_nopush
item 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 umaMTU
certa quantia, ele também deve enviar os dados existentes, caso contrário, será sempre bloqueado.
tcp_nodelay、tcp_nopush
Os dois parâmetros são "mutuamente exclusivos", caso a aplicação persiga velocidade de resposta, recomenda-se habilitar tcp_nodelay
o parâmetro, como IM
, financeiro e outros tipos de projetos. Para aplicações que buscam throughput, recomenda-se habilitar tcp_nopush
parâmetros, como sistema de agendamento, sistema de relatórios, etc.
Observação:
①tcp_nodelay
Geralmente, deve ser usado quando o modo de conexão longa está ativado.
②tcp_nopush
Os parâmetros devem ser ativadossendfile
antes de serem usados.
Otimização 4. Ajustar o Processo de Trabalho do Trabalhador
Nginx
Após a inicialização, apenas um Worker
processo 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;
复制代码
8
Tudo bem se o número máximo de processos de trabalho for 1 e8
nã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, o3.8W
limite 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 à Nginx
vinculaçã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、Redis
todos os programas são implementados com base no modelo de multiplexação, mas o modelo de multiplexação original select/poll
pode monitorar apenas 1024
o máximo de uma conexão e epoll
pertence à select/poll
versão aprimorada da interface, portanto, usar esse modelo pode melhorar Worker
desempenho em grande medida , como segue:
events {
# 使用epoll网络模型
use epoll;
# 调整每个Worker能够处理的连接数上限
worker_connections 10240;
}
复制代码
select/poll/epoll
O modelo não será elaborado aqui e será analisado em detalhes nos seguintes artigos do modelo IO.
Quinze, coloque no final
Até agora, Nginx
a 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.