75 lines
16 KiB
JavaScript
75 lines
16 KiB
JavaScript
import{_ as s,o as n,c as a,R as l}from"./chunks/framework.44fd0451.js";const i=JSON.parse('{"title":"反向代理 gRPC 端口(支持 Cloudflare CDN)","description":"","frontmatter":{},"headers":[],"relativePath":"guide/q3.md","filePath":"guide/q3.md","lastUpdated":1717546110000}'),p={name:"guide/q3.md"},o=l(`<h1 id="反向代理-grpc-端口-支持-cloudflare-cdn" tabindex="-1">反向代理 gRPC 端口(支持 Cloudflare CDN) <a class="header-anchor" href="#反向代理-grpc-端口-支持-cloudflare-cdn" aria-label="Permalink to "反向代理 gRPC 端口(支持 Cloudflare CDN)""></a></h1><p>使用 Nginx 或者 Caddy 反向代理 gRPC</p><ul><li>Nginx 配置</li></ul><div class="language-nginx"><button title="Copy Code" class="copy"></button><span class="lang">nginx</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#C792EA;">server</span><span style="color:#A6ACCD;"> {</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> listen </span><span style="color:#A6ACCD;">443 ssl http2</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> listen </span><span style="color:#A6ACCD;">[::]:443 ssl http2</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> server_name </span><span style="color:#A6ACCD;">data.example.com</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;"># 你的 Agent 连接 Dashboard 的域名</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> ssl_certificate </span><span style="color:#A6ACCD;"> /data/letsencrypt/fullchain.pem</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;"># 你的域名证书路径</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> ssl_certificate_key </span><span style="color:#A6ACCD;"> /data/letsencrypt/key.pem</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;"># 你的域名私钥路径</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> ssl_stapling </span><span style="color:#A6ACCD;">on</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> ssl_session_timeout </span><span style="color:#A6ACCD;">1d</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> ssl_session_cache </span><span style="color:#A6ACCD;">shared:SSL:10m</span><span style="color:#89DDFF;">;</span><span style="color:#A6ACCD;"> </span><span style="color:#676E95;font-style:italic;"># 此项可能会和其他配置文件冲突,如冲突请注释此项</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> ssl_protocols </span><span style="color:#A6ACCD;">TLSv1.1 TLSv1.2 TLSv1.3</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> underscores_in_headers </span><span style="color:#A6ACCD;">on</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> keepalive_time </span><span style="color:#A6ACCD;">24h</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> keepalive_requests </span><span style="color:#A6ACCD;">100000</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> keepalive_timeout </span><span style="color:#A6ACCD;">120s</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#C792EA;">location</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">/ </span><span style="color:#A6ACCD;">{</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> grpc_read_timeout </span><span style="color:#A6ACCD;">300s</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> grpc_send_timeout </span><span style="color:#A6ACCD;">300s</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> grpc_socket_keepalive </span><span style="color:#A6ACCD;">on</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> grpc_pass </span><span style="color:#A6ACCD;">grpc://grpcservers</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> }</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">}</span></span>
|
||
<span class="line"></span>
|
||
<span class="line"><span style="color:#C792EA;">upstream</span><span style="color:#A6ACCD;"> </span><span style="color:#FFCB6B;">grpcservers </span><span style="color:#A6ACCD;">{</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">server</span><span style="color:#A6ACCD;"> localhost:5555;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;"> keepalive </span><span style="color:#A6ACCD;">512</span><span style="color:#89DDFF;">;</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><ul><li>Caddy 配置</li></ul><div class="language-"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#A6ACCD;">data.example.com:443 { # 你的 Agent 连接 Dashboard 的域名</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> reverse_proxy {</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> to localhost:5555</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> transport http {</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> versions h2c 2</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> }</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;"> }</span></span>
|
||
<span class="line"><span style="color:#A6ACCD;">}</span></span></code></pre></div><p>Dashboard 面板端配置</p><ul><li>首先登录面板进入管理后台 打开设置页面,在 <code>未接入CDN的面板服务器域名/IP</code> 中填入上一步在 Nginx 或 Caddy 中配置的域名 比如 <code>data.example.com</code> ,并保存。</li><li>然后在面板服务器中,打开 /opt/nezha/dashboard/data/config.yaml 文件,将 <code>proxygrpcport</code> 修改为 Nginx 或 Caddy 监听的端口,比如上一步设置的 <code>443</code> ;因为我们在 Nginx 或 Caddy 中开启了 SSL/TLS,所以需要将 <code>tls</code> 设置为 <code>true</code> ;修改完成后重启面板。</li></ul><p>Agent 端配置</p><ul><li>登录面板管理后台,复制一键安装命令,在对应的服务器上面执行一键安装命令重新安装 agent 端即可。</li></ul><p>开启 Cloudflare CDN(可选)</p><p>根据 Cloudflare gRPC 的要求:gRPC 服务必须侦听 443 端口 且必须支持 TLS 和 HTTP/2。 所以如果需要开启 CDN,必须在配置 Nginx 或者 Caddy 反向代理 gRPC 时使用 443 端口,并配置证书(Caddy 会自动申请并配置证书)。</p><ul><li>登录 Cloudflare,选择使用的域名。打开 <code>网络</code> 选项将 <code>gRPC</code> 开关打开,打开 <code>DNS</code> 选项,找到 Nginx 或 Caddy 反代 gRPC 配置的域名的解析记录,打开橙色云启用 CDN。</li></ul><p>开启<code>gRPC</code>后,可能不能立即可用,需要等待一段时间。具体可通过<code>curl</code>和使用<code>nezha-agent -d</code>来验证:</p><div class="language-bash"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki material-theme-palenight"><code><span class="line"><span style="color:#FFCB6B;">localhost:~/agent#</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">curl</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-H</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">content-type: application/grpc+proto</span><span style="color:#89DDFF;">"</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-H</span><span style="color:#A6ACCD;"> </span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">authorization: Bearer test</span><span style="color:#89DDFF;">"</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">https://xxx.xxx.ovh</span><span style="color:#A6ACCD;"> </span><span style="color:#C3E88D;">-v</span><span style="color:#A6ACCD;"> </span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> processing: https://xxx.xxx.ovh</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Trying </span><span style="color:#89DDFF;">[</span><span style="color:#F78C6C;">2606</span><span style="color:#A6ACCD;">:4700:3035::ac43:8bed</span><span style="color:#89DDFF;">]</span><span style="color:#A6ACCD;">:443...</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Connected to xxx.xxx.ovh </span><span style="color:#89DDFF;">(</span><span style="color:#FFCB6B;">2606:4700:3035::ac43:8bed</span><span style="color:#89DDFF;">)</span><span style="color:#A6ACCD;"> port 443</span></span>
|
||
<span class="line"><span style="color:#676E95;font-style:italic;"># ... SSL info</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> using HTTP/2</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> h2 </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">:method: GET</span><span style="color:#89DDFF;">]</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> h2 </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">:scheme: https</span><span style="color:#89DDFF;">]</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> h2 </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">:authority: xxx.xxx.ovh</span><span style="color:#89DDFF;">]</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> h2 </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">:path: /</span><span style="color:#89DDFF;">]</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> h2 </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">user-agent: curl/8.2.1</span><span style="color:#89DDFF;">]</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> h2 </span><span style="color:#89DDFF;">[</span><span style="color:#A6ACCD;">accept: </span><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;">/</span><span style="color:#89DDFF;">*]</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;"> Using Stream ID: 1</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">></span><span style="color:#A6ACCD;"> GET / HTTP/2</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">></span><span style="color:#A6ACCD;"> Host: xxx.xxx.ovh</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">></span><span style="color:#A6ACCD;"> User-Agent: curl/8.4.0</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">></span><span style="color:#A6ACCD;"> Accept: </span><span style="color:#89DDFF;">*</span><span style="color:#A6ACCD;">/</span><span style="color:#89DDFF;">*</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">></span><span style="color:#A6ACCD;"> content-type: application/grpc+proto</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">></span><span style="color:#A6ACCD;"> authorization: Bearer test</span></span>
|
||
<span class="line"><span style="color:#89DDFF;">></span><span style="color:#A6ACCD;"> </span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> HTTP/2 405 </span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> date: Wed, 20 Dec 2023 08:56:27 GMT</span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> content-type: application/grpc+proto</span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> cf-ray: 8386ac12dabd5ddc-HKG</span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> cf-cache-status: DYNAMIC</span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> grpc-message: Received a HEADERS frame with :method </span><span style="color:#89DDFF;">"</span><span style="color:#C3E88D;">GET</span><span style="color:#89DDFF;">"</span><span style="color:#A6ACCD;"> which should be POST</span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> grpc-status: 13</span></span>
|
||
<span class="line"><span style="color:#89DDFF;"><</span><span style="color:#A6ACCD;"> report-to: </span><span style="color:#89DDFF;">{</span><span style="color:#FFCB6B;">"endpoints"</span><span style="color:#82AAFF;">:</span><span style="color:#A6ACCD;">[{"</span><span style="color:#FFCB6B;">url</span><span style="color:#FFCB6B;">":"</span><span style="color:#FFCB6B;">https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s</span><span style="color:#A6ACCD;">=%2BTjgJvXWyRF11nUOYx9Lq7UDC1xOYBLtjvWrdjVJQIqu9YqnFJeZFran2KRs6zabQc%2BLV8AubNqYRYDb7hQAZe6bglmVz0wQjrb0tNovYf%2B59SAp%2BQfZnH%2BAFDydNT95ZCmTPnKgWetcwQiUfXU%3D</span><span style="color:#FFCB6B;">"}],"</span><span style="color:#FFCB6B;">group</span><span style="color:#FFCB6B;">":"</span><span style="color:#FFCB6B;">cf-nel</span><span style="color:#FFCB6B;">","</span><span style="color:#FFCB6B;">max_age</span><span style="color:#FFCB6B;">":604800}</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">< nel: {"</span><span style="color:#FFCB6B;">success_fraction</span><span style="color:#FFCB6B;">":0,"</span><span style="color:#FFCB6B;">report_to</span><span style="color:#FFCB6B;">":"</span><span style="color:#FFCB6B;">cf-nel</span><span style="color:#FFCB6B;">","</span><span style="color:#FFCB6B;">max_age</span><span style="color:#FFCB6B;">":604800}</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">< vary: Accept-Encoding</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">< server: cloudflare</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">< alt-svc: h3="</span><span style="color:#FFCB6B;">:443</span><span style="color:#FFCB6B;">"; ma=86400</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">< </span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">* Connection #0 to host xxx.xxx.ovh left intact</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">localhost:~/agent# /opt/nezha/agent/nezha-agent -s nezha.xxx.xxx:443 -p YOUR_KEY --tls -d</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">NEZHA@2023-12-20 05:14:00>> 检查更新: 0.15.14</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">NEZHA@2023-12-20 05:14:01>> 上报系统信息失败: rpc error: code = Unknown desc = EOF # 需要修改主控端 /opt/nezha/dashboard/data/config.yaml的 GRPCHost 和 TLS 选项</span></span>
|
||
<span class="line"><span style="color:#FFCB6B;">NEZHA@2023-12-20 05:14:01>> Error to close connection ...</span></span></code></pre></div>`,15),e=[o];function t(c,r,D,C,y,F){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{i as __pageData,d as default};
|