Nginx缓存目录为空
Nginx cache directory is empty
我在 Ubuntu 16.04 (xenial) 上使用 Nginx v1.17.6
作为 缓存反向代理 侦听 443 并将请求代理到 backend
上游。其他 example_ip 使用与此服务器相同的配置。 backend
服务器在端口 888 上相互通信,该端口用于通过 负载平衡器 (LB) 在它们之间交换缓存。 (LB 也用于对文件服务器的代理请求)。
这是我的 nginx.conf :
user www-data www-data;
worker_processes 8;
pid /run/nginx.pid;
worker_rlimit_nofile 3000;
thread_pool one threads=16 max_queue=1000;
http {
##
# Basic Settings
##
map_hash_bucket_size 128;
sendfile on;
tcp_nopush off;
tcp_nodelay on;
keepalive_timeout 5;
server_tokens off;
add_header X-Content-Type-Options nosniff;
client_body_buffer_size 0;
client_max_body_size 1;
client_header_buffer_size 1k;
large_client_header_buffers 2 1k;
include /etc/nginx/mime.types;
proxy_cache_path /mnt/sdc keys_zone=hard_cache:2048m levels=1:2 inactive=12h
max_size=100G use_temp_path=off;
proxy_cache_path /mnt/sdb keys_zone=ssd_cache:2048m levels=1:2 inactive=12h
max_size=150G use_temp_path=off;
map $request_uri $cache {
~^\/v4\/4a35e4a4o\/avatar\/.*$ ssd_cache;
~^\/v4\/82ca5e4ai\/succh\/.*$ ssd_cache;
~^\/v4\/115a5e4ac\/sucrt1\/.*$ ssd_cache;
~^\/v4\/8766e82ca5e4v\/mc\/.*$ ssd_cache;
~^\/v4\/66e82ca5e4n\/luctw\/.*$ ssd_cache;
~^\/v4\/23e82ca5e4d\/luc1tq\/.*$ hard_cache;
~^\/v4\/9266e82ca5e4s\/lcuq\/.*$ hard_cache;
~^\/v4\/32e82ca5e4l\/euid\/.*$ hard_cache;
~^\/v4\/4466e82ca5e4b\/edjp\/.*$ hard_cache;
}
upstream backend {
hash $request_uri consistent;
server example_ip1:888 max_fails=50;
server example_ip2:888 max_fails=50;
server example_ip3:888 max_fails=50;
server example_ip4:888 max_fails=50;
}
server {
listen *:443 ssl backlog=2048 reuseport ;
ssl_trusted_certificate ....;
ssl_certificate .....;
ssl_certificate_key ....;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 3;
proxy_buffering on;
}
}
server {
listen *:888 backlog=4096 reuseport;
location / {
proxy_set_header Host $host;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_buffering on;
proxy_buffer_size 1024k;
proxy_buffers 4 8m;
proxy_cache $cache;
aio threads=one;
directio 2m;
aio_write on;
proxy_pass http://LB-ip-address;
proxy_max_temp_file_size 0;
proxy_cache_valid 200 10d;
proxy_cache_valid 500 501 502 503 504 505 1s;
proxy_cache_valid 401 402 403 404 1s;
proxy_connect_timeout 15;
proxy_cache_min_uses 1;
}
}
log_format default_format'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time ucs="$upstream_cache_status" '
access_log /var/log/nginx/access.log default_format;
error_log /var/log/nginx/error.log;
}
我已经在 /mnt/sdb
和 /mnt/sdc
上安装了一个磁盘,它被 proxy_cache_path
指令用于缓存存储。
查看 access.log 文件时,upstream_cache_status
为 "-"-"-"-"-"-"-"-54= 或 "MISS" 但没有任何东西获得 "HIT" 状态。
proxy_buffering
指令也是 on
基于 this 答案。
此外,我已经将chown -R www-data:www-data
和chmod -R 776
设置为/mnt/sdb
和/mnt/sdc
,但这些目录中没有任何内容(列出[=的内容25=] 例如):
root@cdn:/etc/nginx# ls -lart /mnt/sdb
total 24
drwxr-xr-x 9 root root 4096 Dec 5 02:52 ..
drwxrw-rw- 2 www-data www-data 16384 Dec 7 05:35 lost+found
drwxrw-rw- 3 www-data www-data 4096 Dec 7 05:35 .
此配置适用于 v1.14.0 并进行缓存!
This是两个相同配置的版本差异。
总结: ssl 卸载正确,后端服务器(文件服务器)的响应正确返回给用户,但缓存没有发生!!
谢谢! :)
问题是因为 Set-Cookie
header。添加这些指令以忽略 Set-Cookie
header 后,缓存成功运行:
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
在nginx v.1.14.0中,没有Set-Cookie header,但它有效,这很奇怪!
我在 Ubuntu 16.04 (xenial) 上使用 Nginx v1.17.6
作为 缓存反向代理 侦听 443 并将请求代理到 backend
上游。其他 example_ip 使用与此服务器相同的配置。 backend
服务器在端口 888 上相互通信,该端口用于通过 负载平衡器 (LB) 在它们之间交换缓存。 (LB 也用于对文件服务器的代理请求)。
这是我的 nginx.conf :
user www-data www-data;
worker_processes 8;
pid /run/nginx.pid;
worker_rlimit_nofile 3000;
thread_pool one threads=16 max_queue=1000;
http {
##
# Basic Settings
##
map_hash_bucket_size 128;
sendfile on;
tcp_nopush off;
tcp_nodelay on;
keepalive_timeout 5;
server_tokens off;
add_header X-Content-Type-Options nosniff;
client_body_buffer_size 0;
client_max_body_size 1;
client_header_buffer_size 1k;
large_client_header_buffers 2 1k;
include /etc/nginx/mime.types;
proxy_cache_path /mnt/sdc keys_zone=hard_cache:2048m levels=1:2 inactive=12h
max_size=100G use_temp_path=off;
proxy_cache_path /mnt/sdb keys_zone=ssd_cache:2048m levels=1:2 inactive=12h
max_size=150G use_temp_path=off;
map $request_uri $cache {
~^\/v4\/4a35e4a4o\/avatar\/.*$ ssd_cache;
~^\/v4\/82ca5e4ai\/succh\/.*$ ssd_cache;
~^\/v4\/115a5e4ac\/sucrt1\/.*$ ssd_cache;
~^\/v4\/8766e82ca5e4v\/mc\/.*$ ssd_cache;
~^\/v4\/66e82ca5e4n\/luctw\/.*$ ssd_cache;
~^\/v4\/23e82ca5e4d\/luc1tq\/.*$ hard_cache;
~^\/v4\/9266e82ca5e4s\/lcuq\/.*$ hard_cache;
~^\/v4\/32e82ca5e4l\/euid\/.*$ hard_cache;
~^\/v4\/4466e82ca5e4b\/edjp\/.*$ hard_cache;
}
upstream backend {
hash $request_uri consistent;
server example_ip1:888 max_fails=50;
server example_ip2:888 max_fails=50;
server example_ip3:888 max_fails=50;
server example_ip4:888 max_fails=50;
}
server {
listen *:443 ssl backlog=2048 reuseport ;
ssl_trusted_certificate ....;
ssl_certificate .....;
ssl_certificate_key ....;
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500;
proxy_connect_timeout 3;
proxy_buffering on;
}
}
server {
listen *:888 backlog=4096 reuseport;
location / {
proxy_set_header Host $host;
proxy_set_header User-Agent $http_user_agent;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_buffering on;
proxy_buffer_size 1024k;
proxy_buffers 4 8m;
proxy_cache $cache;
aio threads=one;
directio 2m;
aio_write on;
proxy_pass http://LB-ip-address;
proxy_max_temp_file_size 0;
proxy_cache_valid 200 10d;
proxy_cache_valid 500 501 502 503 504 505 1s;
proxy_cache_valid 401 402 403 404 1s;
proxy_connect_timeout 15;
proxy_cache_min_uses 1;
}
}
log_format default_format'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time ucs="$upstream_cache_status" '
access_log /var/log/nginx/access.log default_format;
error_log /var/log/nginx/error.log;
}
我已经在 /mnt/sdb
和 /mnt/sdc
上安装了一个磁盘,它被 proxy_cache_path
指令用于缓存存储。
查看 access.log 文件时,upstream_cache_status
为 "-"-"-"-"-"-"-"-54= 或 "MISS" 但没有任何东西获得 "HIT" 状态。
proxy_buffering
指令也是 on
基于 this 答案。
此外,我已经将chown -R www-data:www-data
和chmod -R 776
设置为/mnt/sdb
和/mnt/sdc
,但这些目录中没有任何内容(列出[=的内容25=] 例如):
root@cdn:/etc/nginx# ls -lart /mnt/sdb
total 24
drwxr-xr-x 9 root root 4096 Dec 5 02:52 ..
drwxrw-rw- 2 www-data www-data 16384 Dec 7 05:35 lost+found
drwxrw-rw- 3 www-data www-data 4096 Dec 7 05:35 .
此配置适用于 v1.14.0 并进行缓存! This是两个相同配置的版本差异。
总结: ssl 卸载正确,后端服务器(文件服务器)的响应正确返回给用户,但缓存没有发生!!
谢谢! :)
问题是因为 Set-Cookie
header。添加这些指令以忽略 Set-Cookie
header 后,缓存成功运行:
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
在nginx v.1.14.0中,没有Set-Cookie header,但它有效,这很奇怪!