如果只有一个网站使用 NGINX 提供服务,是否应该存在“server_name”指令?

如果只有一个网站使用 NGINX 提供服务,是否应该存在“server_name”指令?

Mozilla SSL 配置生成器省略了server_name生成 NGINX 配置时的指令(例如,参见适用于 NGINX 1.22.1 和 OpenSSL 3.0.2)。

在阅读了几个相关文档和主题(见底部)后,我得出的结论是,这可能是因为配置是假设只提供一个站点进行服务。

我打算这样做:通过 HTTPS 为一个站点提供服务。因此,如果我复制该配置,则server_name每个块中的配置都会解析为空字符串server。我误解了什么吗?

忽略server_name不安全因素难道不是一种不好的做法吗?


答案1

处理 NGINX 配置的简化流程图listen仅在端口上:

处理 NGINX 配置的流程图

但是,这可以很容易地推广到listen <IP_ADDRESS>:<PORT>声明;请参阅此答案底部的 NGINX 文档的引用。

例子

1. Mozilla SSL 配置生成器生成的 NGINX 配置

要点问题中引用的配置

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # ... instructions ...
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # ... instructions ...
}

作为理查德·史密斯在他的评论中说,这两个server块分别是针对端口 80 和 443 的请求的默认块,接受任何域;如果server_name块中有声明,它们就无关紧要了。

例如,端口 443 上的 HTTPS 请求将完全跳过第一个块,因为该default_server声明仅适用于端口 80 上的请求。

2. 将域名的所有 HTTP 请求重定向到 HTTPS

此服务器故障线程

#############
# CATCH-ALL #
#############
server {
   listen 80 default_server; 
   server_name _;

   return 404;
}

##########################
# HTTP-to-HTTPS redirect #
##########################
server {
    listen 80;
    server_name ourdomain.com;

    return 301 https://ourdomain.com$request_uri;
}

#########
# HTTPS #
#########
server {
    listen 443 default_server ssl http2;

    # ... instructions ...
}

示例请求:

  • http://ourdomain.com/about

    NGINX将要server_name看到有两个处理 80 端口的块后再查看指令,会匹配第二个。

  • http://random-domain.org/在哪里,因为某些原因,域名仍然解析为运行上述配置的 NGINX 服务器的 IP 地址

    没有任何server方块listen端口 80 上的 ing 将匹配,因此默认值将简单地返回 404。

    注意:要使 catch-allserver块正常工作,

    1. 它必须声明server_name _;,并且

    2. 它必须是该端口的默认服务器(可以是隐式的,通过成为该端口上第一个出现的服务器,也可以是显式的,通过使用listen ... default_server ...;)。

    服务器名称NGINX 文档中的文章。

在上述任何一种情况下,server_name都可以在处理 HTTPS 的块中省略server,因为它是唯一一个监听 443 的块。


注意自我:listendefault_server参数可以在同一个配置文件中多次使用. 来自文档:

如果存在该default_server参数,将导致服务器成为指定对的默认服务器address:port。 -链接到段落

上面的示例配置可以写成下面这样(基于此服务器故障线程):

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # ... instructions ...
}

server {
    listen 443 default_server ssl http2;
    listen [::]:443 default_server ssl http2;

    # ... instructions ...
}

相关内容