您好,登录后才能下订单哦!
# 怎么使用nginx缓存服务器上的静态文件
## 前言
在现代Web应用中,静态文件(如图片、CSS、JavaScript等)占据了网站流量的重要部分。合理配置缓存可以显著提升网站性能,降低服务器负载,并改善用户体验。Nginx作为高性能的Web服务器和反向代理服务器,提供了强大的静态文件缓存功能。本文将详细介绍如何利用Nginx实现静态文件的高效缓存。
## 一、Nginx缓存基础概念
### 1.1 什么是静态文件缓存
静态文件缓存是指将不经常变更的静态资源存储在内存或磁盘中,当用户再次请求相同资源时,直接从缓存中响应,而不需要重新从文件系统读取或执行计算。
### 1.2 缓存带来的优势
- **提升响应速度**:缓存命中时响应时间可缩短90%以上
- **降低服务器负载**:减少磁盘I/O和CPU计算
- **节省带宽**:通过304 Not Modified响应减少数据传输
- **提高并发能力**:相同硬件配置下可服务更多用户
### 1.3 Nginx缓存类型
1. **浏览器缓存**:通过HTTP头控制客户端缓存
2. **代理缓存**:Nginx自身的缓存机制
3. **FastCGI缓存**:主要用于动态内容
4. **Memcached/Redis集成**:外部缓存系统
## 二、配置浏览器缓存
### 2.1 Expires指令
```nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
这会使匹配的文件在浏览器端缓存30天。
更现代的缓存控制方式:
location ~* \.(woff2?|ttf|eot|svg)$ {
add_header Cache-Control "max-age=31536000, immutable";
}
immutable
表示资源永远不会改变,适合版本化的静态资源。
Nginx默认会发送ETag和Last-Modified头,支持条件请求:
location /static/ {
etag on;
if_modified_since exact;
}
在http上下文中定义缓存区:
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=24h max_size=1g;
server {
location / {
proxy_cache STATIC;
proxy_cache_valid 200 1h;
proxy_cache_use_stale error timeout updating;
proxy_cache_lock on;
}
}
}
参数说明:
- levels
:缓存目录层级结构
- keys_zone
:共享内存区域名称和大小
- inactive
:不活跃缓存保留时间
- max_size
:缓存总大小限制
proxy_cache_key "$scheme$request_method$host$request_uri$cookie_lang";
location /nginx-cache-status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
proxy_cache_path /var/cache/nginx/level1 levels=1:2 keys_zone=LEVEL1:32m max_size=1g inactive=1h;
proxy_cache_path /var/cache/nginx/level2 levels=1:2 keys_zone=LEVEL2:32m max_size=10g inactive=1d;
location / {
proxy_cache LEVEL1;
proxy_cache_valid 200 302 10m;
proxy_cache LEVEL2;
proxy_cache_valid 200 302 1d;
}
使用curl
或编写脚本预先请求关键资源:
warmup_urls=(
"/style.css"
"/app.js"
"/logo.png"
)
for url in "${warmup_urls[@]}"; do
curl -s -o /dev/null "http://localhost$url"
done
方法一:使用purge模块
location ~ /purge(/.*) {
proxy_cache_purge STATIC "$scheme$request_method$host$1";
}
方法二:删除缓存文件
find /var/cache/nginx -type f -delete
sendfile on;
tcp_nopush on;
tcp_nodelay on;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
worker_rlimit_nofile 100000;
nginx -t
Cache-Control
tail -f /var/log/nginx/error.log
解决方案:
location ~ \.php$ {
proxy_cache_bypass $cookie_nocache $arg_nocache;
proxy_no_cache $cookie_nocache $arg_nocache;
}
使用版本化文件名:
<link href="/style.css?v=1.2.3" rel="stylesheet">
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:50m inactive=30d max_size=10g use_temp_path=off;
server {
listen 80;
server_name example.com;
root /var/www/html;
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
proxy_cache STATIC;
proxy_cache_valid 200 301 302 30d;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_lock on;
proxy_cache_revalidate on;
}
location / {
try_files $uri $uri/ /index.html;
}
}
}
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=EDGE:100m inactive=1h max_size=10g;
server {
location / {
proxy_pass http://origin_server;
proxy_cache EDGE;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_background_update on;
}
}
log_format cache_stats '$remote_addr - $upstream_cache_status [$time_local] '
'"$request" $status $body_bytes_sent';
server {
access_log /var/log/nginx/cache.log cache_stats;
}
设置cron任务:
0 3 * * * find /var/cache/nginx -type f -mtime +30 -delete
使用工具: - ngxtop - GoAccess - Grafana + Prometheus
合理配置Nginx静态文件缓存可以显著提升网站性能,但需要根据实际业务场景调整参数。建议在生产环境部署前进行充分的测试,并建立完善的监控机制。随着业务发展,可能需要考虑更复杂的缓存策略或引入CDN等解决方案。
记住:没有放之四海皆准的最佳配置,只有最适合您业务场景的配置方案。 “`
这篇文章涵盖了Nginx静态文件缓存的各个方面,从基础概念到高级配置,再到实战示例和运维建议。您可以根据实际需求调整配置参数,或进一步扩展某些章节的内容。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。