Nginx에서 sendfile을 언제 사용합니까?


12

우리는이 설정 nginx.conf을 꽤 오랫동안 가지고 있습니다.

sendfile on;

파일을 업데이트하고 /js/main.js브라우저 https://test.com/js/main.js?newrandomtimestamp 에서 액세스 할 때 브라우저 에서 완전히 새로 고침 (캐시 지우기)하지 않으면 이전 버전이로드됩니다.

그러나 sendfile에서 설정을 변경하면; 파일을 보내려면; 브라우저는 업데이트 된 파일의 올바른 버전을로드합니다.

프로덕션 웹 서버의 경우 sendfile을 사용해야합니다. 또는 sendfile off ;? sendfile이 켜져 있으면; (더 나은 캐싱의 이유? 더 빠른 성능?) 위에서 언급 한 문제를 해결하는 방법이 필요합니까?

아래는 nginx.conf프로덕션 서버에 있으며 버전 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;
}

작업을보다 쉽게하기 위해 프로덕션 서버에 새 파일을 배포 할 때마다 nginx를 다시 시작해야합니까? nginx를 다시 시작하지 않으려면 nginx 캐시를 지우려면 어떻게해야합니까? (sendfile이 켜져 있고 캐시와 관련이 있다고 가정)
forestclown

nginx는 가상 상자와 같은 일종의 가상 환경에 있습니까?
Alexey Ten

프로덕션 서버는 Amazon EC2에 있습니다
forestclown

sendfileVirtualBox 드라이브 에 대한 몇 가지 버그 보고서가 있습니다 (예 : virtualbox.org/ticket/819 ). 아마존에도 비슷한 문제가있을 수 있습니다.
Alexey Ten

이 내부 캐시에 도달 할 때 open_file_cache의 구성 설정을 확인하십시오. 완전히 비활성화하거나 TTL (open_file_cache_valid)을 줄일 수 있습니다. 자세한 내용은 여기를 참조하십시오 : nginx.org/en/docs/http/… Virtualbox 와 관련된 언급 된 문제는 특정 파일 시스템 VBOXSF 때문이지만 여기서는 그렇지 않습니다. 다른 알려진 문제는 여기에없는 NFS 파일 시스템과 연결되어 있습니다.
Jens Bradler

답변:


1

응용 프로그램 레벨에서 파일 캐싱 문제점에 대한 솔루션이있을 수 있습니다. 그것은의 잘 알려진 자바 스크립트 개발 세계 문제. 솔루션은 일반적으로 "출력 해싱"과 같은 것으로 불립니다.

기본 아이디어는 파일 이름에 파일 내용의 해시를 추가하여 파일이 "신규"파일로 간주되어 캐시에서 찾을 수 없도록하는 것입니다.

Angular는 빌드 타임에 수행합니다 (참조 --outputHashing).


1

... 브라우저에서 완전 새로 고침 (캐시 지우기)을 수행하지 않는 한.

이것은 그 자체로 "문제"가 클라이언트 측에 있다는 명백한 징후입니다.

sendfile 캐싱과는 아무 관련이 없습니다. NGINX가 파일을 버퍼링 / 읽는 방법 (콘텐츠를 네트워크 "슬롯"에 직접 넣거나 먼저 내용을 버퍼링하려고 시도).

합리적인 설명은 특정 브라우저가 ?newrandomtimestamp값이없는 매개 변수로 삭제 되므로 example.com?blah및에 대해 동일한 캐시 된 리소스를로드한다는 것 example.com?boo입니다.

당신이 그것을 시도한다면, https://example.com/js/main.js?v=newrandomtimestamp계획 매번 새로운 내용을 제공 해야합니다 .


0

csn은 또한이 파일을 캐싱에서 제외를 사용합니다.

 location updater/serversettings.xml {
        expires -1;
        add_header 'Cache-Control' 'no-store, no-cache, 
 must-revalidate, proxy-revalidate, max-age=0';
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.