如何通过Nginx.conf允许访问单个IP地址?

75
我的Linode上,Nginx、Passenger和Rails都运行得非常好。在正式发布之前,我想限制访问,只允许我的IP查看网站。
我尝试在Nginx中拒绝所有访问,并允许只有我的IP才能访问。虽然它确实拒绝了所有访问,但是我无法使访问控制生效。我已经检查过nginx.conf文件中指定的IP地址是否正确。
这是我的nginx.conf文件。我编辑文件后重启了Nginx,并测试了一些其他更改,结果都符合预期(例如,我删除了拒绝所有内容,可以访问该网站,符合预期)。
我做错了什么?
    http {
      passenger_root /path/to/passenger-3.0.11;
      passenger_ruby /path/to/ruby;
      include       mime.types;
      default_type  application/octet-stream;
      sendfile        on;
      keepalive_timeout  65;
      gzip  on;
      server {
        listen 80;
        server_name www.foo.bar;
        root /path/to/rails/public/;
        passenger_enabled on;
        location / {
          allow   my.public.ip.here;
          deny    all;
        }
      }
    }

1
并不是很熟悉nginx配置,但你尝试过交换顺序了吗?我想它所做的是授予对你的IP的访问权限,然后拒绝所有访问。你的IP包含在所有中,因此它正在清除允许。 - Corbin
不幸的是它没有起作用。来自 nginx 文档:“请注意,deny/allow 的顺序非常重要。如果您来自 Apache 世界,您可能会认为可以切换访问指令的顺序,然后一切都会正常工作。实际上并不是这样。在上面的示例中切换顺序会导致拒绝所有地址的访问。” - MrDerp
2个回答

166

修改你的nginx.conf文件

  server {
    listen 80;
    server_name www.foo.bar;

    location / {
      root /path/to/rails/public/;
      passenger_enabled on;

      allow   my.public.ip.here;
      deny    all;
    }
  }

34
显然,让"允许(allow)"放在第一位很重要,否则拒绝(deny)的优先级更高。 - Attila Fulop
每当我将这个添加到我的nginx.conf文件中时,我就无法重新启动nginx。我收到以下错误消息:[....]正在通过systemctl重启nginx.serviceJob for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. failed! <<<<< 你有什么想法关于我的构建出了什么问题吗?@erkasraim - Head
@ 补充尝试并查看您是否在 allow 结尾或任何其他规则处漏掉了逗号。 - William
嗨,我只有一个疑问,由于我们的公共IP会随着连接变化/位置变化而改变,每次IP更改时更改nginx配置文件中的IP地址不会很麻烦吗? 我有点困惑。 - Aniket Singla
在这种情况下,如果您在私有网络上,则可以指定私有网络的CIDR块,而不是特定的公共IP地址。否则,您可以查看ssl_verify_client指令或基本HTTP身份验证。 - Ian Hunter

-1

我知道这是一个旧的帖子,但你总是可以使用sudo nginx -t来获取更具体的错误信息。


5
这个回答并不是与提问者的问题相关的。 - dylzee

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