Как вы и написали - websocket. Создаете обработчик события beforeunload и отправляете на сервер соответствующее сообщение. Но есть проблема, если пользователь закроет браузер, то это событие не сработает. Для этого установите на сервере время отклика, допустим 5 секунд, тогда через 5 секунд, если отклика от клиента не будет, на сервере можно будет вызвать нужный метод для установки пользователю статуса оффлайн.