Nginx FastCGI 没有缓存静态文件?

Nginx FastCGI 没有缓存静态文件?

我配置了 fastCGI 来使用 NginX 进行缓存。它可以处理 .php 文件,但我无法缓存 .jpg、.mp4 等静态文件...

使用 cURL 检查时得到的信息:

curl -I http://192.168.1.223/music.php
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 07 Dec 2015 20:21:48 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.3.3
X-Cache: HIT

curl -I http://192.168.1.223/b2.jpg
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 07 Dec 2015 20:24:51 GMT
Content-Type: image/jpeg
Content-Length: 18103
Last-Modified: Mon, 07 Dec 2015 20:06:27 GMT
Connection: keep-alive
ETag: "5665e6c3-46b7"
Expires: Fri, 05 Feb 2016 20:24:51 GMT
Cache-Control: max-age=5184000
Accept-Ranges: bytes

我的 NginX 配置:

user nginx nginx;
worker_processes 1;
lock_file /run/lock/nginx.lock;


events {
    worker_connections 1024;
}

rtmp {
    server {
        listen 1935;
        application pullfromwowza {
           live on;
           pull rtmp://192.168.1.222:1935/vod;
        }
     }
}

http {
    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay off;
    keepalive_timeout 5;

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

    #gzip on;
    #gzip_static on;
    #gzip_comp_level 2;
    #gzip_disable "msie6";
    #gzip_proxied any;
    #gzip_types application/javascript application/json application/vnd.ms-fontobject application/x-font-ttf image/svg+xml #text/css text/plain text/xml;
    #gzip_vary on;

    fastcgi_cache_path /data/nginx/cache levels=1:2 keys_zone=fastcgicache:200m inactive=200m max_size=640m;
    fastcgi_cache_key $scheme$request_method$host$request_uri;
    # note: can also use HTTP headers to form the cache key, e.g.
    #fastcgi_cache_key $scheme$request_method$host$request_uri$http_x_custom_header;
    fastcgi_cache_lock on;
    fastcgi_cache_use_stale error timeout invalid_header updating http_500;
    fastcgi_cache_valid 5m;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

    index index.php;


    server {
        listen   80;

        server_name example.com;


 root /usr/local/nginx/html;
        #root /var/www/example.com;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        # example FastCGI cache exception rules
        set $fastcgi_skipcache 0;

        if ($query_string) {
            set $fastcgi_skipcache 1;
        }

    if ($http_x_custom_header) {
            set $fastcgi_skipcache 0;
        }

        if ($uri ~ "/path/matches/") {
            set $fastcgi_skipcache 1;
        }

        if ($http_cookie ~ "users_login_cookie") {
            set $fastcgi_skipcache 1;
        }

        #include /etc/nginx/conf/phpfastcgicache;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ "\.php$" {
            fastcgi_index index.php;
            if (!-f $document_root$fastcgi_script_name)
            {
                return 404;
            }
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

            # note: adds a HTTP response header "X-Cache" returning HIT/MISS/BYPASS/EXPIRED for cache use status
            add_header X-Cache $upstream_cache_status;
            fastcgi_cache fastcgicache;
            fastcgi_cache_bypass $fastcgi_skipcache;
            fastcgi_no_cache $fastcgi_skipcache;

            include /usr/local/nginx/conf/fastcgi_params;
             fastcgi_pass 127.0.0.1:9000;
     #   fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
        location ~* \.(?:manifest|appcache|html?|xml|json)$ {
  expires -1;
  # access_log logs/static.log; # I don't usually include a static log
}

# Feed
location ~* \.(?:rss|atom)$ {
  expires 1h;
  add_header Cache-Control "public";
}

# Media: images, icons, video, audio, HTC
  location ~* \.(jpg|jpeg|gif|css|png|js|ico|gz) {
            expires 60d;

           # proxy_pass http://192.168.11.11:8888;
           # proxy_redirect     off;

            #proxy_set_header   Host             $host;
           # proxy_set_header   X-Real-IP        $remote_addr;
           # proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            fastcgi_cache fastcgicache;
           # proxy_cache_key "$request_method|$host|$request_uri";
           # proxy_cache_valid 1d;
      }

# CSS and Javascript
location ~* \.(?:css|js)$ {
  expires 1y;
  access_log off;
  add_header Cache-Control "public";
}
    }
}

谢谢 !

答案1

我想完成其他答案。

说文件已缓存,因为它在磁盘上,这不是一个令人满意的答案。例如,Apache2 在提供磁盘上的静态文件时非常慢,因此对于高流量网站来说,像 nginx 或 varnish 这样的代理缓存是完全有意义的。

在 nginx 案例中,它被设计为非常高效地提供静态内容。

但您应确保已启用“sendfile on”(这是您的配置中的情况)。Senfile() 在内核级别替换了类对 read()/write(),并使文件访问非常快速。

速度足够高,性能就像内容被缓存一样。

顺便说一句,我建议你也启用 tcp_nodelay。如果没有其他预期数据,它允许 nginx 立即发送一个短 TCP 数据包。

也可以看看:

答案2

这个问题被低估了,并且在 Nginx(或 Web 服务器)社区中没有得到很好的沟通,因为每个人都复制并粘贴教程!

OP 帖子上的评论确实如此,但是@Daneel 有一个很好的答案,解决了堆栈中更深层次的问题——除了 Nginx 之外,操作系统和硬件如何响应。

实际上,这与提供静态文件更相关。毕竟,Nginx 只能以操作系统、内核、虚拟系统和硬件允许的速度“提供”磁盘上的文件……

很多教程都忘记提到,优化 Nginx 设置是不够的,为了获得一流的性能(尤其是 VPS/VM/云服务器),你还应该优化你的内核。如果有人感兴趣,你可以查看系统控制配置文件我们在 SlickStack(WordPress 的 LEMP 脚本)中使用。

另外要注意的另一个相关特性是,TMPFS这是一种尽可能利用 RAM 内存来避免磁盘 I/O 的方法……如果您正在寻求对 Nginx 和静态文件的极端优化,那么找到一个拥有出色硬件(KVM 虚拟化、NVMe SSD 驱动器、出色的操作系统/包管理)的高质量数据中心就变得更加重要,然后获得一台具有足够 RAM 的机器,以便您的系统可以尽可能地帮助 Nginx 快速传递文件。

如果您要使用 Nginx FastCGI 缓存TMPFS(从 RAM 提供文件),那么请确保您有大量可用 RAM,并在激活之前了解潜在风险,其中可能包括服务器突然崩溃或硬重启时的数据丢失,等等......

答案3

您没有从缓存中提供静态文件,因为您没有为静态文件配置任何缓存。除非您的 PHP 脚本提供该服务b2.jpg,否则您会遇到更大的问题。

相关内容