通过 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 网关将流量从公共地址转换到该地址。如果该私有地址是<%= @instance[:ip] %>
返回的地址,那么显然,此配置不会满足您的要求。
即使不是,这也不是正确的方法。
相反,您应该定义 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::Instance 资源中使用 AWS::CloudFormation::Init 和元数据?