通过 AWS OpsWorks Nginx/Unicorn 服务器上的直接 IP 地址禁用 Web 访问

Disable web access via direct IP address on AWS OpsWorks Nginx/Unicorn server

我在 AWS OpsWorks Nginx/Unicorn Rails 层上有一个 Rails 应用程序 运行。我希望我的应用程序只处理对 api.mydomain.com 的请求,如果使用服务器的 IP 地址发出任何请求,我的 Web 服务器会直接 return 404。

我已经实现了一个覆盖 unicorn/templates/default/nginx_unicorn_web_app.erb 的自定义说明书(来自 opsworks-cookbooks 存储库:https://github.com/aws/opsworks-cookbooks)。我复制了这个存储库中存在的模板文件,并在模板顶部添加了一个新的服务器块:

server { listen 80; server_name <%= @instance[:ip] %>; return 404; }

我停止并启动我的服务器以确保使用自定义模板文件,但是当我使用服务器的 IP 地址发出请求时,它仍然被路由到我的 Rails 应用程序。

这 <%= @instance[:ip] %> 不正确吗?有没有办法从这个模板文件中记录日志,以便我可以更轻松地调试出了什么问题?我尝试使用 Chef::Log.info,但我的消息似乎没有被记录。

谢谢!

编辑:对于遇到此问题的任何其他人...下面关于设置默认服务器块的答案解决了我的一个问题。我的另一个问题与我的说明书更新甚至没有进入我的实例并且需要手动刷新说明书缓存这一事实有关:http://docs.aws.amazon.com/opsworks/latest/userguide/workingcookbook-installingcustom-enable-update.html

尝试在 return 语句周围添加一个位置块 "location /" 引用根

server {
   listen 80;
   server_name <%= @instance[:ip] %>;
   location / {
       return 404;
   }
}

EC2 实例有一个私有(通常是 RFC-1918)IP 地址。 Internet 网关将流量从 public 地址转换为该地址。如果该私有地址是地址 <%= @instance[:ip] %> returns,那么显然,此配置不会执行您想要的操作。

即使不是,这也不是正确的方法。

相反,您应该定义 Nginx 的 default 行为——这是第一个 server 块——抛出错误,稍后在配置中,使用 api DNS 主机名和正常操作所需的行为声明一个服务器块。

Why is nginx responding to any domain name?