我正在嘗試遵循此處使用 RatChet PHP 訊息系統的教程 https://www.twilio.com/blog/create-php-websocket-server-build-real-time-even-driven-application 我的網域名稱名為 example.com,它有普通的 html 頁面,需要將其作為普通網站提供服務。對於訊息系統,我想要一個名為 8445 的端口
所以我在ubuntu 22.04上安裝了apache2,安裝後讓加密ssl網站運作正常
現在我想設定 websocket 伺服器,所以在防火牆中開啟 tcp 連接埠 8445
啟用 apache 模組
a2enmod 代理 a2enmod proxy_http a2enmod proxy_wstunnel
我已將原始網域替換為 example.com
我的conf檔案就像example.com.conf
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/www/example.com/public_html/logs/error.log
CustomLog /var/www/example.com/public_html/logs/access.log combined
ProxyRequests Off
ProxyPass / https://example.com:8445/
ProxyPassReverse / https://example.com:8445/
</VirtualHost>
和
example.com-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
SSLEngine On
SSLProxyEngine On
ServerAdmin [email protected]
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog /var/www/example.com/public_html/logs/error.log
CustomLog /var/www/example.com/public_html/logs/access.log combined
ProxyRequests Off
ProxyPass / wss://example.com:8445/
ProxyPassReverse / https://example.com:8445/
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
<Location />
ProxyPassReverse /
Options FollowSymLinks
Require all granted
</Location>
</VirtualHost>
</IfModule>
當我嘗試連線時,收到 503 錯誤,apache 日誌顯示如下
[proxy_http:error] [pid 20090] [客戶端 49.34.XX:55961] AH01114: HTTP: 無法連接到後端: example.com [Sat Dec 03 16:47:04.378489 2022] [proidxy ] (111)連線被拒絕:AH00957: wss: 嘗試連線到45.33.XX:8445 (example.com) 失敗
讓我知道這裡是否有人可以幫我解決問題。
謝謝!
答案1
問題似乎是 Apache 代理無法連接到連接埠 8445 上的後端伺服器。
驗證 websocket 伺服器是否正在執行並偵聽連接埠 8445。
sudo netstat -tlnp | grep 8445
如果 websocket 伺服器正在運行,您應該看到如下所示的行:
tcp 0 0 0.0.0.0:8445 0.0.0.0:* LISTEN <websocket server PID>/websocket
驗證是否沒有防火牆或安全群組阻止連接埠 8445 的流量。
telnet localhost 8445
如果連線成功,您應該會看到一個空白畫面。如果連線被拒絕,可能是防火牆或安全群組阻止了流量。
驗證 websocket 伺服器是否已配置為接受來自 Apache 代理的連線。根據您使用的 websocket 伺服器,這可能涉及設定要偵聽的特定 IP 位址或主機名,或設定存取控制清單 (ACL) 以允許來自 Apache 伺服器 IP 位址的連線。
檢查 websocket 伺服器的日誌,看看是否有任何錯誤訊息指示連線被拒絕的原因。