我有一台运行在 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 将利用默认服务器来处理请求。
例子:
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;
的任何请求提供服务。Host
example.com
www.example.com
Host
正如 @Klamberext 所说,一种常见的做法是定义一个存根服务器块来捕获所有Host
HTTP 标头与您正在服务的任何域不匹配的请求。您可以在此查看示例这答案是这样的。通常,这样的服务器块包含语句,该语句是特殊的 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
}