我配置了 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 数据包。
也可以看看:
- sendfile() 函数的使用:http://man7.org/linux/man-pages/man2/sendfile.2.html
- sendfile、tcp_nodelay 和 tcp_nopush 指令:https://t37.net/nginx-optimization-understanding-sendfile-tcp_nodelay-and-tcp_nopush.html
答案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
,否则您会遇到更大的问题。