go语言linux环境配置nginx,搭建wss
總結
1. 引用其他大佬的總結 : SSL(Secure Socket Layer,安全套接層) 來說是一種加密技術,在 SSL 上運行 WebSocket 協議就是 WSS,?在 SSL 上運行 HTTP 協議就是 HTTPS
2.?HTTP 協議有一個很大的缺陷:通信只能由客戶端發起,服務器無法主動通知到客戶端,而WSS的最大特點就是,服務器可以主動向客戶端推送信息,客戶端也可以主動向服務器發送信息,是真正的雙向對話,恰好彌補了HTTP的缺陷
3. WSS的其他特點:
? ? 3.1 建立在 TCP 協議之上,服務器端的實現比較容易
? ? 3.2?與 HTTP 協議有著良好的兼容性。默認端口也是80和443,并且握手階段采用 HTTP 協議,因此握手時不容易屏蔽,能通過各種 HTTP 代理服務器
? ? 3.3?可以發送文本,也可以發送二進制數據
? ? 3.4?協議標識符是ws(如果加密,則為wss),服務器網址就是 URL,注意不能是IP地址
配置(我的環境:ubuntu16.04,go1.13,nginx)
1. nginx處理
?? ?我的nginx是默認安裝,安裝路徑 : /etc/nginx/
? ? 我們需要增加一個配置來讓讓nginx進行認證wss,升級協議,轉發到不同的網關進程,我們在目錄 /etc/nginx/conf.d中添加一個443.conf的文件,命名成443是用來標識這個文件用來處理443端口的轉發,如下圖
443.conf文件里面配置如下,要注意的點(實際的ws服務器IP地址,本服務器的域名url,https證書和密鑰的路徑,Connection要升級的標記Upgrade等等),特別注意下:location后面帶了后綴:/ws,跟代碼中的“http.Handle("/ws", s)”必須一致
這樣我們發到 wxminigame.yingywz.com/ws 這個url的wss連接會被轉發到81.71.13.84:12010,12012,12014這些端口
切記:配置好443.conf后需要讓nginx重新加載配置,可以先運行命令 ?nginx -t 來檢測配置是否有錯,沒錯再運行命令 ?nginx -s reload,讓nginx重新加載配置
?
2. 代碼處理(這里貼出主要代碼,原理:使用github.com/gorilla/websocket的Upgrader進行操作)
type wsServer struct {worker workerFunc // 新連接時的處理函數enableHTTPS bool // 開啟https }// 繼承自本目錄的server var _ server = new(wsServer)// 新連接時的處理 func (s *wsServer) workOnSocket(conn *websocket.Conn) {defer func() {// 斷開時的關閉處理conn.Close()}()// 真正處理s.worker(&client{conn: conn,}) }var upgrader = websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true}, }// 實現 net/http.Handler 的 ServeHTTP() 接口 func (s *wsServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {logrus.Debugf("http server 收到新的連接")// 升級為websocket協議ws, err := upgrader.Upgrade(w, r, nil)if err != nil {logrus.Errorln("fuck the origin:", err)return}// 連接時的處理s.workOnSocket(ws) }// 啟動服務 func (s *wsServer) Serve(addr string, worker workerFunc) error {logrus.Debugf("啟動websocket服務,addr=%s", addr)// 處理函數s.worker = workerhttp.Handle("/ws", s)return nil }?
總結
以上是生活随笔為你收集整理的go语言linux环境配置nginx,搭建wss的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: df -h 显示100%的解决办法
- 下一篇: redis-cli 命令详解