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.