FAQ do nginx Existe uma maneira adequada de usar variáveis do nginx para tornar as seções da configuração mais curtas, usando-as como macros para fazer com que partes da configuração funcionem como modelos? ) dizendo (negrito é meu):
P: Existe uma maneira adequada de usar variáveis nginx para tornar as seções da configuração mais curtas, usando-as como macros para fazer com que partes da configuração funcionem como modelos?
R: As variáveis não devem ser usadas como macros de modelo. As variáveis são avaliadas em tempo de execução durante o processamento de cada solicitação, portanto, são bastante caras em comparação com a configuração estática simples . Usar variáveis para armazenar strings estáticas também é uma má ideia. Em vez disso, uma expansão de macro e diretivas "include" devem ser usadas para gerar configurações mais facilmente e isso pode ser feito com as ferramentas externas, por exemplo, sed + make ou qualquer outro mecanismo de modelo comum.
Por exemplo, em vez de um super longo add_header Content-Security-Policy
para melhor legibilidade, estou usando:
set $CSP "default-src 'none'";
set $CSP "${CSP}; connect-src 'self'";
set $CSP "${CSP}; script-src 'self' https://*.domain.org 'unsafe-inline' 'unsafe-eval'";
set $CSP "${CSP}; style-src 'self' https://*.domain.org 'unsafe-inline'";
set $CSP "${CSP}; img-src 'self' data: https://*.domain.org";
set $CSP "${CSP}; font-src 'self' https://*.domain.org";
## CSP closing colon.
set $CSP "${CSP};";
add_header Content-Security-Policy "$CSP";
Quanto impacto no desempenho do nginx esse uso da variável teria adequadamente? Houve algum teste/pesquisa de desempenho sobre esse assunto?
Imagine cada solicitação que você deve obter e salvar a variável da memória ou tempo de execução, quanto tempo e memória você precisa gastar? Talvez se você tiver alguns pedidos, não seja significativo, mas se você tiver tantos pedidos, será muito significativo
É como uma planície estática aberta versus um arquivo dinâmico. Não há nada mais rápido do que o arquivo simples sendo acessado diretamente.
No seu caso, você usa uma variável e a define tantas vezes. Não posso fazer benchmark usando o próprio Nginx por falta de infraestrutura, mas quero compartilhar o benchmark do script PHP dessa suíte para uma analogia com o seu caso.
Você deseja definir este texto:
com PHP você pode configurá-lo usando este código:
Mas, por alguns motivos, você deseja definir várias vezes antes de definir a saída real. Então o código ficará assim:
Eu executo o primeiro código usando um loop por 10 milhões de vezes e leva 0,0725793838500982 segundos e o segundo código leva 1,049282026290894 segundos . Assim, o segundo código demora cerca de 15 vezes mais devagar . E mostra apenas um benchmark de tempo de solicitação, não memória, CPU, disco ou qualquer outro benchmark de uso de recursos. talvez o segundo código leve muito mais recursos do que o primeiro também.
Como acontece no PHP, também acontecerá com o tempo de execução do Nginx. Então, como nos documentos do Nginx, o uso de variáveis para armazenar strings estáticas é caro e também uma má idéia . Se for igual à analogia do PHP acima, o custo é 15 vezes mais lento
Você deve comparar sua própria configuração, porque muitos fatores de sua configuração específica afetam a desaceleração.
Portanto, primeiro configure a configuração onde o CSP desejado é definido de uma só vez.
Faça um benchmark da configuração usando, por exemplo, Siege: https://github.com/JoeDog/siege
Em seguida, defina a configuração como na sua pergunta e execute o mesmo teste de benchmark novamente.
Dessa forma, você pode obter uma resposta precisa para sua configuração.
De qualquer forma, recomendo que você construa seu arquivo de configuração usando um sistema de gerenciamento de configuração como Ansible, Chef ou Puppet. Na fonte, você pode dividir as linhas como quiser, mas o resultado final seria ideal para o nginx.