select 服务器块基于某些查询参数的存在

select server block based on existence of certain query parameters

我有一个单页应用程序,我想让它可抓取,所以我生成了快照。我的应用程序堆栈是 rails + unicorn + nginx(作为反向代理)。

现在,Aws Opsworks 从 this cookbook 生成一个 nginx 配置。我通过 ssh 进入系统并修改了默认配置以包含以下行以重定向来自搜索引擎机器人的所有请求,如下所示(它们转换包含 #! 的 url 并使用 _escaped_fragment_ 在查询参数中):

if ($args ~ "_escaped_fragment_=(.+)") {
  rewrite ^ /snapshots$uri?;
}

当我在浏览器中加载 url 时一切正常。我面临的问题是使用 chef 自动化同一件事。由于我添加的代码位于 opsworks 使用默认说明书生成的配置文件中,因此我需要一种方法来定义 nginx server 块来实现此目的。所以,我定义了以下服务器块。

server {
    listen 80;
    server_name example.com;

    if ($args ~ "_escaped_fragment_=(.+)") {
        set $foo ;
        rewrite ^ /snapshots$uri$foo?;
    }
}

但是 nginx 永远不会 select 这个块,因为已经存在另一个具有相同 server_name 的服务器块。那么,有没有一种方法可以根据$args_escaped_fragment_的存在定义一个server块由nginx select编辑?

如下(我知道这行不通,因为正则表达式与查询参数不匹配)

server {
    listen 80;
    server_name example.com(.+)_escaped_fragment_=(.+);

    ...
}

为了在 Chef 中执行此操作,您需要创建一个自定义食谱(如果您还没有)和一个食谱,它将用您的首选文件覆盖 opsworks 生成的文件。在食谱中,您需要 2 个文件、nginx 模板和一个用自定义模板覆盖默认模板的配方:

  1. mycookbook -> 模板 -> 默认 -> custom_nginx.erb
  2. mycookbook -> 食谱 -> customise_nginx.rb

(1)的内容:

无论你想要你的 nginx 配置文件是什么,所以:

server {
    listen 80;
    server_name example.com;

    if ($args ~ "_escaped_fragment_=(.+)") {
        set $foo ;
        rewrite ^ /snapshots$uri$foo?;
    }
}

(2)的内容:

template "/etc/nginx/sites-enabled/<nginx file name>" do
  source "custom_nginx.erb"
  user "root"
  group "root"
  mode "644"
end

service "nginx" do
  action :reload
end

然后将 mycookbook::customise_nginx 添加到图层设置中的自定义设置配方部分。

如果您还没有自定义食谱,则需要进行更多设置: https://www.digitalocean.com/community/tutorials/how-to-create-simple-chef-cookbooks-to-manage-infrastructure-on-ubuntu http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-installingcustom-enable.html

编辑: 如果你想保留 opsworks 配置文件,你有两个选择:采用 opsworks 使用的模板,我猜是这个? https://github.com/aws/opsworks-cookbooks/blob/release-chef-11.10/nginx/templat‌​es/default/site.erb, create a copy and put your changes there in file 1 as above. Or use chef to modify the existing file content - for example using FileEdit library (check the second answer to this question)