在 Nginx 和 Passenger 中提供预压缩的缓存文件

问题描述 投票:0回答:1

我正在使用 Nginx 在 Passenger 上运行 Rails 应用程序。我的一些应用程序的文件大部分是静态的,所以我使用页面缓存来缓存它们,页面缓存会在公共目录中写入一个 .html 文件和一个 .html.gz 预压缩版本,以便 Nginx 在下次请求时提供服务。如果 .html 文件存在,Nginx 会正确提供该文件;如果不存在,则将请求传递给 Passenger。但它似乎没有提供 .html.gz 文件。

我已经用所需的模块编译了 nginx --with-http_gunzip_module --with-http_gzip_static_module

Nginx 配置重要部分:

http {
  gzip on;
  gzip_static on;
  gunzip on;
}
当我仅使用 Nginx 提供静态站点时,

.html.gz 文件可以正确提供。当我启用 Passenger 并启用 Passenger_enabled 时;它不提供 .html.gz 文件,而只是动态压缩 .html 文件并提供服务。

已编辑的服务器块:

server {
    listen          0.0.0.0:443 ssl http2;
    server_name     example.com;
    root /home/example/www.example.com/current/public;
    access_log  /home/example/log/access.log;
    
    ##
    # Nginx Bad Bot Blocker Includes
    # REPO: https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker
    ##
    include /etc/nginx/bots.d/ddos.conf;
    include /etc/nginx/bots.d/blockbots.conf;

    ssl_certificate      /etc/letsencrypt/live/www.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/www.example.com/privkey.pem;

    # Provide as much of Apache's SSL +StdEnvVars data as possible.
    fastcgi_param HTTPS                 on;
    fastcgi_param SSL_PROTOCOL          $ssl_protocol;
    fastcgi_param SSL_CIPHER            $ssl_cipher;
    fastcgi_param SSL_SESSION_ID        $ssl_session_id;
    fastcgi_param SSL_CLIENT_VERIFY     $ssl_client_verify;  

    passenger_enabled on;

    location ~* ^(.+)\.(png|jpe?g)$ {
        set $base $1;
        set $avif_uri $base$avif_suffix; # image.avif
        set $avif_with_orig_uri $base.$2.$avif_suffix; # image.png.avif
    
        expires 1y;
        add_header Cache-Control public;
        add_header ETag "";
        add_header Vary Accept;
        log_not_found off;
        try_files $avif_uri $avif_with_orig_uri $uri =404;    
    }
    location ~ ^/assets/ {
        expires 1y;
        add_header Cache-Control public;
        add_header ETag "";
        break;
    }
}
ruby-on-rails nginx gzip passenger
1个回答
0
投票

Passenger 可能正在向 nginx 提供 .html 文件,因为没有位置块匹配,因此请求被传递给 Passenger。也许将它们放在一个目录中并创建一个位置块,就像您对 /assets 所做的那样。

© www.soinside.com 2019 - 2024. All rights reserved.