将 location-block 添加到缓存文件会导致这些文件返回 404

将 location-block 添加到缓存文件会导致这些文件返回 404

我想使用 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块中:

  map $uri $cache_control {
                ~/Website/assets/media/images    "public, no-transform";
        }
        map $uri $expire {
            ~/Website/assets/media/images   365d;
        }

将以下内容添加到我的server块中:

 expires $expire;
                add_header Cache-Control $cache_control;

沒有任何内容被缓存。

答案1

如果你无法像 @TeroKilkanen 建议的那样通过 nginx 从文件系统直接提供静态资产,则可以使用类似于所示的技术回答:

map $uri $expire {
    ~\.(?:j|cs)s$                      180d;
    ~\.(?:jpe?g|png|webp|woff2?|ttf)$  365d;
    default                            off;
}
map $uri $cache_control {
    ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$  public;
}
server {
    ...
    expires $expire;
    add_header Pragma $cache_control;
    add_header Cache-Control $cache_control;
    ...
}

如果您的请求 URI 与正则表达式不匹配,$cache_control变量将具有空值,并且 nginx根本不会向其响应添加标头PragmaCache-Control

答案2

这实际上并没有回答您的问题,但展示了使用 nginx 提供静态资产的首选方式。

由于您似乎在同一台主机上运行 Web 应用程序,因此我建议您直接使用 nginx 提供静态文件。

root /path/to/webroot;

location ~* \.(js|jss)$ {
    expires 180d;
    add_header Pragma "public";
    add_header Cache-Control "public;

    try_files $uri =404;
}

location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
    expires 365d;
    add_header Pragma "public";
    add_header Cache-Control "public";

    try_files $uri =404;
}

这个仍然有重复的缓存定义。您可以通过在单独的文件中指定指令并使用将include文件包含在配置中来消除一些重复。

您需要输入以下内容到proxy_header.conf文件中:

add_header Pragma "public";
add_header Cache-Control "public";

在您的配置中:

location ~* ... {
    include /path/to/webroot;
    expires 365d;
}

相关内容