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 3d4f7518e04e9
nesse 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
Parece que você está lidando com
try_files
problemas de desempenho. Você pode se livrar destat
chamadas de sistema desnecessárias eliminandotry_files
de sua configuração.A
try_files
diretiva 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
stat
chamadas 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: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 .