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

Posted

技术标签:

【中文标题】通过 AWS OpsWorks Nginx/Unicorn 服务器上的直接 IP 地址禁用 Web 访问【英文标题】:Disable web access via direct IP address on AWS OpsWorks Nginx/Unicorn server 【发布时间】:2015-12-22 16:55:47 【问题描述】:

我有一个在 AWS OpsWorks nginx/Unicorn Rails 层上运行的 Rails 应用程序。我希望我的应用只处理对 api.mydomain.com 的请求,如果使用服务器的 IP 地址发出任何请求,我的 Web 服务器会直接返回 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 应用程序。

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

谢谢!

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

【问题讨论】:

【参考方案1】:

EC2 实例具有私有(通常为 RFC-1918)IP 地址。 Internet 网关将流量从公共地址转换到该地址。如果该私有地址是&lt;%= @instance[:ip] %&gt; 返回的地址,那么显然,此配置不会满足您的要求。

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

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

见Why is nginx responding to any domain name?。

【讨论】:

谢谢,这解决了我的一个问题。我的另一个问题是 Opsworks 在实例上缓存说明书,您需要手动更新它们:docs.aws.amazon.com/opsworks/latest/userguide/…【参考方案2】:

尝试在return语句周围添加一个位置块“位置/”指的是根

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

【讨论】:

以上是关于通过 AWS OpsWorks Nginx/Unicorn 服务器上的直接 IP 地址禁用 Web 访问的主要内容,如果未能解决你的问题,请参考以下文章

通过 aws opsworks 进行 cron 作业

是否可以在 AWS::OpsWorks::Instance 资源中使用 AWS::CloudFormation::Init 和元数据?

AWS OpsWorks新增Amazon RDS支持

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

在 aws opsworks 中运行自定义食谱

如何在 AWS OpsWorks 上调试 Ruby On Rails?