宝塔面板配置 Nginx Cache 缓存教程
基础教程
2024-05-17 17:24
1637
- 系统环境:ubuntu 22.04
- 宝塔面板:7.9.8
- Nginx :1.18
- PHP :7.4
- Mysql :8.0
注:默认宝塔安装的 nginx 已经编译了 nginx cache 和 nginx purge 相关模块,无需额外编译安装模块。
操作教程
添加下方配置到 nginx 配置文件的 http {…} 段落中
#http {...}
fastcgi_cache_path /www/wwwroot/www.yourname.com/wp-content/cache/nginx-cache levels=1:2 keys_zone=yourname:400m max_size=4g inactive=72h use_temp_path=off;#此处设置缓存名
fastcgi_cache_key "$scheme$request_method$host$request_uri";
- fastcgi_cache_path /www/…/nginx-cache 缓存路径,可以随便设定。
- levelslevels=1:2 缓存目录层级,保持默认即可。
- keys_zone=yourname:400m 缓存区域名 yourname,后面的 :400m 是缓存键值可用内存空间。
- max_size=4g 缓存最大占用磁盘空间。
- inactive=72h 缓存过期时间。
- use_temp_path=off 禁用缓存临时存储,直接写入到指定位置,避免多磁盘分区跨区写入造成IO消耗。
如果当前主机有其他站点需要 nginx 缓存,那么第二个站点只需添加上方配置到 http {…} 段落中,然后修改第一行 fastcgi_cache_path、keys_zone 这两项的值即可,最后并把第二行 fastcgi_cache_key 这行注释掉。
参考案例
#添加到网站配置文件顶部
#http {...}
fastcgi_cache_path /www/wwwroot/www.asiayun.com/wp-content/cache/nginx-cache levels=1:2 keys_zone=yourname:400m max_size=4g inactive=72h use_temp_path=off;#此处设置缓存名
fastcgi_cache_key "$scheme$request_method$host$request_uri";
server
{
listen 80 reuseport;
listen 443 ssl http2 reuseport;
listen [::]:443 ssl http2 reuseport;
listen [::]:80 reuseport;
server_name www.asiayun.com asiayun.com;
index index.php index.html index.htm default.php default.htm default.html;
root /wwww/wwwroot/www.asiayun.com;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
ssl_certificate /www/server/panel/vhost/cert/www.asiayun.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/www.asiayun.com/privkey.pem;
ssl_early_data on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#引用重定向规则,注释后配置的重定向代理将无效
include /www/server/panel/vhost/nginx/redirect/www.asiayun.com/*.conf;
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
#error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
#include enable-php-74.conf;#重点!注销宝塔默认配置!
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/www.asiayun.com.conf;
#REWRITE-END
************* 下方省略 **************
将下面的内容添加到宝塔网站设置的伪静态规则中,需修改下方规则中的 asiayun 对应上面你设定的 keys_zone 值。
#server {...}
set $skip_cache 0;
#如果请求方式为 POST 则绕过缓存
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
#如果请求链接含下方内容则绕过缓存
if ($request_uri ~* "/wp-admin/|/denglu/|/checkout/|/my-account/|/cart/|/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.(xml|xsl)|[a-z0-9_-]+-sitemap([0-9]+)?.(xml|xsl)") {
set $skip_cache 1;
}
#如果携带 cookie 包含下方内容则跳过
if ($http_cookie ~* "comment_author|comment_|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpressuser_|wordpresspass_|wordpress_sec_|wordpress_logged_in_|woocommerce_items_in_cart|yith_wcwl_products") {
set $skip_cache 1;
}
#添加可以绕过缓存的终端IP地址
#if ($remote_addr ~* "123.123.123..*|10.10.10..*") {
# set $skip_cache 1;
#}
location ~ [^/]\.php(/|$) {
include enable-php-74.conf; #根据你的PHP版本修改
fastcgi_cache yourname; #此处设置缓存名
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache_valid 200 301 302 304 72h;
fastcgi_cache_use_stale error timeout updating invalid_header http_500 http_503;
fastcgi_cache_min_uses 1;
fastcgi_cache_lock on;
fastcgi_hide_header Pragma;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
add_header X-Nginx-Cache "$upstream_cache_status";
add_header Last-Modified $date_gmt;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
etag on;
}
location ~ /purge(/.*) {
allow 127.0.0.1; #允许本机请求清除缓存
#allow 10.10.10.0/24;
#allow fd00:10::/24;
deny all; #除上面允许的IP地址之外,其他IP地址请求一律拒绝。
fastcgi_cache_purge asiayun "$scheme$request_method$host$1";#此处设置缓存名
}
#设置js、css等静态文件缓存时间30天
location ~* \.(css|js|pdf)$ {
access_log off;
log_not_found off;
add_header Cache-Control "public, must-revalidate, proxy-revalidate, immutable, max-age=2592000, stale-while-revalidate=86400, stale-if-error=604800";
expires 30d;
}
#设置jpg、png等图片静态文件缓存时间365天
location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|webp|avif|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
access_log off;
log_not_found off;
add_header Cache-Control "public, must-revalidate, proxy-revalidate, immutable, max-age=31536000, stale-while-revalidate=86400, stale-if-error=604800";
expires 365d;
}
#禁止缓存 robots.txt
location = /robots.txt {
access_log off;
log_not_found off;
add_header Cache-Control "no-cache, no-store, must-revalidate, max-age=0";
expires -1;
}
#禁止缓存 xml 网站地图
location ~* \.(xml|xsl)$ {
access_log off;
log_not_found off;
add_header Cache-Control "no-cache, no-store, must-revalidate, max-age=0";
expires -1;
}
#禁止缓存 wp-cron.php 定时任务
location /wp-cron.php {
add_header Cache-Control "no-cache, no-store, must-revalidate, max-age=0";
expires -1;
}
#此处是我用到的webp图片兼容跳转规则,你们一般用不到可以删除
location ~* ^/?wp-content/uploads/.*\.(?:jpg|jpeg|png)$ {
if ($http_accept !~* "webp"){
return 301 https://r2.asiayun.com$request_uri;
break;
}
return 301 https://webp.asiayun.com$request_uri;
break;
}
#此处是 Rank Math 插件的 Sitemaps 重写规则,如果没有安装这个插件也可以删除
# START Nginx Rewrites for Rank Math Sitemaps
rewrite ^/sitemap_index.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
rewrite ^/([a-z]+)?-sitemap\.xsl$ /index.php?xsl=$1 last;
# END Nginx Rewrites for Rank Math Sitemaps
#此处是 WordPress 默认的伪静态规则
location / {
try_files $uri $uri/ /index.php?$args;
}
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
由于 nginx 缓存没有预生成缓存功能,需要通过访问请求触发生成缓存,所以下面给出个批量预生成缓存的方法。
添加下方命令到宝塔面板定时任务中,任务类型为 shell 脚本。
下方命令的意思是通过 wget 访问站点地图 sitemap.xml 内的所有链接,从而达到生成 nginx 缓存的目的。
wget --quiet https://www.asiayun.com/product_cat-sitemap.xml --output-document - | egrep -o "https?://[^<]+" | wget --output-document=/dev/null -i - >/dev/null 2>&1