GoAccessをUbuntu + Nginx + WebSocketで動かす
calendar_today
2023-12-08
insights
views: 244
thumbnail images

GoAccessを自分のサーバに導入する際の設定方法など。

自分はサブドメインで運用したかったので、goaccessを--real-time-htmlつきで(websocketで)設定するやり方に一癖あったので備忘録的に書いていく。

https対応。

GoAccessとは

セルフホスト(self-hosted)型のWebサーバアナリティクスツール。

詳しくは公式HPで: https://goaccess.io

環境

参考までに。基本的にバージョンは何でも動くと思う

  • Ubuntu 22.04.3 LTS
  • Nginx 1.24.0

手順

1. goaccessインストール

sudo apt install -y goaccess
goaccess -V

動作確認方法

以下のコマンドで動作確認できる。

例は/var/www/html/index.htmlに普通にルーティングされている前提。

goaccess /var/log/nginx/access.log -o /var/www/html/index.html --log-format=COMBINED

2. port開放

websocketで使用するportを開放する。

goaccessで使用するポートのデフォルトは7890なので以下のように設定。

ufw allow 7890

linux側ではこれだけだが、自宅ルータの内側にサーバを立ててやっている人はルータでポートブロックしていないか確認。

3. nginx 設定

nginx confファイルの記述

以下のようにした。

/etc/nginx/conf.d/goaccess.conf

upstream goaccess {
	server 127.0.0.1:7890;
}
server {
	listen       443 ssl http2;
	server_name  goaccess.example.com; // FQDN
	root         /var/www/html/goaccess;
	index        index.html;

  // basic認証のファイル。任意
	include /etc/nginx/default.d/basicauth.conf; 
  // ssl鍵のパスの入ったファイル。ssl_certificateとssl_certificate_keyが書かれている。任意
	include /etc/nginx/default.d/ssl.conf; 

	location /ws {
		proxy_pass http://goaccess;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection $connection_upgrade;
		proxy_buffering off;
		proxy_read_timeout 7d;
	}
}
upstream goaccess

ポート番号はgoaccessのデフォルト。

server_name

FQDN。あとで使用する

location /ws

goaccessはindex.htmlにアクセスしたあとに、デフォルトでは/wsでwebsocketの通信を確立する。

そのため/wsにプロキシ設定が必要。

nginx 設定の反映

nginx -tでテストして、問題なければreloadする

nginx -t
systemctl reload nginx

4. GoAccessサービス化

goaccessはコマンドでhtmlを吐き出すため、バックグラウンドで動作させるためにサービスにする。

goaccess.service作成

touch /etc/systemd/system/goaccess.service

goaccess.service 設定

[Unit]
Description=Goaccess daemon.
After=network.target
[Service]
Type=simple
User=root
Group=root
Restart=always
ExecStart=/usr/bin/goaccess -a -f /var/log/nginx/access.log -a -f /var/log/nginx/access.log.1 \
	-o /var/www/html/goaccess/index.html \
	--real-time-html \
	--log-format=COMBINED \
	--ws-url=wss://goaccess.example.com:443/ws\
	--origin=https://goaccess.example.com
StandardOutput=null
StandardError=null
[Install]
WantedBy=multi-user.target

ExecStart解説は以下

access.logについて

access.logは複数指定できる。

1つだけだと、当然1つの中身しかgoaccessに表示されない。

nginxはデフォルトだと1世代前のlogはcompressされない仕様のはずなので、2つを指定してより多くのログを表示させる。

もっと多くのものを表示させるうまいやり方があるらしいが、簡単なこの方法にした。

nginxログファイルの分け方を変えて1ヶ月分などにすることができるので、そちらで調整する。(任意)

--ws-url

こちらにはwss://{FQDN}:443/wsの形式でwebsocket通信するパスを指定する

--origin

これを設定しないと動作しなかった。今回の躓きポイント

goaccessサービス起動

以下で起動させる。エラー等でなければok

systemctl daemon-reload
systemctl enable goaccess
systemctl start goaccess

5. アクセス

サイトにアクセスしてみる。

今回はgoaccess.example.com に設定したのでそこにアクセス。

画面が表示されれば第一段階、表示は成功。

右側の設定ボタンの端に緑色のマークがついていれば、websocketでの通信ができている。

calendar_today
2023-12-08
insights
views: 244