✨ 反向代理 gRPC 端口(支持 Cloudflare CDN)
This commit is contained in:
		
							parent
							
								
									57e556eea1
								
							
						
					
					
						commit
						00c712116e
					
				
							
								
								
									
										40
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								README.md
									
									
									
									
									
								
							@ -322,10 +322,10 @@ restart() {
 | 
				
			|||||||
</details>
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<details>
 | 
					<details>
 | 
				
			||||||
    <summary>Agent 连接 Dashboard 域名开启 Cloudflare CDN</summary>
 | 
					    <summary>反向代理 gRPC 端口(支持 Cloudflare CDN)</summary>
 | 
				
			||||||
根据 Cloudflare gRPC 的要求:gRPC 服务必须侦听 443 端口 且必须支持 TLS 和 HTTP/2。我们可以使用 nginx 反向代理 gRPC 并配置 SSL/TLS 证书。
 | 
					使用 Nginx 或者 Caddy 反向代理 gRPC
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- nginx 配置,比如 Agent 连接 Dashboard 的域名为 ip-to-dashboard.nai.ba,为 nginx 添加如下配置,然后重新启动 nginx 或者重新加载配置文件。
 | 
					- Nginx 配置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```nginx
 | 
					```nginx
 | 
				
			||||||
server {
 | 
					server {
 | 
				
			||||||
@ -339,18 +339,44 @@ server {
 | 
				
			|||||||
    underscores_in_headers on;
 | 
					    underscores_in_headers on;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    location / {
 | 
					    location / {
 | 
				
			||||||
 | 
					        grpc_read_timeout 300s;
 | 
				
			||||||
 | 
					        grpc_send_timeout 300s;
 | 
				
			||||||
        grpc_pass grpc://localhost:5555;
 | 
					        grpc_pass grpc://localhost:5555;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- Agent 端配置,编辑 `/etc/systemd/system/nezha-agent.service`,在 `ExecStart=` 这一行的末尾加上 `--tls`,然后重启 nezha-agent.service。例如:
 | 
					- Caddy 配置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```bash
 | 
					```Caddyfile
 | 
				
			||||||
ExecStart=/opt/nezha/agent/nezha-agent -s ip-to-dashboard.nai.ba:443 -p xxxxxx --tls
 | 
					ip-to-dashboard.nai.ba:443 { 
 | 
				
			||||||
 | 
					    reverse_proxy {
 | 
				
			||||||
 | 
					        to localhost:5555
 | 
				
			||||||
 | 
					        transport http {
 | 
				
			||||||
 | 
					            versions h2c 2
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
- 在 Cloudflare 中将对应的域名解析设置橙色云开启CDN,并在网络选项中启用gRPC。
 | 
					
 | 
				
			||||||
 | 
					Dashboard 面板端配置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 首先登录面板进入管理后台 打开设置页面,在 `未接入CDN的面板服务器域名/IP` 中填入上一步在 Nginx 或 Caddy 中配置的域名 比如 `ip-to-dashboard.nai.ba` ,并保存。
 | 
				
			||||||
 | 
					- 然后在面板服务器中,打开 /opt/nezha/dashboard/data/config.yaml 文件,将 `proxygrpcport` 修改为 Nginx 或 Caddy 监听的端口,比如上一步设置的 `443` ;因为我们在 Nginx 或 Caddy 中开启了 SSL/TLS,所以需要将 `tls` 设置为 `true` ;修改完成后重启面板。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Agent 端配置
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 登录面板管理后台,复制一键安装命令,在对应的服务器上面执行一键安装命令重新安装 agent 端即可。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					开启 Cloudflare CDN(可选)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					根据 Cloudflare gRPC 的要求:gRPC 服务必须侦听 443 端口 且必须支持 TLS 和 HTTP/2。
 | 
				
			||||||
 | 
					所以如果需要开启CDN,必须在配置 Nginx 或者 Caddy 反向代理 gRPC 时使用 443 端口,并配置证书(Caddy 会自动申请并配置证书)。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- 登录 Cloudflare,选择使用的域名。打开 `网络` 选项将 `gRPC` 开关打开,打开 `DNS` 选项,找到 Nginx 或 Caddy 反代 gRPC 配置的域名的解析记录,打开橙色云启用CDN。
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</details>
 | 
					</details>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -218,6 +218,8 @@ func doTask(task *pb.Task) {
 | 
				
			|||||||
		handleCommandTask(task, &result)
 | 
							handleCommandTask(task, &result)
 | 
				
			||||||
	case model.TaskTypeUpgrade:
 | 
						case model.TaskTypeUpgrade:
 | 
				
			||||||
		handleUpgradeTask(task, &result)
 | 
							handleUpgradeTask(task, &result)
 | 
				
			||||||
 | 
						case model.TaskTypeKeepalive:
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		println("不支持的任务:", task)
 | 
							println("不支持的任务:", task)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
				
			|||||||
@ -193,6 +193,7 @@ func main() {
 | 
				
			|||||||
	go rpc.ServeRPC(dao.Conf.GRPCPort)
 | 
						go rpc.ServeRPC(dao.Conf.GRPCPort)
 | 
				
			||||||
	serviceSentinelDispatchBus := make(chan model.Monitor)
 | 
						serviceSentinelDispatchBus := make(chan model.Monitor)
 | 
				
			||||||
	go rpc.DispatchTask(serviceSentinelDispatchBus)
 | 
						go rpc.DispatchTask(serviceSentinelDispatchBus)
 | 
				
			||||||
 | 
						go rpc.DispatchKeepalive()
 | 
				
			||||||
	go dao.AlertSentinelStart()
 | 
						go dao.AlertSentinelStart()
 | 
				
			||||||
	dao.NewServiceSentinel(serviceSentinelDispatchBus)
 | 
						dao.NewServiceSentinel(serviceSentinelDispatchBus)
 | 
				
			||||||
	srv := controller.ServeWeb(dao.Conf.HTTPPort)
 | 
						srv := controller.ServeWeb(dao.Conf.HTTPPort)
 | 
				
			||||||
 | 
				
			|||||||
@ -57,3 +57,17 @@ func DispatchTask(serviceSentinelDispatchBus <-chan model.Monitor) {
 | 
				
			|||||||
		dao.SortedServerLock.RUnlock()
 | 
							dao.SortedServerLock.RUnlock()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func DispatchKeepalive() {
 | 
				
			||||||
 | 
						dao.Cron.AddFunc("@every 60s", func() {
 | 
				
			||||||
 | 
							dao.SortedServerLock.RLock()
 | 
				
			||||||
 | 
							defer dao.SortedServerLock.RUnlock()
 | 
				
			||||||
 | 
							for i := 0; i < len(dao.SortedServerList); i++ {
 | 
				
			||||||
 | 
								if dao.SortedServerList[i] == nil || dao.SortedServerList[i].TaskStream == nil || dao.SortedServerList[i].TaskStream.Context().Err() != nil {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								dao.SortedServerList[i].TaskStream.Send(&pb.Task{Type: model.TaskTypeKeepalive})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -39,6 +39,8 @@ type Config struct {
 | 
				
			|||||||
	GRPCPort                   uint
 | 
						GRPCPort                   uint
 | 
				
			||||||
	GRPCHost                   string
 | 
						GRPCHost                   string
 | 
				
			||||||
	EnableIPChangeNotification bool
 | 
						EnableIPChangeNotification bool
 | 
				
			||||||
 | 
						ProxyGRPCPort              uint
 | 
				
			||||||
 | 
						TLS                        bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// IP变更提醒
 | 
						// IP变更提醒
 | 
				
			||||||
	Cover                 uint8  // 覆盖范围
 | 
						Cover                 uint8  // 覆盖范围
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,7 @@ const (
 | 
				
			|||||||
	TaskTypeCommand
 | 
						TaskTypeCommand
 | 
				
			||||||
	TaskTypeTerminal
 | 
						TaskTypeTerminal
 | 
				
			||||||
	TaskTypeUpgrade
 | 
						TaskTypeUpgrade
 | 
				
			||||||
 | 
						TaskTypeKeepalive
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type TerminalTask struct {
 | 
					type TerminalTask struct {
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								resource/template/component/server.html
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								resource/template/component/server.html
									
									
									
									
										vendored
									
									
								
							@ -31,7 +31,8 @@
 | 
				
			|||||||
                    {{if .Conf.GRPCHost}}
 | 
					                    {{if .Conf.GRPCHost}}
 | 
				
			||||||
                    curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod
 | 
					                    curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod
 | 
				
			||||||
                    +x nezha.sh && sudo ./nezha.sh install_agent <code class="command">{{.Conf.GRPCHost}}</code> <code
 | 
					                    +x nezha.sh && sudo ./nezha.sh install_agent <code class="command">{{.Conf.GRPCHost}}</code> <code
 | 
				
			||||||
                        class="command">{{.Conf.GRPCPort}}</code> <code class="command hostSecret"></code>
 | 
					                        class="command">{{if .Conf.ProxyGRPCPort}}{{.Conf.ProxyGRPCPort}}{{else}}{{.Conf.GRPCPort}}{{end}}</code> <code
 | 
				
			||||||
 | 
					                        class="command hostSecret"></code> <code class="command">{{if .Conf.TLS}}--tls{{end}}</code>
 | 
				
			||||||
                    {{else}}
 | 
					                    {{else}}
 | 
				
			||||||
                    请先在设置页面配置 未接入CDN的面板服务器域名/IP
 | 
					                    请先在设置页面配置 未接入CDN的面板服务器域名/IP
 | 
				
			||||||
                    {{end}}
 | 
					                    {{end}}
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,7 @@
 | 
				
			|||||||
                    <td>{{$server.Secret}}</td>
 | 
					                    <td>{{$server.Secret}}</td>
 | 
				
			||||||
                    <td>
 | 
					                    <td>
 | 
				
			||||||
                        <button class="ui icon green mini button"
 | 
					                        <button class="ui icon green mini button"
 | 
				
			||||||
                            data-clipboard-text="{{if $.Conf.GRPCHost}}curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod +x nezha.sh && sudo ./nezha.sh install_agent {{$.Conf.GRPCHost}} {{$.Conf.GRPCPort}} {{$server.Secret}}{{else}}请先在设置页面配置 未接入CDN的面板服务器域名/IP{{end}}"
 | 
					                            data-clipboard-text="{{if $.Conf.GRPCHost}}curl -L https://raw.githubusercontent.com/naiba/nezha/master/script/install.sh -o nezha.sh && chmod +x nezha.sh && sudo ./nezha.sh install_agent {{$.Conf.GRPCHost}} {{if $.Conf.ProxyGRPCPort}}{{$.Conf.ProxyGRPCPort}}{{else}}{{$.Conf.GRPCPort}}{{end}} {{$server.Secret}}{{if $.Conf.TLS}} --tls{{end}}{{else}}请先在设置页面配置 未接入CDN的面板服务器域名/IP{{end}}"
 | 
				
			||||||
                            data-tooltip="点击复制安装命令">
 | 
					                            data-tooltip="点击复制安装命令">
 | 
				
			||||||
                            <i class="linux icon"></i>
 | 
					                            <i class="linux icon"></i>
 | 
				
			||||||
                        </button>
 | 
					                        </button>
 | 
				
			||||||
 | 
				
			|||||||
@ -203,8 +203,8 @@ install_agent() {
 | 
				
			|||||||
        mv nezha-agent $NZ_AGENT_PATH &&
 | 
					        mv nezha-agent $NZ_AGENT_PATH &&
 | 
				
			||||||
        rm -rf nezha-agent_linux_${os_arch}.tar.gz README.md
 | 
					        rm -rf nezha-agent_linux_${os_arch}.tar.gz README.md
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ $# == 3 ]]; then
 | 
					    if [ $# -ge 3 ]; then
 | 
				
			||||||
        modify_agent_config $1 $2 $3
 | 
					        modify_agent_config "$@"
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        modify_agent_config 0
 | 
					        modify_agent_config 0
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
@ -223,7 +223,7 @@ modify_agent_config() {
 | 
				
			|||||||
        return 0
 | 
					        return 0
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ $# != 3 ]]; then
 | 
					    if [ $# -lt 3 ]; then
 | 
				
			||||||
        echo "请先在管理面板上添加Agent,记录下密钥" &&
 | 
					        echo "请先在管理面板上添加Agent,记录下密钥" &&
 | 
				
			||||||
            read -ep "请输入一个解析到面板所在IP的域名(不可套CDN): " nz_grpc_host &&
 | 
					            read -ep "请输入一个解析到面板所在IP的域名(不可套CDN): " nz_grpc_host &&
 | 
				
			||||||
            read -ep "请输入面板RPC端口: (5555)" nz_grpc_port &&
 | 
					            read -ep "请输入面板RPC端口: (5555)" nz_grpc_port &&
 | 
				
			||||||
@ -242,12 +242,16 @@ modify_agent_config() {
 | 
				
			|||||||
        nz_client_secret=$3
 | 
					        nz_client_secret=$3
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    sed -i "s/nz_grpc_host/${nz_grpc_host}/" ${NZ_AGENT_SERVICE}
 | 
					    sed -i "s/nz_grpc_host/${nz_grpc_host}/" ${NZ_AGENT_SERVICE}
 | 
				
			||||||
    sed -i "s/nz_grpc_port/${nz_grpc_port}/" ${NZ_AGENT_SERVICE}
 | 
					    sed -i "s/nz_grpc_port/${nz_grpc_port}/" ${NZ_AGENT_SERVICE}
 | 
				
			||||||
    sed -i "s/nz_client_secret/${nz_client_secret}/" ${NZ_AGENT_SERVICE}
 | 
					    sed -i "s/nz_client_secret/${nz_client_secret}/" ${NZ_AGENT_SERVICE}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    shift 3
 | 
				
			||||||
 | 
					    if [ $# -gt 0 ]; then
 | 
				
			||||||
 | 
					        args=" $*"
 | 
				
			||||||
 | 
					        sed -i "/ExecStart/ s/$/${args}/" ${NZ_AGENT_SERVICE}
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    echo -e "Agent配置 ${green}修改成功,请稍等重启生效${plain}"
 | 
					    echo -e "Agent配置 ${green}修改成功,请稍等重启生效${plain}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    systemctl daemon-reload
 | 
					    systemctl daemon-reload
 | 
				
			||||||
@ -558,8 +562,9 @@ if [[ $# > 0 ]]; then
 | 
				
			|||||||
        uninstall_dashboard 0
 | 
					        uninstall_dashboard 0
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "install_agent")
 | 
					    "install_agent")
 | 
				
			||||||
        if [[ $# == 4 ]]; then
 | 
					        shift
 | 
				
			||||||
            install_agent $2 $3 $4
 | 
					        if [ $# -ge 3 ]; then
 | 
				
			||||||
 | 
					            install_agent "$@"
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            install_agent 0
 | 
					            install_agent 0
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user