最近專案遇到一坑,之前 http 使用 ws 都很順利,但是上了https之後,網頁強制要使用 wss... 就卡住了
Nginx 配置 轉發代理,網路上很多教學都寫一半,最後看懂就~ 這樣寫最精簡,直接 調用ws 去處理後續的東西
NGINX配置文件
Go Server
Go Client
----------------------
Nginx 配置 轉發代理,網路上很多教學都寫一半,最後看懂就~ 這樣寫最精簡,直接 調用ws 去處理後續的東西
NGINX配置文件
server {
server_name 域名;
location / {
root PATH;
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
root PATH;
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
111111
include fastcgi_params;
}
listen 443 ssl; # managed by Certbot
ssl_certificate 證書
ssl_certificate_key 證書
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
location / {
proxy_pass 服務位置
#例如 http://127.0.0.1:8092/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
add_header Access-Control-Allow-Origin *;
proxy_connect_timeout 60s;
proxy_read_timeout 500s;
proxy_send_timeout 500s;
}
}
server {
if ($host = 域名) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
server_name 域名;
return 404; # managed by Certbot
}
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
func main() {
upgrader := &websocket.Upgrader{
//如果有 cross domain 的需求,可加入這個,不檢查 cross domain
CheckOrigin: func(r *http.Request) bool { return true },
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println("upgrade:", err)
return
}
defer func() {
log.Println("disconnect !!")
c.Close()
}()
for {
mtype, msg, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
break
}
log.Printf("receive: %s\n", msg)
msg = []byte("伺服器接收成功")
log.Printf("re_send: %s\n", msg)
err = c.WriteMessage(mtype, msg)
if err != nil {
log.Println("write:", err)
break
}
}
})
log.Println("server start at :8000")
log.Fatal(http.ListenAndServe(":8000", nil))
}
package main
import (
"log"
"github.com/gorilla/websocket"
)
func main() {
// ws_connection := "ws://fishstg.1c5game.com:8000/echo"
// ws_connection := "wss://18.139.24.117:8092/ws"
ws_connection := "wss://fishstg.1c5game.com/ws"
// ws_connection := "wss://echo.websocket.org/"
log.Printf("ws_connection: %s\n", ws_connection)
c, _, err := websocket.DefaultDialer.Dial(ws_connection, nil)
if err != nil {
log.Fatal("dial:", err)
}
defer c.Close()
i := 1
for i <= 10 {
// fmt.Println(i)
send_msg := "{\"protocol\" : \"platform_debit_all\", \"data\" :{ \"id\":1 , \"gametoken\":123456465 }}"
log.Printf("send_msg: %s\n", send_msg)
err = c.WriteMessage(websocket.TextMessage, []byte(send_msg))
if err != nil {
log.Println(err)
return
}
_, msg, err := c.ReadMessage()
if err != nil {
log.Println("read:", err)
return
}
log.Printf("received: %s\n", msg)
i++
}
}