AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / server / Perguntas / 1044929
Accepted
Rohan
Rohan
Asked: 2020-12-04 22:30:50 +0800 CST2020-12-04 22:30:50 +0800 CST 2020-12-04 22:30:50 +0800 CST

Como configurar melhor o nginx para reduzir chamadas de sistema redundantes quando as APIs são chamadas?

  • 772

Eu tenho um aplicativo Laravel rodando em produção, e existem algumas APIs que usaram muito. Algo estava criando um gargalo e costumava travar nossos servidores (3 com Load Balancer). Depois de otimizar o básico em Laravel, configuração de cache, rotas, dados e assim por diante, mesmo resolvendo todos os problemas n+1, ainda estávamos tendo problemas nos horários de pico. Alguém sugeriu que executássemos o strace em um dos trabalhadores do nginx para ver o que está acontecendo no nível do sistema, então fizemos, e interessante o suficiente, existem muitas chamadas de sistema redundantes onde o nginx tenta encontrar arquivos quando as APIs são chamadas:

Parte do rastreamento:

240498 stat("/var/www/html/myProject/current/public/APIRequest/3d4f7518e04e9", 0x7ffc7ee6ff70) = -1 ENOENT (No such file or directory)
240498 stat("/var/www/html/myProject/current/public/APIRequest/3d4f7518e04e9", 0x7ffc7ee6ff70) = -1 ENOENT (No such file or directory)
240498 lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
240498 lstat("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
240498 lstat("/var/www/html", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
240498 lstat("/var/www/html/myProject", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
240498 lstat("/var/www/html/myProject/current", {st_mode=S_IFLNK|0777, st_size=48, ...}) = 0
240498 readlink("/var/www/html/myProject/current", "/var/www/html/myProject/release"..., 4095) = 48
240498 lstat("/var", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
240498 lstat("/var/www", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
240498 lstat("/var/www/html", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
240498 lstat("/var/www/html/myProject", {st_mode=S_IFDIR|0777, st_size=4096, ...}) = 0
240498 lstat("/var/www/html/myProject/releases", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
240498 lstat("/var/www/html/myProject/releases/20201202085755", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
240498 lstat("/var/www/html/myProject/releases/20201202085755/public", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0

Agora, a API é chamada com o ID 3d4f7518e04e9nesse caso e tenta percorrer os diretórios para encontrar esse arquivo. Mas não é um arquivo, é uma API. Rodamos strace por menos de 30 segundos e temos 5k dessas chamadas que não fazem sentido para mim.

Então, essas ligações são necessárias? Acho que não, mas me diga se estou errado. E se eu estiver certo, como posso configurar melhor meu nginx para que essas chamadas possam ser "capturadas a tempo" e resolvidas adequadamente. Quaisquer ideias são bem-vindas. :)

PS: Tentamos o apache com configuração semelhante também, o mesmo problema no strace aparece.

Edit: Eu simplesmente preciso de algum tipo de diretiva de localização no meu site conf para resolver isso? Estou usando o nginx conf básico dos documentos oficiais https://laravel.com/docs/8.x/deployment#nginx com mais algumas adições como:

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;

        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 16k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 4 16k;

    client_body_timeout 12;
    client_header_timeout 12;
    keepalive_timeout 15;
    send_timeout 10;

EDITAR:

location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

Eu tentei arquivos como sugerido por Danila Vershinin em uma resposta

apache-2.2 nginx laravel strace
  • 1 1 respostas
  • 209 Views

1 respostas

  • Voted
  1. Best Answer
    Danila Vershinin
    2020-12-04T23:44:56+08:002020-12-04T23:44:56+08:00

    Parece que você está lidando com try_filesproblemas de desempenho. Você pode se livrar de statchamadas de sistema desnecessárias eliminandotry_files de sua configuração.

    A try_filesdiretiva fornece um clichê simples e agradável para criar um site amigável para SEO.

    No entanto, a desvantagem dessa simplicidade vem com um custo adicional de statchamadas de sistema desnecessárias.

    Como você sabe que, por exemplo, todas as /api/URLs devem ser roteadas através do seu PHP, não há necessidade de verificar a existência de nenhum arquivo lá e você pode rotear através do seu arquivo bootstrap Laravel incondicionalmente, por exemplo:

    location /api/ {
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php-fpm/example.com.sock;
    }
    

    Além disso, em geral, você deseja ter informações de cache do NGINX sobre a existência de arquivos/diretórios. Isso pode ser feito através do open_file_cache .

    • 3

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Você pode passar usuário/passar para autenticação básica HTTP em parâmetros de URL?

    • 5 respostas
  • Marko Smith

    Ping uma porta específica

    • 18 respostas
  • Marko Smith

    Verifique se a porta está aberta ou fechada em um servidor Linux?

    • 7 respostas
  • Marko Smith

    Como automatizar o login SSH com senha?

    • 10 respostas
  • Marko Smith

    Como posso dizer ao Git para Windows onde encontrar minha chave RSA privada?

    • 30 respostas
  • Marko Smith

    Qual é o nome de usuário/senha de superusuário padrão para postgres após uma nova instalação?

    • 5 respostas
  • Marko Smith

    Qual porta o SFTP usa?

    • 6 respostas
  • Marko Smith

    Linha de comando para listar usuários em um grupo do Windows Active Directory?

    • 9 respostas
  • Marko Smith

    O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL?

    • 3 respostas
  • Marko Smith

    Como determinar se uma variável bash está vazia?

    • 15 respostas
  • Martin Hope
    Davie Ping uma porta específica 2009-10-09 01:57:50 +0800 CST
  • Martin Hope
    kernel O scp pode copiar diretórios recursivamente? 2011-04-29 20:24:45 +0800 CST
  • Martin Hope
    Robert ssh retorna "Proprietário incorreto ou permissões em ~/.ssh/config" 2011-03-30 10:15:48 +0800 CST
  • Martin Hope
    Eonil Como automatizar o login SSH com senha? 2011-03-02 03:07:12 +0800 CST
  • Martin Hope
    gunwin Como lidar com um servidor comprometido? 2011-01-03 13:31:27 +0800 CST
  • Martin Hope
    Tom Feiner Como posso classificar a saída du -h por tamanho 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich O que é um arquivo Pem e como ele difere de outros formatos de arquivo de chave gerada pelo OpenSSL? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent Como determinar se uma variável bash está vazia? 2009-05-13 09:54:48 +0800 CST

Hot tag

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve