跟进先前问题我的。
我想做的事?
我希望我的反向代理 [NGINX] 根据子域将传入的网络流量(HTTP 和 HTTPS)重定向到正确的服务器。
从互联网到反向代理 (RP) 的流量应该使用 HTTPS,而在我的网络内部,我不介意 http 流量。
我目前的情况如何?
我已经运行了我的 Web 服务,目前只有 2 个,iRedMail 和 Kanboard。两者都可以通过 http 访问,没有任何问题。我能够将我的 RP 中的通配符证书与其他服务器共享(我后来才知道,这不是必需的)。
但是,当我尝试通过 Firefox 通过 https 访问我的服务器域名时,我得到的PR_END_OF_FILE_ERROR
是 Chrome ERR:CONNECTION_CLOSED
。在这种情况下,无论我尝试访问 RP 本身上的 Web 服务器还是其他 2 个 Web 服务器都没有关系。
意思是说我了解带有 http 代理的 NGINX,但是在证书和 https 代理方面却失败了。
有关我的配置,请查看以下 pastebins,我不希望这篇文章太长。所有过去都将有效期 6 个月,如果有的话,我会编辑这个帖子来添加我的失败的配置。
最后我想到的是日志的输出:
(Reverse-Proxy)> sudo nano /var/log/nginx/error.log
2020/02/21 07:07:46 [error] 9213#9213: *1 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:08:27 [error] 9213#9213: *2 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:11:46 [error] 9320#9320: *1 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:12:03 [error] 9320#9320: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: XXX.XXX.XXX.XXX, server: www.domain.net, request: "GET /favic$
2020/02/21 07:12:07 [error] 9320#9320: *3 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:23:12 [error] 9320#9320: *4 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:23:12 [error] 9320#9320: *5 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:23:17 [error] 9320#9320: *6 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:23:47 [error] 9320#9320: *7 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:24:47 [error] 9320#9320: *8 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:29:47 [error] 9320#9320: *10 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:39:48 [error] 9320#9320: *11 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
2020/02/21 07:53:21 [error] 9320#9320: *12 no "ssl_certificate" is defined in server listening on SSL port while SSL handshaking, client: XXX.XXX.XXX.XXX, server: 0.0.0.0:443
我从早上 7 点到 9 点尝试了这个,但日志在早上 8 点左右因错误而停止。我还检查了 Kanboard 服务器的日志,但没有报告任何内容,无论是访问还是错误。
到目前为止我已经检查过:
- 如果我直接将 https 的端口转发更改为我的邮件服务器,我就可以毫无问题地访问它
- 我检查了我的 RP-config 中是否存在与证书相关的路径错误
我目前经历过的堆栈:
NGINX RP 用于多服务器,通过子域名重定向,家庭网络中的 NGINX SSL
如果您需要更多信息,请告诉我
。PS:我已更改所有 IP 和域。PPS
:pastebin 也用于我的证书问题。
编辑:
- Pastebin - Reverseproxy 已针对 SSL 配置进行了调整。(在 pastebin 中查找 ##)。
ERR_TOO_MANY_REDIRECTS
访问子域时出现新的错误消息。域本身部分正常运行。 - Pastebin - Reverseproxy 再次经过调整,找到了解决方案。每个更改都再次用 ## 注释
答案1
感谢 Richard Smith 和 Seth 给我提供一些东西并指出缺陷,我才能够让我的服务器正常运行。
最后,我得到了一个错误的反向代理配置——在某些设置上我一定是盲目的,但这是我所做的更改。
在内部>sudo nano /etc/nginx/sites-available/apache
(apache 是我的配置文件的名称,是的,我知道这会产生误导)。
我实际上改变了很多:
server {
listen 80;
listen 443 ssl; ## Listen on 443 ssl
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ## use this cert
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ## and this key
server_name example.com; ## react to this name-header
return 301 https://www.example.com; ## and redirect everything to www.example.com on https
}
之前我忘记使用证书和密钥的路径,而是使用了代理密码而不是重定向。
我还在我的配置中添加了一个新的块,它只会监听 www.example.com 上 80 的所有流量并将其重定向到 https,因此基本上与上面的另一个相同server-name
。
监听 443(https)的 www.example.com 块也发生了变化location
。
location / { ## in any scenario
root /var/www/html/; ## give this directory
}
我把路径向下移动,并添加了 root 指令。因为如果我理解本教程正确地说,将它放在意味着location /
它将只监听针对该目录的 URI 请求。
最后的变化是proxy_pass
针对 Kanboard 和 iRedMail 服务器。
之前:
location / {
proxy_pass http://10.10.10.26;
...
}
后:
location / {
proxy_pass https://10.10.10.26;
...
}
我必须承认,我不太清楚为什么我必须通过 https 传递流量,但这仅仅意味着我不完全理解代理和/或反向代理。
(我预计使用 https 发送密码会再次给我关于多个证书的警告,并且还认为使用“密码”通信将在我的网络中继续,这意味着 http 流量就足够了)。
附言:@Seth,以下消息是我使用 example.com 的原因
正文不能包含“My-Fake-Domain”。
请使用 example.com(或 .org 或 .net)作为虚假 URL。更多信息
整个配置以及注释的更改将在未来 6 个月内在我的 pastebin 中提供。
再说一次,如果您需要更多信息,如果我(再次)犯了错误或者我的更改有缺陷,请告诉我。
答案2
错误通常与浏览器无关。在我们的案例中,这也不是 nginx 的配置问题,而是防火墙的错误设置。因此,从逻辑上讲,当我说这通常与浏览器、服务器端而不是客户端无关时。因此,这不是代理或 VPN。