Ruby on rails 如何将NGINX配置为只服务一个静态文件?

Ruby on rails 如何将NGINX配置为只服务一个静态文件?,ruby-on-rails,nginx,nginx-config,Ruby On Rails,Nginx,Nginx Config,我们的Rails应用程序正在puma/nginx上运行 下面是NGINX配置的一部分 我试图实现的是,当请求URL为时,它将提供一个来自/public/cached_pages/index.html的静态缓存文件,在所有其他情况下,它的工作方式与现在一样,将请求传递给rails/puma upstream rails { server unix:///var/www/html/cms/shared/sockets/puma.sock; } location / { p

我们的Rails应用程序正在puma/nginx上运行 下面是NGINX配置的一部分

我试图实现的是,当请求URL为时,它将提供一个来自/public/cached_pages/index.html的静态缓存文件,在所有其他情况下,它的工作方式与现在一样,将请求传递给rails/puma

upstream rails {
  server unix:///var/www/html/cms/shared/sockets/puma.sock;
}


   location / {
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       add_header Cache-Control "public";
       expires 2d;
       proxy_set_header Host $http_host;
       proxy_set_header  X-Forwarded-Proto $scheme;
       proxy_set_header  X-Forwarded-Ssl on; # Optional
       proxy_set_header  X-Forwarded-Port $server_port;
       proxy_pass http://rails;
  }


我不确定这是否是最好的解决方案,但您是否尝试过
尝试使用\u文件
?() 在rails上下文中,这通常用于资产,但也可能用于缓存。资产示例如下所示:

  try_files $uri/index.html $uri @app_production;
  location @app_production {
[...]
    proxy_redirect off;
    proxy_pass http://app_production;

第一行需要根据您的需要进行调整,但这可能也适用于您的情况。

我不确定这是否是最好的解决方案,但您是否尝试过
try_files
?() 在rails上下文中,这通常用于资产,但也可能用于缓存。资产示例如下所示:

  try_files $uri/index.html $uri @app_production;
  location @app_production {
[...]
    proxy_redirect off;
    proxy_pass http://app_production;

第一行需要根据您的需要进行调整,但这可能也适用于您的情况。

您应该使用
location
指令

  location = / {
    gzip_static on;
    root public/cached_pages
    index.html
  }
=
符号将为url提供精确匹配,如果没有
=
符号,您将匹配域名后的任何路径。接下来,打开gzip将压缩文件以减少流量带宽,这样index.html页面将被压缩,然后将
root
指令设置为文件的路径将使nginx能够找到您想要服务的文件,然后实际的文件本身应该为您做些事情


root指令可能需要文件夹的完整路径,而不是相对的公共路径,显然我不知道这将是什么。

您应该使用
location
指令

  location = / {
    gzip_static on;
    root public/cached_pages
    index.html
  }
=
符号将为url提供精确匹配,如果没有
=
符号,您将匹配域名后的任何路径。接下来,打开gzip将压缩文件以减少流量带宽,这样index.html页面将被压缩,然后将
root
指令设置为文件的路径将使nginx能够找到您想要服务的文件,然后实际的文件本身应该为您做些事情


root指令可能需要文件夹的完整路径,而不是相对的公共路径,显然我不知道这是什么。

这不是最好的选择。你应该匹配确切的路径,然后使用location directive在正确的位置提供确切的文件我已经更新了缓存逻辑,因此为了保持简单,我有大约50个路由,其中一些路由我已经预处理了缓存的HTML文件,我想提供服务。因此path/should-serve-index.html路径/about应该服务于about.html,所有其他路径都应该代理到rails。如何配置?我建议为
/
路线制定专用规则,就像另一个答案中建议的那样。否则,所有请求都必须针对这种特殊情况进行调查。此外,类似于
try_files$uri.html@app_name可以工作。它将尝试查找一个与带有
.html
后缀的uri匹配的文件,否则将使用该应用程序。您可以将其与第一条规则结合起来,让
try_文件$uri/index.html$uri.html@app_name
,但这会产生额外的开销。我自己没有尝试过这个建议,但从概念上讲它应该是可行的。这并不是最好的选择。你应该匹配确切的路径,然后使用location directive在正确的位置提供确切的文件我已经更新了缓存逻辑,因此为了保持简单,我有大约50个路由,其中一些路由我已经预处理了缓存的HTML文件,我想提供服务。因此path/should-serve-index.html路径/about应该服务于about.html,所有其他路径都应该代理到rails。如何配置?我建议为
/
路线制定专用规则,就像另一个答案中建议的那样。否则,所有请求都必须针对这种特殊情况进行调查。此外,类似于
try_files$uri.html@app_name可以工作。它将尝试查找一个与带有
.html
后缀的uri匹配的文件,否则将使用该应用程序。您可以将其与第一条规则结合起来,让
try_文件$uri/index.html$uri.html@app_name
,但这会产生额外的开销。我没有亲自尝试这个建议,但从概念上讲,它应该是可行的。