如何配置我的 nginx 服务器以接受不同的子域和端口?

如何配置我的 nginx 服务器以接受不同的子域和端口?

我有一台运行在 Ubuntu/Nginx 上的服务器。我有从不同内部端口运行的子域。我想向公众公开一个应用程序,但不将其与任何域/服务器名称关联。

以下是我的配置文件:

server {
    server_name app.example.com www.app.example.com;
    access_log /home/hub-app/logs/app.example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8082;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; 
    }

    listen 443 ssl; 
    ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;


}   

server {
    server_name example.com www.example.com;
    access_log /home/hub-public/logs/example.com.access.log;
    
    location / {
        proxy_set_header Host $host;
        proxy_pass http://127.0.0.1:8081;
        proxy_redirect off;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';      
        proxy_cache_bypass $http_upgrade;       
        proxy_http_version 1.1;     
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme; 
    }

    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

}

上述代码运行良好,并指向指定的域,即 example.com 和 app.example.com。现在我想添加另一个虚拟服务器以在 MY_PUBLIC_IP:8080 上运行。端口 8080 不应在其他域上可访问,即example.com:8080/app.example.com:8080不应该可用。

答案1

您可以使用default_server

Nginx 会将该服务器声明为默认服务器。此后,当 HTTP Host 标头与任何其他服务器块不匹配时,Nginx 将利用默认服务器来处理请求。

Nginx 中的 default_server 是什么

例子:

server {
    listen 8080 default_server;
    
    root /www/default;
        
    location / {
        index index.html;
    }
}


我使用它来蜜罐扫描机器人,如果它们正在寻找 phpAdmin 或类似的东西,就向它们发送一些便便表情符号 :)

答案2

我认为 @Klamberext 的回答并没有真正回答这个问题。也就是说,nginx 网络服务器有一个默认服务器概念。有关该主题的官方文档页面可以在这里找到:nginx 如何处理请求。但是,监听某个网络接口/端口组合的服务器块之一将始终充当默认服务器块。如果您未明确指定该服务器块,它将是配置中的第一个服务器块。这意味着带有该行的服务器块将成为443 TCP 端口上任何请求的默认服务器块,为 HTTP标头不匹配或(或根本没有标头)server_name app.example.com www.app.example.com;的任何请求提供服务。Hostexample.comwww.example.comHost

正如 @Klamberext 所说,一种常见的做法是定义一个存根服务器块来捕获所有HostHTTP 标头与您正在服务的任何域不匹配的请求。您可以在此查看示例答案是这样的。通常,这样的服务器块包含语句,该语句是特殊的 nginx 返回代码,用于立即关闭连接。但是,似乎您需要相反的东西,并且需要两个服务器块来完成它,因为正如已经说过的,无论标头设置return 444;为何,监听 TCP 端口 8080 的单个服务器块都将充当默认服务器块:Host

server {
    listen 8080;
    server_name example.com www.example.com app.example.com www.app.example.com;
    return 444;
}
server {
    listen 8080 default_server;
    ... your config here
}

另外,您可以检查Host服务器块内的标头值,例如阻止example.com域及其任何子域:

server {
    listen 8080;
    if ($http_host ~ \.?example\.com$) { return 444; }
    ... your config here
}

相关内容