nginx 中处理 default_server 和公共 ip 的最佳实践

nginx 中处理 default_server 和公共 ip 的最佳实践

我最近在 debian 8 上创建了一个 nginx 服务器。它在 /etc/nginx/sites-available/default 上有一个默认配置,它会重定向到 nginx 欢迎页面。

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

root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;

server_name your_server_ip;

location / {
    try_files $uri $uri/ =404;
}

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}

location ~ /\.ht {
    deny all;
}
}

我添加了一个新的生产页面,上面带有 ssl,例如“example.com”。

在 ../example.com 的配置中,它未被设置为默认服务器。

server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}

server {

# SSL configuration

listen 443 ssl;
listen [::]:443 ssl;
include snippets/ssl-example.com.conf;
include snippets/ssl-params.conf;
....

现在,当我对 SSL 安全性进行测试时https://www.ssllabs.com/ssltest/analyze.html?d=example.com,它获得了 A+。但它评论道“服务器配置不一致”。

当我在浏览器上以 https:// xxxx 的形式加载 IP 地址(例如 xxxx)时,它会加载与https://example.com但没有 ssl(绿色地址栏)。如果我加载 http:// xxxx,它会加载默认的 nginx 欢迎页面。

我尝试设置默认配置(针对 ip)以获取禁止消息,我添加了以下代码

location / {
deny all;
}

现在,当我对 example.com 进行 SSL 安全测试时,它显示“不支持安全协议”并且没有出现任何测试结果。

我的问题是,

nginx 自带的针对 ip 地址加载的默认配置该怎么办?

哪个 server_name(配置文件)应该设置为‘listen’命令中的默认服务器?

当前将 https 请求转发到示例域的 ip 应该怎么办?

预期结果:-

https:// example.com 只应用于连接服务器,加载 ip 地址时会显示“页面未找到”或“禁止”,因为 example.com 将用于其上的 php 脚本。

SSL 测试在设置配置后应该至少给出 A 级评级。

ip 地址不应该直接接受任何连接并处理它。

答案1

您可以将其作为您的默认服务器块:

server {
    listen 80 default_server;
    listen 443 ssl default_server;

    server_name _;

    ... SSL keys for default server ...

    return 403;
}

这将导致任何 HTTP 连接(其 Host: 标头与服务器上的任何其他虚拟主机不匹配)向客户端返回 403 Forbidden 错误消息。

如果您在此处为与任何现有主机名都不匹配的主机名使用有效的 SSL 密钥,则客户端将直接收到 403 错误页面。如果您在此处使用自签名证书,则用户将收到不受信任的证书错误消息。

答案2

您可以使用“ssl_reject_handshake on”来拒绝 SSL 连接。这就像“return 444”来关闭连接一样。

# HTTP:80 = catch-all server block, resulting in a 444 response for unknown domains.
# HTTPS:443 = catch-all server block, resulting in reject SSL connection for unknown domains.

server {
    listen 80 default_server;
    listen [::]:80 ipv6only=on default_server;
    server_name "_";
    return 444; # Connection closed without response
}

server {
    listen 443 default_server;
    listen [::]:443 ipv6only=on default_server;
    server_name "_";
    ssl_reject_handshake on; # Reject SSL connection
}

答案3

终于找到了一个可用的解决方案。Quora 做了类似的事情。将默认值重定向到 404。

来源 :正确设置 https 的“默认” nginx 服务器

通过将默认配置设置为此。

server {
server_name _;
listen       80  default_server;
return       404;
}


server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
return       404;
}

如果不存在 ssl 目录,则创建该目录

sudo mkdir -p /etc/nginx/ssl

然后为同一个创建一个自签名 SSL

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt

检查错误并重新加载 nginx 以获取 404

nginx -t

sudo sytemctl reload nginx

相关内容