Nginx 反向代理 Xray-core gRPC 不断流配置方案

众所周知,gRPC 建立于 HTTP/2 之上,并且内置了多路复用(MUX)机制,因此,gRPC能够最大限度的降低连接延迟,同时单条连接性能也得到了极大的提升。

需要注意,如果您想通过在 Xray-core 部署 gRPC 来获得显著的体验提升,需要一条质量较好的线路作为支撑。如果您的 VPS 线路状况不够理想,我们不建议在其上部署 gRPC 服务。

本案例中,我们同样选择使用 Nginx 作为前置反向代理(同时处理 TLS 连接) 转发请求给Xray-core。

另外,根据一些用户的使用体验,通过 gRPC 连接 Xray 时常有断流现象的发生,乃至于需要在客户端操作重新连接服务,较为繁琐。本文针对此类现象,对 Nginx 配置进行了优化,经过测试能够避免断流现象的发生。

Xray-core 配置(config.json)

{
    "log": {
        "loglevel": "warning",
        "error": "/var/log/xray/error.log"
    },
    "inbounds": [
        {
            "listen": "/dev/shm/xray_grpc.sock,666",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "XXXX-XXXX-XXXX-XXXX-XXX",
                        "level": 0,
                        "email": "[email protected]"
                    }
                ],
                "decryption":"none"
            },
            "streamSettings": {
                "network": "grpc",
                "security": "none",
                "grpcSettings": {
                    "serviceName": "xxxxxx"
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom",
            "tag": "direct"
        },
        {
            "protocol": "blackhole",
            "tag": "block"
        }
    ]
}

注意,上述 "id""serviceName" 配置参数值请根据实际需求进行修改。诸如针对特定国家及地区的服务屏蔽以及针对 IPV4、IPV6的分流方案,一些注意事项。请参考此处

Nginx 配置

请在 Nginx 配置文件 nginx.conf 中 http 部分末尾添加如下配置:

    upstream  GRPC {
        server unix:/dev/shm/xray_grpc.sock;
        keepalive 500;
        keepalive_timeout 7d;
        keepalive_requests 100000;
    }

在 sites-availabe 目录站点配置文件 default 或对应文件 server 部分添加以下配置:

        location /xxxxxx { 
                if ($content_type !~ "application/grpc") {
                    return 404;
                }

                if ($request_method != "POST") {
                    return 404;
                
                }

                grpc_set_header Connection "";
                client_body_timeout 300s;
                client_max_body_size 0;
                client_body_buffer_size 8k;
                grpc_connect_timeout 10s;
                proxy_buffering off;
                #grpc_buffer_size 100m;
                grpc_read_timeout 1d;
                grpc_send_timeout 1d;
                grpc_socket_keepalive on;
                grpc_pass grpc://GRPC;

                grpc_set_header X-Real-IP $remote_addr;
                grpc_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

注意,location /xxxxxx 请根据实际需求设定,必须与上文中 Xray-core 配置中 “serviceName” 参数值保持一致。

Nginx 完整配置以及性能、安全性优化。请见这里

没错,结合 这篇文章 您可以选择同时配置 vless-tls-ws 及 vless-gRPC 服务,根据具体使用场景选择性使用,相较而言,vless-tls-ws 方案具有更高的稳定性,而 gRPC 则具备较小的数据延迟特性

最后,需要指出的是,此两类方案同时支持通过 CloudFlare CDN 进行转发。在配置使用 CloudFlare 进行中转时,不要忘记打开其“网络”设置菜单中的 WebSocket 以及 gRPC 开关。