I don't understand why it fails even when the server name matches something. However, if you have two separate servers with:
server_name xxx.com
server_name yyy.com
You would expect that (assuming that the configs appear in this order) that http://yyy.com would match that server_name. It will not. It will match xxx.com. Why? Because when there is not default, it simply uses the first server. Period.
If you have a default, though...
server_name xxx.com
server_name yyy.com
default_server
It works. yyy.com will match xxx.com.
I come upon this problem because I had a configuration that had the default file that comes in the distribution and it worked.
Then I added SSL. It did not work. Having long forgotten the issue with default, I debugged like a madman. Then I thought about the default issue (I ran into it sometime in the dark past - it is buried in the docs) and saw, There's a default right there!!!
Eventually (I know. This is the least entertaining punchline in history.), I realized that there was no default for port 443. QED
# Default server configuration
#
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl on;
ssl_certificate /etc/ssl/PATH/TO/CERT.cer;
ssl_certificate_key /etc/ssl/PATH/TO/CERT.key;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}