使用Chef和Vagrant时如何禁用默认的nginx站点?

10

我正在使用Berkshelf、Chef和Vagrant,尝试配置在nginx上运行的自定义站点。我正在使用opscode nginx配方,然后编写自己的配方来制作自定义站点。当我运行vagrant up时,会出现一个错误,指出没有禁用默认的nginx站点。我找到了几个不同的建议,但似乎都没有起作用。

错误信息:

STDOUT:
STDERR: nginx: [emerg] a duplicate default server for 0.0.0.0:80 in /etc/nginx/sites-    enabled/kyleboon.me:2
nginx: configuration file /etc/nginx/nginx.conf test failed

我的Berksfile文件:

site :opscode

metadata
cookbook 'nginx'

我定义的'roles/web.json'角色:

{
  "name": "web",
  "chef_type": "role",
  "json_class": "Chef::Role",
  "description": "The base role for systems that serve HTTP traffic",
  "default_attributes": {
    "nginx": {
      "default_site_enabled": false
    },
    "app": {
      "name": "kyleboon.me",
      "web_dir": "/var/data/www/kyleboon.me"
    },
    "user":{
      "name": "vagrant"
    }
  },
  "run_list": [
    "recipe[nginx]",
    "recipe[kyleboon.me]"
  ]
}

这是我添加的nginx网站的recipes/default/default.rb:

nginx_site 'default' do
  action :disable
end

%w(public logs).each do |dir|
  directory "#{node.app.web_dir}/#{dir}" do
    owner node.user.name
    mode "0755"
    recursive true
  end
end

template "#{node.nginx.dir}/sites-available/kyleboon.me" do
  source "site.erb"
  mode 0777
  owner node.nginx.user
  group node.nginx.user
end

nginx_site "kyleboon.me"

cookbook_file "#{node.app.web_dir}/public/index.html" do
  source "index.html"
  mode 0755
  owner node.user.name
end

(提示:我知道文件权限需要更改,我一直在尝试各种方法,一旦我把其他的东西都搞定了,就会更新它们)

这里是attributes/default.rb:

override['nginx']['enable_default_site'] = false
你可以看到我尝试在web.json中禁用默认站点,包括属性和此配方本身,但它们都没有生效。 我没有定义一个节点或独立节点,我不确定那是否是一个问题。到目前为止,我在vagrant上的主要问题是如何做事情有无数可能性。没有两个示例是以相同的方式完成的,我不确定什么是被认为是“最好”或“正确”的方法。

我发现通常可以通过 node['nginx']['enable_default_site'] 禁用默认站点 - 也许您在以前的运行中留下了 sites-enabled 中的符号链接,这些符号链接不再由 chef 管理(因为 Chef 不会仅因为删除资源声明而删除文件)。 - cmur2
我已经执行了vagrant destroy以确保。它似乎每次我进行配置时都会在sites-enabled中创建链接,但我会再次确认。 - Kyle Boon
我认为Cliff Erson的答案是正确的。也许你想接受它? - kioopi
希望我可以问一个问题。禁用默认站点是什么意思?这是否意味着不映射到定义站点的请求会转到第一个站点,如https://dev59.com/22kw5IYBdhLWcg3wirCs中所讨论的那样? - Frank Schwieterman
2个回答

12
你可以通过使用nginx_site和它的名称来禁用任何nginx网站。你遇到的问题是因为nginx_site definition实际上正在寻找启用参数设置为true或false,而不是将操作参数设置为:disabled。
要禁用默认网站,请在你的recipe中添加以下内容:
nginx_site 'default' do
  enable false
end

这是在nginx opscode cookbook 1.7.1版本中适用的方法。我不确定它是否适用于社区提供的版本,因为它似乎已经过时了几个月。
要获取最新版本,请在Berksfile中添加:
cookbook 'nginx', git: 'https://github.com/opscode-cookbooks/nginx'

希望能有所帮助 :)

1
完美,即使在2016年也是如此。 - Jesse Adelman

5

我遇到了同样的错误,但是我没有启用默认站点。相反,它来自于 /etc/nginx/conf.d/default.conf!我不得不求助于

file "/etc/nginx/conf.d/default.conf" do
  action :delete
end

这是来自nginx食谱在我的计算机上安装的RHEL软件包。

我认为这是因为在nginx.conf.erb的末尾有两行,其中一行包括conf.d/*.conf,另一行包括/sites-enabled/*。我非常确定这意味着禁用默认设置不起作用,因为即使您没有在sites-enabled中创建符号链接,它仍将从conf.d中显示出来。 - Bueller
这个错误现在已经在 Nginx ~-> 2.7.6 中得到解决,https://github.com/miketheman/nginx/blob/master/recipes/commons_dir.rb#L51 - stefancarlton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接