nginx 位置块理解和使用具有命名位置块的乘客
nginx location block comprehension and using passenger with named location blocks
我有几个关于我的 nginx 配置的问题,因为它涉及服务 webp 文件以及使用带有 try_files
的命名位置。
当前配置:
server {
listen 80;
server_name assets.manager manager;
passenger_app_env production;
passenger_ruby /home/web-server/.rvm/gems/ruby-2.2.1@manager/wrappers/ruby;
passenger_enabled on;
error_log /home/web-server/web-applications/manager/current/log/nginx-error.log;
root /home/web-server/web-applications/manager/current/public;
satisfy any;
allow 127.0.0.1;
allow 192.168.0.0/24;
deny all;
location ~ ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
}
location ~* .+\.(?:png|jpe?g|gif)$ {
if ($webp_suffix != "") {
add_header Vary Accept;
}
try_files $uri$webp_suffix $uri =404;
}
}
就目前而言,nginx 不提供 webp 文件。如果我要将 add_header X-Webp-Uri "$uri$webp_suffix";
放在第一个 location
块中,则会添加 header。如果我将其放在第二个 png/jpeg 匹配 location
块中,则 header 不会被设置。据我了解,正则表达式位置块是连续的(即,它不会在第一次匹配时停止匹配)。
1) 如果存在,我想提供 webp 图像(我的尝试是第二个 location
块)。在这种情况下嵌套 location
块会有帮助吗?我想为 /assets/ 中的所有文件设置 gzip_static、过期等,但我只想为 /assets/ 中的某些文件扩展名存在的 webp 版本提供服务。
2) 关于另一个主题,我想提供静态 .html 文件(如果存在)。为此(在网上查找教程之后),我需要 try_files
和指向上游应用程序 (Rails) 的命名位置块的组合。但是,如果我使用 Passenger(使用 passenger-install-nginx-module
安装),我似乎无法找到如何声明上游块。我能找到的 Passenger/Nginx 设置的唯一配置是使用 passenger_enabled on;
编辑:我找到了一个示例配置;这是一个例子(这忽略了问题 #1):
server {
listen 80;
server_name assets.staging.pos staging.pos;
passenger_app_env staging;
passenger_ruby /home/vagrant/.rvm/gems/ruby-2.2.1@pos/wrappers/ruby;
passenger_enabled on;
error_log /home/vagrant/rails/staging.pos/log/nginx-error.log;
root /home/vagrant/rails/staging.pos/public;
try_files $uri /cache/$uri /cache/$uri.html @app;
location @app {
proxy_set_header X-Forwarded-Proto http;
}
location ~* ^/images/.+\.(png|jpe?g)$ {
if ($webp_suffix != "") {
add_header Vary Accept;
}
try_files $uri$webp_suffix $uri =404;
}
}
编辑 2:我发现 nginx 完全清除了 if
块之外的所有指令!
这将导致仅设置 Vary Accept
header:
server {
location ~* ^/images/.+\.(png|jpe?g)$ {
add_header X-Whatever "Yo";
if ($webp_suffix != "") {
add_header Vary Accept;
}
}
}
这将导致两个 header 都被设置:
server {
location ~* ^/images/.+\.(png|jpe?g)$ {
if ($webp_suffix != "") {
add_header Vary Accept;
add_header X-Whatever "Yo";
}
}
}
编辑 3:所以现在更令人困惑了。这就像任何不在最后一个代码块(位置或 if 语句)内的先前 add_header
被完全忽略。即,对于以下内容,仅设置 X-Whatever header:
location ~ ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public; # Ignored?!
add_header Last-Modified ""; # Ignored?!
add_header ETag ""; # Ignored?!
location ~* ^/assets/.+\.(?:png|gif|jpe?g)$ {
add_header X-Something "$uri$webp_suffix"; # Not ignored!
}
}
我必须删除 Vary Accept
header 条件并始终应用它。我不知道这是好是坏,但考虑到它只会删除我申请的所有其他 header,我别无选择!我还必须将 webp 位置块移动到资产块上方,并复制糟糕的代码。
工作配置:
server {
listen 80;
server_name assets.staging.pos staging.pos;
passenger_app_env staging;
passenger_ruby /home/vagrant/.rvm/gems/ruby-2.2.1@pos/wrappers/ruby;
passenger_enabled on;
error_log /home/vagrant/rails/staging.pos/log/nginx-error.log;
root /home/vagrant/rails/staging.pos/public;
# Try to return cached responses without hitting the app
try_files $uri /cache/$uri /cache/$uri.html @app;
location @app {
proxy_set_header X-Forwarded-Proto http;
}
# Return webp images when possible
location ~* ^/assets/.+\.(?:png|gif|jpe?g)$ {
expires max;
add_header Cache-Control public;
add_header Vary Accept;
add_header Last-Modified "";
add_header ETag "";
try_files $uri$webp_suffix $uri =404;
}
# Regular asset headers
location ~ ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
}
}
我有几个关于我的 nginx 配置的问题,因为它涉及服务 webp 文件以及使用带有 try_files
的命名位置。
当前配置:
server {
listen 80;
server_name assets.manager manager;
passenger_app_env production;
passenger_ruby /home/web-server/.rvm/gems/ruby-2.2.1@manager/wrappers/ruby;
passenger_enabled on;
error_log /home/web-server/web-applications/manager/current/log/nginx-error.log;
root /home/web-server/web-applications/manager/current/public;
satisfy any;
allow 127.0.0.1;
allow 192.168.0.0/24;
deny all;
location ~ ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
}
location ~* .+\.(?:png|jpe?g|gif)$ {
if ($webp_suffix != "") {
add_header Vary Accept;
}
try_files $uri$webp_suffix $uri =404;
}
}
就目前而言,nginx 不提供 webp 文件。如果我要将 add_header X-Webp-Uri "$uri$webp_suffix";
放在第一个 location
块中,则会添加 header。如果我将其放在第二个 png/jpeg 匹配 location
块中,则 header 不会被设置。据我了解,正则表达式位置块是连续的(即,它不会在第一次匹配时停止匹配)。
1) 如果存在,我想提供 webp 图像(我的尝试是第二个 location
块)。在这种情况下嵌套 location
块会有帮助吗?我想为 /assets/ 中的所有文件设置 gzip_static、过期等,但我只想为 /assets/ 中的某些文件扩展名存在的 webp 版本提供服务。
2) 关于另一个主题,我想提供静态 .html 文件(如果存在)。为此(在网上查找教程之后),我需要 try_files
和指向上游应用程序 (Rails) 的命名位置块的组合。但是,如果我使用 Passenger(使用 passenger-install-nginx-module
安装),我似乎无法找到如何声明上游块。我能找到的 Passenger/Nginx 设置的唯一配置是使用 passenger_enabled on;
编辑:我找到了一个示例配置;这是一个例子(这忽略了问题 #1):
server {
listen 80;
server_name assets.staging.pos staging.pos;
passenger_app_env staging;
passenger_ruby /home/vagrant/.rvm/gems/ruby-2.2.1@pos/wrappers/ruby;
passenger_enabled on;
error_log /home/vagrant/rails/staging.pos/log/nginx-error.log;
root /home/vagrant/rails/staging.pos/public;
try_files $uri /cache/$uri /cache/$uri.html @app;
location @app {
proxy_set_header X-Forwarded-Proto http;
}
location ~* ^/images/.+\.(png|jpe?g)$ {
if ($webp_suffix != "") {
add_header Vary Accept;
}
try_files $uri$webp_suffix $uri =404;
}
}
编辑 2:我发现 nginx 完全清除了 if
块之外的所有指令!
这将导致仅设置 Vary Accept
header:
server {
location ~* ^/images/.+\.(png|jpe?g)$ {
add_header X-Whatever "Yo";
if ($webp_suffix != "") {
add_header Vary Accept;
}
}
}
这将导致两个 header 都被设置:
server {
location ~* ^/images/.+\.(png|jpe?g)$ {
if ($webp_suffix != "") {
add_header Vary Accept;
add_header X-Whatever "Yo";
}
}
}
编辑 3:所以现在更令人困惑了。这就像任何不在最后一个代码块(位置或 if 语句)内的先前 add_header
被完全忽略。即,对于以下内容,仅设置 X-Whatever header:
location ~ ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public; # Ignored?!
add_header Last-Modified ""; # Ignored?!
add_header ETag ""; # Ignored?!
location ~* ^/assets/.+\.(?:png|gif|jpe?g)$ {
add_header X-Something "$uri$webp_suffix"; # Not ignored!
}
}
我必须删除 Vary Accept
header 条件并始终应用它。我不知道这是好是坏,但考虑到它只会删除我申请的所有其他 header,我别无选择!我还必须将 webp 位置块移动到资产块上方,并复制糟糕的代码。
工作配置:
server {
listen 80;
server_name assets.staging.pos staging.pos;
passenger_app_env staging;
passenger_ruby /home/vagrant/.rvm/gems/ruby-2.2.1@pos/wrappers/ruby;
passenger_enabled on;
error_log /home/vagrant/rails/staging.pos/log/nginx-error.log;
root /home/vagrant/rails/staging.pos/public;
# Try to return cached responses without hitting the app
try_files $uri /cache/$uri /cache/$uri.html @app;
location @app {
proxy_set_header X-Forwarded-Proto http;
}
# Return webp images when possible
location ~* ^/assets/.+\.(?:png|gif|jpe?g)$ {
expires max;
add_header Cache-Control public;
add_header Vary Accept;
add_header Last-Modified "";
add_header ETag "";
try_files $uri$webp_suffix $uri =404;
}
# Regular asset headers
location ~ ^/assets/ {
gzip_static on;
expires max;
add_header Cache-Control public;
add_header Last-Modified "";
add_header ETag "";
}
}