我想使用 Nginx 缓存一些静态文件。但我不知何故无法让它工作。
这是我的nginx.conf
:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
#multi_accept on;
}
http {
#GZIP
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types application/javascript application/json application/ld+json application/xml font/eot font/otf font/ttf text/css text/javascript text/plain text/xml;
# SERVERS
server {
listen 80;
server_name example.com;
if ($http_host ~* ^www\.(.*)$ )
{
return 301 https://$1$request_uri;
}
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl;
if ($http_host ~* ^www\.(.*)$ )
{
return 301 $scheme://$1$request_uri;
}
#SSL
ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/example.com/example.com.key;
server_name example.com;
# Pass all traffic to my webapplication
location / {
proxy_set_header Host $host;
proxy_pass http://localhost:8080;
}
#Browser caching
location ~* \.(js|css)$ {
expires 180d;
add_header Pragma "public";
add_header Cache-Control "public";
}
location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
expires 365d;
add_header Pragma "public";
add_header Cache-Control "public";
}
}
}
问题出在“浏览器缓存”部分。启用此代码块时,我的网站会加载,但所有 css 文件、javascript 文件和图像都返回 404。就像这些文件忽略了我的location /
.
我能够通过复制/粘贴来解决这个问题
proxy_set_header Host $host;
proxy_pass http://localhost:8080;
在我所有的location
块中,但这并不是很优雅,实际上让我的网站感觉慢了很多......
我还尝试将location
浏览器缓存的两个块移动到块中location \
,以便后者充当“父级”。但这并没有机会图像等的行为返回 404。
如何在 Nginx 中配置静态文件的缓存?
编辑:
我将以下内容添加到我的http
-block 中:
map $uri $cache_control {
~/Website/assets/media/images "public, no-transform";
}
map $uri $expire {
~/Website/assets/media/images 365d;
}
在我的server
-block 中添加了以下内容:
expires $expire;
add_header Cache-Control $cache_control;
没有任何东西被缓存。
这实际上并没有回答您的问题,而是显示了使用 nginx 提供静态资产的首选方式。
由于您似乎在同一主机上运行 Web 应用程序,因此我建议您直接使用 nginx 提供静态文件。
这个仍然有重复的缓存定义。
include
您可以通过在单独的文件中指定指令并使用将文件包含在配置中来消除一些重复。您将输入以下内容进行
proxy_header.conf
归档:在您的配置中:
如果您不能像@TeroKilkanen 建议的那样通过 nginx 直接从文件系统提供静态资产,您可以使用类似于此答案中所示的技术:
如果您的请求 URI 与正则表达式不匹配,则
$cache_control
变量将具有空值,并且 nginx 根本不会在其响应中添加Pragma
和标头。Cache-Control