我们当前的“非 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 error
和Your 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 中拉起排水管并测试流量传播。
- 使用防火墙外的机器 A 上的 curl 或 wget 检查是否可以访问 proxmox 机器。我建议在 proxmox 机器本身上配置 nginx - 即 10.0.0.3
只需使用显示静态页面的简单 nginx.conf。
然后从同一台机器 A 检查您是否可以在 proxmox 机器上的容器中访问 nginx。因此,简单的 nginx.config 在 10.0.0.125 上运行 - 并且在 proxmox 机器上公开了一个端口,该端口将重新路由到 10.0.0.125:80
一旦发生这种情况,请尝试将多个 DNS 监听(www.example.com、app.example.com 等)进入容器中的 nginx。检查它是否与端口 80 配合使用,然后使用 443 上的 SSL...
现在回到我之前执行的第 2 步。
- 尝试将欺骗性的 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;
...
}
让我们知道您得到了什么..请在错误或访问日志中发布任何条目..