改进 nginx 服务器阻止非 www 为 www

改进 nginx 服务器阻止非 www 为 www

我们当前的“非 www 到 www”代码nginx.conf如下。虽然它似乎可以工作,但现在我们注意到它会导致错误。

请不要标记为重复。类似的案例已经过时了,似乎不再有效。谢谢。

当我们创建 nginx 时,用户输入“example.com”,系统会正确提供“https://www.example.com”服务,因此我们的初始版本nginx.conf有效。但后来 Chrome (~2021) 采用了默认的“https”,我们没有注意到用户在向“www”域生成 SSL 时,通过“https://example.com”提供服务时收到 SSL 错误。

最近我们发现了这个问题并进行了nginx.conf如下更新。我们没有找到一种合适的方法,可以在不向“example.com”颁发 SSL 证书的情况下将“https://example.com”更改为“https://www.example.com”。

最近,有人注意到 WordPress 访问某些页面(包括wp-admin页面)时速度有些慢。memory_limit增加了,但并没有改变这种行为。然后我们issues在“工具 > 站点健康”中注意到:The REST API encountered an errorYour site could not complete a loopback request。然后我们深入研究了这个问题,发现虽然 WordPress 有“URL = IP”(发布前),但没有显示任何问题;当它更改为“URL = www.example.com”时,这些问题就会出现。

在我看来,根本原因就在这里nginx.conf,我们希望得到一些建议。

# Moves to HTTPS and serve certbot certificates
server {
        listen          80;
        server_name     example.com www.example.com app.example.com;
        location ~ /.well-known/acme-challenge/ {
                root    /var/www/certbot;
        }
        location / {
                return  301     https://$host$request_uri;
        }
}

# Includes www
server  {
        listen          443 ssl;
        server_name     example.com;
        error_log       /var/log/nginx/example.com.error.log;
        access_log      /var/log/nginx/example.com.access.log;
        ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_dhparam             /etc/letsencrypt/dhparams.pem;
        return          301     https://www.example.com$request_uri;
}

# WordPress site
server  {
        listen          443 ssl;
        server_name     www.example.com;
        error_log       /var/log/nginx/www.example.com.error.log;
        access_log      /var/log/nginx/www.example.com.access.log;
        ssl_certificate         /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/www.example.com/privkey.pem;
        ssl_dhparam             /etc/letsencrypt/dhparams.pem;
        location ^~ / {
                proxy_pass              http://10.0.0.131:80;
                proxy_set_header        Host                    $host;
                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;
        }
}

server  {
        listen          443 ssl;
        server_name     app.example.com;
        error_log       /var/log/nginx/app.example.com.error.log;
        access_log      /var/log/nginx/app.example.com.access.log;
        ssl_certificate        /etc/letsencrypt/live/app.example.com/fullchain.pem;
        ssl_certificate_key    /etc/letsencrypt/live/app.example.com/privkey.pem;
        ssl_dhparam            /etc/letsencrypt/dhparams.pem;
        location ^~ / {
                proxy_pass              http://10.0.0.160:80;
                proxy_set_header        Host                    $host;
                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;
        }
        error_page      400 401 402 403 404 500 502 503 504 =200                /error/unavailable.html;
        location = /error/unavailable.html {
                internal;
                alias /etc/nginx/html/error/;
                try_files /unavailable.html =404;
                access_log      /var/log/nginx/error.log;
        }
}

更新 1:

错误 #1:

测试 REST API 时遇到错误:

REST API 端点: https://www.example.com/index.php?rest_route=%2Fwp%2Fv2%2Ftypes%2Fpost&context=edit

REST API 响应:(http_request_failed)cURL 错误 28:连接在 10000 毫秒后超时

错误 #2:

对您网站的环回请求失败,这意味着依赖它们的功能目前无法按预期运行。错误:cURL 错误 28:连接在 10001 毫秒后超时(http_request_failed)

更新2:

布局:防火墙设备 (10.0.0.1) 后面有一个 proxmox 服务器 (10.0.0.3)。proxmox 上有 2 个容器:nginx (10.0.0.125) 和 wordpress (10.0.0.131)。“应用服务器”(10.0.0.160) 在另一台机器上运行。

防火墙:在 proxmox 上禁用(集群级别的“pve-firewall stop”);在容器上禁用 ufw;在 wordpress 上禁用“wordfence”。

关于“连接被拒绝”,防火墙设备日志没有显示任何阻止。我猜想,由于这是尝试在同一接口下连接两个设备,因此在这种情况下防火墙设备不会干扰。在容器内的“wordfence”中,我没有看到带有“wp-json”(这是 http 请求的一部分)的记录。

nginx 容器(10.0.0.125)“/etc/hostname”:nginx

nginx 容器(10.0.0.125)“/etc/hosts”:

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
# --- BEGIN PVE ---
10.0.0.125 nginx.local nginx
# --- END PVE ---

wordpress 容器(10.0.0.131)“/etc/hostname”:示例

wordpress 容器(10.0.0.131)“/etc/hosts”:

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
# --- BEGIN PVE ---
10.0.0.131 example.com example
# --- END PVE ---

Ping:nginx 和 wordpress 容器都可以 ping proxmox(10.0.0.3)、防火墙接口(10.0.0.1)、google.com 以及彼此。

答案1

我对你的问题有点困惑,但是......

返回 301 https://$host$request_uri;

这有点傻。$host 解析为 server_name 值列表中的第一个条目。因此它将重定向到 example.com

而不向“example.com”颁发 SSL 证书。

那么?这不会花费你任何钱。但是你为什么要有 2 个单独的证书,而不是只使用一个包含两个域名的证书呢?(顺便说一句,这不会解决你的“缓慢”问题 - 这只是良好的管理)。

WordPress 有些慢

只是一些?或者你的意思是“更慢”?Wordpress 性能是一个矛盾的说法。

而 WordPress 有“URL = IP”(在发布之前)

也许这是 Wordpress 的一些内部工作原理 - 我很难从您的描述中得出什么意义。找到正在访问的 URL 并从服务器主机亲自尝试它们。检查相应的日志条目。如果这不能回答您的问题,请尝试在此处询问导致问题的 URL 和示例日志条目。

答案2

您是否有/可以获得可同时用于这两种用途的 SSL 证书www.example.com和 example.com?消除这个潜在问题源可能会缓解其他问题……

修改阶段顺序 好。因此,下一个阶段是在 nginx.conf 中拉起排水管并测试流量传播。

  1. 使用防火墙外的机器 A 上的 curl 或 wget 检查是否可以访问 proxmox 机器。我建议在 proxmox 机器本身上配置 nginx - 即 10.0.0.3

只需使用显示静态页面的简单 nginx.conf。

  1. 然后从同一台机器 A 检查您是否可以在 proxmox 机器上的容器中访问 nginx。因此,简单的 nginx.config 在 10.0.0.125 上运行 - 并且在 proxmox 机器上公开了一个端口,该端口将重新路由到 10.0.0.125:80

  2. 一旦发生这种情况,请尝试将多个 DNS 监听(www.example.com、app.example.com 等)进入容器中的 nginx。检查它是否与端口 80 配合使用,然后使用 443 上的 SSL...

现在回到我之前执行的第 2 步。

  1. 尝试将欺骗性的 HTTP 返回代码故意放入位置块中...这是一种发现 nginx.conf 实际在做什么的简单方法。

服务器名称:www.example.com
...
位置 ^~ / {
返回 401 "已到达位置块 1
代理密码 ”http://10.0.0.1:80;
...
}

服务器名称:app.example.com
...
位置^~ / {
返回402“已到达位置区块 2
代理密码 ”http://10.0.0.111:80;
...
}

让我们知道您得到了什么..请在错误或访问日志中发布任何条目..

相关内容