douwengzao5790 2014-02-28 09:39
浏览 67
已采纳

无法让go.net/websocket在Nginx后面运行

I'm having trouble getting go.net/websocket to work behind nginx. It works if the application is accessed directly but with nginx, I get an EOF error from Receive.

What am I doing wrong?

Nginx version: 1.5.10

This is my nginx configuration.

location /wstest/ {
    proxy_pass http://localhost:7415/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade "websocket";
    proxy_set_header Connection "Upgrade";
    proxy_buffering off;
}

Go code:

func main() {
    http.HandleFunc("/", home)
    http.Handle("/sock", websocket.Handler(pingpong))

    http.ListenAndServe(":7415", nil)
}

func home(w http.ResponseWriter, r *http.Request) {
    homeTmpl.Execute(w, nil)
}

func pingpong(conn *websocket.Conn) {
    var msg string
    if err := websocket.Message.Receive(conn, &msg); err != nil {
        log.Println("Error while receiving message:", err)
        return
    }

    if msg == "ping" {
        websocket.Message.Send(conn, "pong")
    }
}

var homeTmpl = template.Must(template.New("home").Parse(`
<!doctype html>
<html>
<head>
<title>WS Test</title>
<script>
    var path = window.location.pathname;
    var wsURL = "ws://" + window.location.host +  path.substring(0,   path.lastIndexOf('/')) + "/sock";
    var ws;

    document.addEventListener("DOMContentLoaded", function() {
        ws = new WebSocket(wsURL);
        ws.onopen = function() {
        ws.send("ping");
    };

    ws.onmessage = function(event) {
        document.getElementById("status").innerHTML = "Received: " + String(event.data);
    };
})
</script>
</head>
<body>
<span id="status">Pinging...</span>
</body>
</html>`))
  • 写回答

1条回答 默认 最新

  • dongqi0644 2014-03-03 23:01
    关注

    This is the configuration that I'm using, it's working OK:

    server {
        listen 0.0.0.0:20007;    
        index index.html;
    
         root /full/path/to/site;
    
        # pass the request to the node.js server with the correct headers 
        location / {
    
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;
    
          proxy_pass http://your_app/;
          proxy_redirect off;
    
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
        }
     }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

    报告相同问题?

    悬赏问题

    • ¥15 Erasure Code纠删码表
    • ¥15 用vite创建的vue3项目,404重定向不起作用??
    • ¥15 关于#c语言#的问题:一个球从80米高度自由落下,每次落地后反弹的高度为原高度的一半计算6次小球反弹的高度.(反弹结果取整,使用走走for循环结构)
    • ¥15 SurfaceControl的screenshot问题
    • ¥15 基于51单片机的oled菜单代码,要C语言,模块化编程!
    • ¥15 JAVAswing,设计一个扑克牌什么的
    • ¥50 python ctypes调用dll实现分析
    • ¥40 用python解决数据统计问题
    • ¥100 是否有方案能通过抓包分析得到移动应用的名称和包名信息?
    • ¥15 opencv检测不到轮廓