Quando usar ou não usar o sendfile ativado / desativado no Nginx?

12

Temos essa configuração no nosso nginx.confpor um bom tempo.

sendfile on;

Quando tivermos atualizado um arquivo, por exemplo, /js/main.jse acessado pelo navegador https://test.com/js/main.js?newrandomtimestamp , ele ainda carregará a versão mais antiga, a menos que façamos uma atualização completa (limpar o cache) do navegador.

Mas quando alteramos as configurações do sendfile; enviar arquivo; o navegador carregará a versão correta do arquivo atualizado.

Para nosso servidor Web de produção, devemos usar o sendfile; ou sendfile off ;? Se sendfile ativado; é necessário (pode, por motivos de melhor armazenamento em cache? Desempenho mais rápido?), então como resolver o problema mencionado acima?

Abaixo está o nginx.confnosso servidor de produção e estamos usando a versão 1.7.5:

user  nginx;
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
worker_rlimit_nofile 51200;

events {
    use epoll;
    worker_connections  51200;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    client_max_body_size 8m;
    sendfile        on;
    keepalive_timeout  65;

    real_ip_header X-Forwarded-For;
    set_real_ip_from 0.0.0.0/0;
    large_client_header_buffers 4 32k;

    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 2;
    gzip_types text/plain application/x-javascript application/javascript text/css application/xml application/json;
    gzip_vary on;


    include /etc/nginx/conf.d/*.conf;
}
floresta
fonte
Para facilitar as coisas, devemos reiniciar o nginx toda vez que implantamos novos arquivos em nosso servidor de produção? Se não queremos reiniciar o nginx, de que outra forma podemos limpar o cache do nginx? (assumindo se sendfile
ativado
Seu nginx está em algum tipo de ambiente virtual (como o virtualbox)?
Alexey Dez
Nosso servidor de produção é na Amazon EC2
forestclown
Existem vários relatórios de erros sendfilee unidades do VirtualBox (por exemplo, virtualbox.org/ticket/819 ). Pode haver um problema semelhante com a Amazon.
Alexey Dez
Confira as definições de configuração do open_file_cache enquanto você acessa esse cache interno aqui. Você pode desativá-lo completamente ou reduzir o TTL (open_file_cache_valid). Você encontrará mais detalhes aqui: nginx.org/en/docs/http/… Os problemas mencionados relacionados ao Virtualbox são devidos ao sistema de arquivos específico VBOXSF, mas esse não deve ser o caso aqui. Outros problemas conhecidos estão vinculados ao sistema de arquivos NFS, que também não está aqui.
Jens Bradler

Respostas:

1

Pode haver uma solução para o seu problema de armazenamento em cache de arquivos no nível do aplicativo. É um problema bem conhecido no mundo do desenvolvimento JavaScript. A solução é geralmente chamada de algo como "hash de saída".

A idéia básica é adicionar um hash do conteúdo do arquivo ao nome do arquivo, para que o arquivo seja considerado "novo" e não encontrado no cache.

Angular faz isso no tempo de compilação (consulte --outputHashing:).

Anthony Mastrean
fonte
1

... a menos que façamos uma atualização completa (limpar cache) do nosso navegador.

Isso por si só, uma manifestação clara de que o "problema" está no lado do cliente.

sendfile não tem nada a ver com o armazenamento em cache, apenas como o NGINX armazena em buffer / lê o arquivo (tentando inserir o conteúdo diretamente no "slot" da rede ou em buffer o conteúdo primeiro).

A única explicação razoável é que seu navegador específico é descartado ?newrandomtimestampcomo um parâmetro sem valor; portanto, ele está carregando o mesmo recurso em cache para example.com?blahe example.com?boo.

Se você tentar, o https://example.com/js/main.js?v=newrandomtimestampesquema deve fornecer sempre novos conteúdos.

Danila Vershinin
fonte
0

você também pode usar uma exclusão do cache deste arquivo como eu faço

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
djdomi
fonte