原先server_name 配的是api.test.toutiao.applet.rockysaas.com,监听的是80端口,http。后来域名改成了api-test.tbk.rockysaas.com,监听443,https。但是发现原先的api.test.toutiao.applet.rockysaas.com还能访问。

server {
#    listen       80;
        listen 443 ssl;

        ssl_certificate /usr/local/webserver/nginx/conf/ca/3519907_api-test.tbk.rockysaas.com.pem;
        ssl_certificate_key /usr/local/webserver/nginx/conf/ca/3519907_api-test.tbk.rockysaas.com.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        server_name api-test.tbk.rockysaas.com;
    access_log  /var/log/nginx/tbk.api.access.log  main;


        index index.html;
          location /tbk {
           #请求头数据大小设置
         client_max_body_size 32m;
           client_body_buffer_size 8192k;
          proxy_send_timeout 300;
          proxy_read_timeout 300;

          #tomcat返回数据大小设置
         proxy_buffer_size 128k;
         proxy_buffers 32 32k;
         proxy_busy_buffers_size 128k;
          proxy_temp_file_write_size 256k;
          proxy_connect_timeout 300s;
          proxy_pass http://localhost:8238/tbk;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   }

}

后来在网上看到

如果nginx中只配置一个server域的话,则nginx是不会去进行server_name的匹配的。因为只有一个server域,也就是这有一个虚拟主机,那么肯定是发送到该nginx的所有请求均是要转发到这一个域的,即便做一次匹配也是没有用的。还不如干脆直接就省了。如果一个http域的server域有多个,nginx才会根据$hostname去匹配server_name进而把请求转发到匹配的server域中。此时的匹配会按照匹配的优先级进行,一旦匹配成功进不会再进行匹配,关于具体的匹配规则可以参见nginx官网提供的文档。
 评论 (2)  引用此答案  举报
wang_wei 2013/03/13 11:45
实际上,nginx会匹配请求头中的host和server_name,如果没有匹配的上,nginx会指定该请求到一个默认的server域,如果比较说明,默认的server为第一个server。因此,就出现了如楼主所述的情况。

可能是配443端口的server只有两个,然后访问https://api-test.tbk.rockysaas.com时默认就跑到这里来了。访问http://api-test.tbk.rockysaas.com时返回的是

{
    "code": 1010,
    "message": "未授权"
}

 

如果nginx中只配置一个server域的话,则nginx是不会去进行server_name的匹配的。因为只有一个server域,也就是这有一个虚拟主机,那么肯定是发送到该nginx的所有请求均是要转发到这一个域的,即便做一次匹配也是没有用的。还不如干脆直接就省了。如果一个http域的server域有多个,nginx才会根据$hostname去匹配server_name进而把请求转发到匹配的server域中。此时的匹配会按照匹配的优先级进行,一旦匹配成功进不会再进行匹配,关于具体的匹配规则可以参见nginx官网提供的文档。
W
wang_wei 

实际上,nginx会匹配请求头中的host和server_name,如果没有匹配的上,nginx会指定该请求到一个默认的server域,如果比较说明,默认的server为第一个server。因此,就出现了如楼主所述的情况。