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