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