首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么nginx会响应任何域名?

为什么nginx会响应任何域名?
EN

Stack Overflow用户
提问于 2012-03-22 22:31:34
回答 3查看 123.5K关注 0票数 155

我已经使用Ruby/Sinatra应用程序启动并运行了nginx,一切正常。然而,我现在正在尝试让第二个应用程序从同一台服务器上运行,我注意到了一些奇怪的事情。首先,这是我的nginx.conf:

pid /tmp/nginx.pid;
error_log /tmp/nginx.error.log;

events {
  worker_connections 1024;
  accept_mutex off;
}

http {
  default_type application/octet-stream;
  access_log /tmp/nginx.access.log combined;

  sendfile on;
  tcp_nopush on;
  tcp_nodelay off;

  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  gzip_min_length 500;
  gzip_disable "MSIE [1-6]\.";
  gzip_types text/plain text/xml text/css
             text/comma-separated-values
             text/javascript application/x-javascript
             application/atom+xml;

  upstream app {
    server unix:/var/www/app/tmp/sockets/unicorn.sock fail_timeout=0;
  }

  server {
    listen 80;
    client_max_body_size 4G;
    server_name FAKE.COM;

    keepalive_timeout 5;

    root /var/www/app/public;

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;

      if (!-f $request_filename) {
        proxy_pass http://app;
        break;
      }
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
      root /var/www/app/public;
    }
  }
}
                                                          68,0-1        B

请注意,server_name如何设置为FAKE.COM,但服务器仍在响应通过其他域名访问该服务器的所有主机。如何才能使该特定服务器仅响应FAKE.COM请求

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-23 00:37:38

对于命中没有特定服务器块的服务器的所有请求,nginx配置中的第一个服务器块是默认的。

因此,在您的配置中,假设您的实际域是REAL.COM,当用户输入时,它将解析到您的服务器,并且由于此设置没有服务器块,因此FAKE.COM的服务器块将处理该请求,它是第一个服务器块(在您的情况下是唯一的服务器块)。

这就是为什么正确的Nginx配置会有一个特定的服务器块作为默认值,然后再跟随其他特定域的块。

# Default server
server {
    return 404;
}

server {
    server_name domain_1;
    [...]
}

server {
    server_name domain_2;
    [...]
}

**编辑**

看起来有些用户被这个例子搞糊涂了,认为它只限于一个conf文件,等等。

请注意,上面是一个简单的示例,供OP根据需要进行开发。

我个人使用单独的vhost conf文件作为so (CentOS/RHEL):

http {
    [...]
    # Default server
    server {
        return 404;
    }
    # Other servers
    include /etc/nginx/conf.d/*.conf;
}

/etc/nginx/conf.d/将包含domain_1.conf、domain_2.conf...domain_n.conf,它将包含在主nginx.conf文件中的服务器块之后,它将始终是第一个,并且始终是默认值,除非在其他地方使用default_server指令覆盖它。

在这种情况下,其他服务器的conf文件的文件名的字母顺序变得无关紧要。

此外,这种安排提供了很大的灵活性,因为可以定义多个默认值。

在我的特定情况下,我让Apache仅在内部接口上监听端口8080,并将PHP和Perl脚本代理给Apache。

但是,我运行了两个独立的应用程序,这两个应用程序都在附加的输出html中返回带有":8080“的链接,因为它们检测到Apache没有在标准端口80上运行,并试图”帮助“我。

这会导致链接无效,因为无法从外部接口访问Apache,并且链接应指向端口80。

我通过为端口8080创建一个默认服务器来重定向此类请求来解决此问题。

http {
    [...]
    # Default server block for undefined domains
    server {
        listen 80;
        return 404;
    }
    # Default server block to redirect Port 8080 for all domains
    server {
        listen my.external.ip.addr:8080;
        return 301 http://$host$request_uri;
    }
    # Other servers
    include /etc/nginx/conf.d/*.conf;
}

由于常规服务器块中没有任何内容侦听8080端口,因此重定向默认服务器块凭借其在nginx.conf中的位置透明地处理此类请求。

我实际上有四个这样的服务器块,这是一个简化的用例。

票数 222
EN

Stack Overflow用户

发布于 2014-08-13 15:15:38

我无法用其他任何答案来解决我的问题。我解决了这个问题,方法是检查主机是否匹配,如果不匹配,则返回403。(我有一些随机的网站指向我的web服务器内容。我猜是劫持搜索排名)

server {
    listen 443;
    server_name example.com;

    if ($host != "example.com") {
        return 403;
    }

    ...
}
票数 35
EN

Stack Overflow用户

发布于 2013-08-24 19:08:35

要回答的小评论:

如果您在sites-available/中的多个配置文件中的多个IP上有多个虚拟主机,则IP的“默认”域将按字母顺序从第一个文件中取出。

正如Pavel所说,"listen“指令http://nginx.org/en/docs/http/ngx_http_core_module.html#listen有"default_server”参数

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9824328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档