nginx反向代理上的Geth websocket

nginx反向代理上的Geth websocket,nginx,blockchain,ethereum,web3js,geth,Nginx,Blockchain,Ethereum,Web3js,Geth,我尝试使用nginx作为反向代理通过websocket连接到我的私有geth区块链。这是我的设置: 节点设置: docker run -d --net mynet --ip 192.168.1.21 -v

我尝试使用nginx作为反向代理通过websocket连接到我的私有geth区块链。这是我的设置:

节点设置:

docker run                                                                  
    -d
    --net                       mynet
    --ip                        192.168.1.21
    -v                          myvol:/root
    ethereum/client-go:stable
        --datadir               "/root/geth1"                              
        --networkid             1029
        --syncmode              "full"

        --ws                                                              
        --wsaddr                "0.0.0.0"                                  
        --wsport                8546                                       
        --wsapi                 "eth,net,web3,rpc"                         
        --wsorigins="*"                                                            

        --bootnodes             $BOOTNODE                                  
        --port                  30303                                      
        --maxpeers              8                                          
        --nat                   "any"
server {
    #listen     80;
    listen      443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server ipv6only=on;

    server_name             mydomain.de;

    # basic auth stuff here
    # ssl stuff here

    location /mynode {

        if ($request_method = OPTIONS) {
            return 204;
        }

        auth_basic          off;

        add_header          Access-Control-Allow-Origin  "$http_origin";
        add_header          Access-Control-Allow-Headers "authorization, content-type";
        add_header          Access-Control-Allow-Methods "DELETE, GET, OPTIONS, POST, PUT, UPDATE";

        # to avoid double origin value what leads to an CORS error in the browser
        proxy_hide_header   Access-Control-Allow-Origin;

        proxy_set_header    Host                $host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;

        proxy_http_version  1.1;
        proxy_set_header    Upgrade             $http_upgrade;
        proxy_set_header    Connection          "upgrade";

        proxy_pass          http://192.168.1.21:8546;
    }
}
const Web3 = require('web3');

const web3 = new Web3('ws://mydomain.de/mynode');

web3.eth.getAccounts()
    .then(console.log)
    .catch(console.log);
Nginx配置:

docker run                                                                  
    -d
    --net                       mynet
    --ip                        192.168.1.21
    -v                          myvol:/root
    ethereum/client-go:stable
        --datadir               "/root/geth1"                              
        --networkid             1029
        --syncmode              "full"

        --ws                                                              
        --wsaddr                "0.0.0.0"                                  
        --wsport                8546                                       
        --wsapi                 "eth,net,web3,rpc"                         
        --wsorigins="*"                                                            

        --bootnodes             $BOOTNODE                                  
        --port                  30303                                      
        --maxpeers              8                                          
        --nat                   "any"
server {
    #listen     80;
    listen      443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server ipv6only=on;

    server_name             mydomain.de;

    # basic auth stuff here
    # ssl stuff here

    location /mynode {

        if ($request_method = OPTIONS) {
            return 204;
        }

        auth_basic          off;

        add_header          Access-Control-Allow-Origin  "$http_origin";
        add_header          Access-Control-Allow-Headers "authorization, content-type";
        add_header          Access-Control-Allow-Methods "DELETE, GET, OPTIONS, POST, PUT, UPDATE";

        # to avoid double origin value what leads to an CORS error in the browser
        proxy_hide_header   Access-Control-Allow-Origin;

        proxy_set_header    Host                $host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;

        proxy_http_version  1.1;
        proxy_set_header    Upgrade             $http_upgrade;
        proxy_set_header    Connection          "upgrade";

        proxy_pass          http://192.168.1.21:8546;
    }
}
const Web3 = require('web3');

const web3 = new Web3('ws://mydomain.de/mynode');

web3.eth.getAccounts()
    .then(console.log)
    .catch(console.log);
web3.js:

docker run                                                                  
    -d
    --net                       mynet
    --ip                        192.168.1.21
    -v                          myvol:/root
    ethereum/client-go:stable
        --datadir               "/root/geth1"                              
        --networkid             1029
        --syncmode              "full"

        --ws                                                              
        --wsaddr                "0.0.0.0"                                  
        --wsport                8546                                       
        --wsapi                 "eth,net,web3,rpc"                         
        --wsorigins="*"                                                            

        --bootnodes             $BOOTNODE                                  
        --port                  30303                                      
        --maxpeers              8                                          
        --nat                   "any"
server {
    #listen     80;
    listen      443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server ipv6only=on;

    server_name             mydomain.de;

    # basic auth stuff here
    # ssl stuff here

    location /mynode {

        if ($request_method = OPTIONS) {
            return 204;
        }

        auth_basic          off;

        add_header          Access-Control-Allow-Origin  "$http_origin";
        add_header          Access-Control-Allow-Headers "authorization, content-type";
        add_header          Access-Control-Allow-Methods "DELETE, GET, OPTIONS, POST, PUT, UPDATE";

        # to avoid double origin value what leads to an CORS error in the browser
        proxy_hide_header   Access-Control-Allow-Origin;

        proxy_set_header    Host                $host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;

        proxy_http_version  1.1;
        proxy_set_header    Upgrade             $http_upgrade;
        proxy_set_header    Connection          "upgrade";

        proxy_pass          http://192.168.1.21:8546;
    }
}
const Web3 = require('web3');

const web3 = new Web3('ws://mydomain.de/mynode');

web3.eth.getAccounts()
    .then(console.log)
    .catch(console.log);
此配置不适用于websocket。在我将它与
RPC
一起使用之前,它非常可靠


如果我将
-p8546:8456
添加到我的节点并直接连接到它(
constweb3=newweb3('ws://mydomain.de:8456')
),那么一切正常。因此,我猜nginx配置中有问题。

如注释中所述,要将websocket与SSL一起使用,您需要将wss://作为前缀。

如注释中所述,要将websocket与SSL一起使用,您需要将wss://.

作为nginx listen 443端口的前缀。我认为您必须使用
wss
而不是
ws
。您使用了
proxy\u pass
8546
端口,因此您的docker容器必须将端口从8546转发到8546:这是
docker run
命令的选项
-p 8546:8546
。您的nginx侦听443端口。我认为您必须使用
wss
而不是
ws
。您使用了
proxy\u pass
8546
端口,因此您的docker容器必须将端口从8546转发到8546:这是
docker run
命令的选项
-p 8546:8546