一、問題背景
線上伺服器程式使用的是swoole框架,由主程式直接監聽8008埠,然後在使用過程中概率性會出現連線失敗的情況,觀察報錯主要為
WebSocket connection to 'wss://XXX:8008/' failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR
二、排查原因
在網上查詢資料的過程中也看到了類似問題的出現原因,然後進行排查,特記錄下大概率的原因,以供參考。
1.SSL證照問題(由於是概率性出現的所以暫時排除這個原因)
2.swoole是否開啟了openssl,使用SSL必須在編譯swoole時加入--enable-openssl選項(在伺服器上執行命令php --ri swoole,即可檢視是否編譯進去,驗證已編譯故排除)
3.更改完配置需要重啟程式(看到有些人在處理的時候沒有進行重啟故一直不生效,需注意)
4.程式和nginx同時監聽一個埠(伺服器沒這種情況,故排除)
5.socket程式未啟動(出現問題時觀察了下程式,程式在正常執行,故排除)
三、解決方案
通過第二點的描述可以發現並沒有找到實質的原因,但是看到網上比較常見的做法是用nginx轉發到其他埠,問了下公司其他相關服務也是使用類似處理方案,所以為了線上業務的穩定,果斷採用!
在nginx配置中增加了對8008埠的監聽,然後代理轉發到8088埠,swoole程式中改為監聽8088埠,殺掉swoole程式(不殺的話因為8008埠被佔用,nginx重啟會失敗),重啟nginx,重啟swoole程式,線上驗證,大功告成。
server {
listen 8008;
ssl on;
ssl_certificate ssl.cer;
ssl_certificate_key ssl.key;
location / {
proxy_pass https://127.0.0.1:8088;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 600;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
複製程式碼
四、nginx配置詳解
留坑,待更新
五、真正原因探查
目前來講,這個問題並沒有解決,只是從旁邊繞過去了,但是真正的原因還是要努力的查檢視的......