====== How to Set Up LSWS as a WebSocket Proxy ======
===== What's a WebSocket? =====
WebSocket changes the way the Internet works: It is a protocol that allows the server and the client to have a bidirectional conversation where the client doesn’t just request content from the server but the server also sends content to the client whenever there is content to be sent (without waiting to be asked). This bidirectional conversation allows for realtime web experiences. Where HTTP tries to simulate real-time interaction at great expense (through incessant refreshing), WebSocket makes realtime interaction a reality. This upgrades all sorts of web applications: stock tickers, data center monitors, news feeds… but probably the most exciting feature of realtime Internet is the ability for multiple users to see and react to each other's actions in real time.
LiteSpeed Web Server can work as a WebSocket proxy. See how:
===== Setup WebSocket Backend =====
The first step is to have a working WebSocket backend set up. Explaining how to achieve this is out of this wiki's scope but there are plenty of online tutorials that can be consulted. One such tutorial involves using an Nginx backend with an [[https://github.com/slact/nchan|nchan module]].
===== Test the Backend WebSocket =====
Assuming you have a backend WebSocket up and running on port 80 at ''ws://domain.com/sub/xx1'', you will need to test it to ensure it is working.
There are many tools available for such testing. You can either try some online tools such as [[https://websocket.org/echo.html|Echo Test]] or download chrome extension tools like [[https://chrome.google.com/webstore/detail/simple-websocket-client/pfdhoblngboilpfeibdedpjgfnlcodoo?hl=en|Simple WebSocket Client]]. We will use Chrome Simple WebSocket Client as an example in this wiki.
{{ :litespeed_wiki:proxy:add-websocket-proxy1.png?600 |}}
This screenshot shows a successful test. If it had failed, you would see a ''Simple WebSocket Client undefined'' error, like so:
{{ :litespeed_wiki:proxy:add-websocket-proxy2-testfail.png?600 |}}
===== How to Configure LSWS Native Virtual Host as a WebSocket Proxy =====
In the LSWS WebAdmin Console, navigate to **Virtual Host (Native) > General > Web Socket Proxy Setup**
{{ :litespeed_wiki:proxy:add-websocket-proxy3.png?800 |}}
{{ :litespeed_wiki:proxy:add-websocket-proxy4.png?800 |}}
Configure **URI** and **Address**. The URI can be a plain URI (starting with "/"). The **URI** can be an exact match. If a plain URI ends with a "/", then this WebSocket backend will include all sub-URIs under this URI, such as **/sub/** should include /sub/001, /sub/002... etc. However, the regular expression, such as ''/sub/*'', will **not** work for WebSocket.
Save and restart LSWS.
===== How to Configure LSWS in cPanel as a WebSocket Proxy =====
LSWS supports ''ProxyPass'' for WebSocket, used like so:
ProxyPass / ws://localhost:3000/
**Note**: This directive must be placed in an Apache vhost configuration file, not in .htaccess.
For example, for RocketChat, create two files like these, replacing ''EXAMPLE'' and ''www.example.com'' with the cPanel username and the actual domain:
''/etc/apache2/conf.d/userdata/ssl/2_4/EXAMPLE/www.example.com/proxy.conf''
''/etc/apache2/conf.d/userdata/std/2_4/EXAMPLE/www.example.com/proxy.conf''
Add the following code to both files:
RewriteEngine on
RewriteRule (.*) http://localhost:3000/$1 [P,L]
ProxyPass / ws://localhost:3000/
Rebuild the Apache configuration file, and restart LSWS:
/scripts/buildhttpdconf
/usr/local/lsws/bin/lswsctrl restart
===== Final Test: The Front End =====
Test front-end port 443
wss://example.com/sub/xx1
If all is working fine you should see the following:
{{ :litespeed_wiki:proxy:add-websocket-proxy5.png?600 |}}