哪吒探针监控面板CF掉线终极解决方法
# 【终极】哪吒监控 V1 使用唯一域名随意开关 CDN 且不用修改任何配置<br /><br />
>早前写过一篇《哪吒监控 V1 使用唯一域名开启 CDN 和反向代理配置教程》详细说明了怎样使用唯一域名开启 Cloudflare CDN 并利用 1Panel 配置反向代理。很多朋友使用了这个方法搭建了哪吒监控 V1 面板。<br />
<br />
>上周,所有使用了 Cloudflare CDN 的哪吒 V1 面板小鸡突然全部掉线,经过排查,事情与 Cloudflare 升级 gRPC 配置有关。虽然在故障大约 1 天后,Cloudflare CDN 已修复问题,但我还是重新写了一篇《哪吒监控 V1 使用唯一域名关闭 CDN 改用直连后的配置修改》给出了使用唯一域名关闭 CDN 改用直连后的配置。<br />
<br />
>那么,既然关闭和开启 CDN,每次都要更改反代配置,有没有方法直接使用同一套配置,不用做任何更改?这样下次出现 CDN 问题,只需要去 Cloudflare 的 DNS 里面关闭域名的小黄云就行?<br />
<br />
> # 答案是有的,以下就是终极懒人配置:<br />
<br />
> # 1Panel 域名证书<br />
>如果你使用的是 Cloudflare 的 15 年自签证书,现在需要更换为公开 CA 签发的免费证书(1Panel 自带申请免费证书并自动续签的功能),这样在关闭 CDN 后就不会出现证书链的问题(Cloudflare 的 SSL/TLS 加密模式更改为【完全】)。<br />
<br />
# 1Panel 域名配置文件<br />
>打开 1Panel 你添加的哪吒面板域名——配置文件,在最后面加上代码:<br />
<br />
```<br />
# 定义真实 IP 变量<br />
map $http_cf_connecting_ip $real_ip {<br />
"" $remote_addr;<br />
default $http_cf_connecting_ip;<br />
}<br />
<br />
# 允许头部包含下划线<br />
underscores_in_headers on;<br />
# 设置真实 IP 头部<br />
real_ip_header nz-realip;<br />
<br />
# 定义上游服务器<br />
upstream dashboard {<br />
keepalive 512;<br />
server 127.0.0.1:8008;<br />
}<br />
<br />
```<br />
# 如果你使用的是其它面板(比如宝塔)或程序,完整的配置文件结构应该是这样的:<br />
<br />
```<br />
http {<br />
# 其他全局配置...<br />
<br />
# 定义真实IP变量<br />
map $http_cf_connecting_ip $real_ip {<br />
"" $remote_addr;<br />
default $http_cf_connecting_ip;<br />
}<br />
<br />
# 允许头部包含下划线<br />
underscores_in_headers on;<br />
# 设置真实IP头部<br />
real_ip_header nz-realip;<br />
<br />
# 定义上游服务器<br />
upstream dashboard {<br />
keepalive 512;<br />
server 127.0.0.1:8008;<br />
}<br />
<br />
# 其他全局配置...<br />
<br />
server {<br />
# server配置...<br />
<br />
# 反向代理配置(location块)...<br />
}<br />
}<br />
<br />
```<br />
# 1Panel 域名反向代理源文<br />
<br />
<br />
```<br />
<br />
location ^~ / {<br />
proxy_pass http://127.0.0.1:8008;<br />
proxy_set_header Host $host;<br />
proxy_set_header X-Real-IP $remote_addr;<br />
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
proxy_set_header REMOTE-HOST $remote_addr;<br />
proxy_set_header Upgrade $http_upgrade;<br />
proxy_set_header nz-realip $real_ip; # 使用动态确定的真实 IP<br />
proxy_set_header Connection "upgrade";<br />
proxy_set_header X-Forwarded-Proto $scheme;<br />
proxy_http_version 1.1;<br />
proxy_read_timeout 1800s;<br />
proxy_send_timeout 1800s;<br />
proxy_buffer_size 128k;<br />
proxy_buffers 4 128k;<br />
proxy_busy_buffers_size 256k;<br />
proxy_max_temp_file_size 0;<br />
add_header X-Cache $upstream_cache_status;<br />
add_header Cache-Control no-cache;<br />
proxy_ssl_server_name on;<br />
add_header Strict-Transport-Security "max-age=31536000";<br />
}<br />
<br />
# gRPC 服务<br />
location ^~ /proto.NezhaService/ {<br />
grpc_set_header Host $host;<br />
grpc_set_header nz-realip $real_ip; # 使用动态确定的真实 IP<br />
grpc_read_timeout 600s;<br />
grpc_send_timeout 600s;<br />
grpc_socket_keepalive on;<br />
client_max_body_size 10m;<br />
grpc_buffer_size 4m;<br />
grpc_pass grpc://dashboard;<br />
}<br />
<br />
# WebSocket 服务<br />
location ~* ^/api/v1/ws/(server|terminal|file)(.*)$ {<br />
proxy_set_header Host $host;<br />
proxy_set_header nz-realip $real_ip; # 使用动态确定的真实IP<br />
proxy_set_header Origin https://$host;<br />
proxy_set_header Upgrade $http_upgrade;<br />
proxy_set_header Connection "upgrade";<br />
proxy_read_timeout 1800s;<br />
proxy_send_timeout 1800s;<br />
proxy_pass http://127.0.0.1:8008;<br />
}<br />
<br />
```<br />
<br />
# 这个配置的关键点:<br />
<br />
使用 map 指令创建一个名为 $real_ip 的变量;<br />
该变量会自动检测是否存在 $http_cf_connecting_ip:如果存在(开启 CDN),则使用 $http_cf_connecting_ip;如果不存在(关闭 CDN),则使用 $remote_addr。<br />
在所有需要使用真实 IP 的地方,统一使用 $real_ip 变量。<br />
# 面板后台设置<br />
前端真实 IP 请求头设置为 nz-realip<br />
Agent 真实 IP 请求头设置为 nz-realip<br />
无论是否开启 CDN 都不需要修改这个设置,因为我们通过 Nginx 的 map 指令动态确定了 nz-realip 头部的值:<br />
<br />
开启 CDN 时:nz-realip 的值是 Cloudflare 提供的 $http_cf_connecting_ip(访问者真实 IP);<br />
关闭 CDN 时:nz-realip 的值是 $remote_addr(直接访问的 IP)。<br />
至此,所有设置完成。<br />
这个统一配置的好处是简化了管理,不需要在切换 CDN 状态时手动修改 Nginx 配置和哪吒面板设置,系统会自动选择正确的 IP 来源。<br />
<br />
# 转载原文地址:https://misaka.es/archives/48.html
页:
[1]