環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

AlmaLinux8でZabbix5をインストールする

AlmaLinux8でZabbix5をインストールする

本日は監視ツール「Zabbix」を構築するお話。

Zabbix はアレクセイ・ウラジシェフ(Alexei Vladishev)によって作られた、ネットワーク管理ソフトウェアである。様々なネットワークサービス、サーバ 、その他のネットワークハードウェアのステータスを監視・追跡できる。現在はウラジシェフが設立したZabbix社によって開発が継続されている。

https://ja.wikipedia.org/wiki/Zabbix

監視ツールにまだ触れたことがない方へ

プログラミング入門の勉強を頑張っている方には、まだイメージにはないかもしれませんがシステム開発の工程には、リリース後に「保守・運用」というステージがある。

納品して終了の仕事では携わることは出来ないが、自社サービスを担当したりすると運用の大事さに気づくはずだ。我々が多くのサービスを享受できるその裏には、サービスを懸命に守ろうとしたり、トラブルの際には復旧しようとしたり、多くの人が働いているわけです。

さて。特にそのような中で、重要になってくるのが「監視」です。簡単に言えば、サービスが正常に動作しているかをチェックするもの。いまだに原始的な会社だと・・手動で確認していたりする会社があるのですが。監視ツールを使って、自動で出来る監視は自動でするのが常識であり、なによりトラブル時の検知が早くなります。

まだ実感がわかない方も、一度監視ツールに触れてみるのも、良いかもしれません。

環境

今回使用した環境は以下のとおりです。

AWS t3.micro
AlmaLinux8
php7.4
MySQL8
nginx
Zabbix5

本手順は「zabbix.supisupi.com」というドメインで構築する手順になっていますので、各々書き換えて使ってくださいm

構築手順

各種アップデート

dnf -y update

各種ディレクトリ作成

mkdir -p /etc/nginx/sites-enabled
mkdir -p /etc/nginx/sites-available
mkdir -p /usr/local/nginx/vhosts/zabbix.supisupi.com/logs

MySQL8インストール・設定

# リポジトリ
dnf install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
# インストール
dnf --disablerepo=appstream --enablerepo=mysql80-community install mysql-community-server

   # GPG KEY で有効期限エラーになったら、下記を実行する
   rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# 初期化
mysqld --initialize --user=mysql --datadir=/var/lib/mysql
# 設定ファイル
cp -i /etc/my.cnf /etc/my.cnf.org
vi /etc/my.cnf
-----
[mysqld]
datadir=/var/lib/mysql
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/lib/mysql/mysql.sock

character_set_server = utf8mb4

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# error log
log-error = /var/log/mysql/error.log

# slow query log
slow_query_log = 0
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# general log
general_log = 0
general_log_file = /var/log/mysql/query.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
-----


# ログディレクトリ
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql

# 起動
systemctl start mysqld.service
systemctl enable mysqld.service

# パスワード確認
grep password /var/log/mysqld.log

# 初期設定
mysql_secure_installation
※案内に従って設定(rootのパスワードも変更しておく)

# DB作成
mysql -uroot -p
==========
MySQL> CREATE DATABASE `zabbix` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
MySQL> CREATE USER zabbix@localhost IDENTIFIED WITH mysql_native_password BY 'パスワード';
MySQL> grant all privileges on zabbix.* to zabbix@localhost;
MySQL> exit;
==========

phpインストール

# リポジトリ
dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

# インストール
dnf -y module install php:remi-7.4
dnf -y install php-zip php-mysqlnd oniguruma5php php-mbstring

# 起動
systemctl start php-fpm
systemctl enable php-fpm

selinux

今回はdisabledとします。

vi /etc/selinux/config
-----
SELINUX=disabled
-----

reboot
※ここで一度インスタンスを再起動する

zabbix

# リポジトリ
rpm -Uvh https://repo.zabbix.com/zabbix/5.2/rhel/8/x86_64/zabbix-release-5.2-1.el8.noarch.rpm

# インストール
dnf -y install zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-agent zabbix-web-japanese

# CREATE SQL(※パスワード必要)
zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p zabbix

# 設定ファイル
vi /etc/zabbix/zabbix_server.conf
------
DBName=zabbix(作成したDB名)
DBUser=zabbix(作成したDB接続ユーザー名)
DBPassword=(作成パスワード)
------

# zabbix web
chown -R nginx:nginx /etc/zabbix/web

# 起動
systemctl start zabbix-agent
systemctl enable zabbix-agent
systemctl start zabbix-server
systemctl enable zabbix-server

certbot

# インストール
dnf --enablerepo=epel -y install certbot

# SSL証明書
certbot certonly --standalone -d [ドメイン名] -m [メールアドレス] --agree-tos
※証明書を取得したいドメインと自身のメールアドレスを使って実行する

nginx

# nginx.conf
vi /etc/nginx/nginx.conf
-----
user  nginx;
worker_processes  auto;
worker_rlimit_nofile  40000;
error_log /var/log/nginx/error.log warn;
pid       /var/run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 4096;
    multi_accept on;
    use epoll;
}

http {
    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" "$request_time"';
    access_log off;
    error_log /var/log/nginx/error.log crit;
    keepalive_timeout 10;
    client_header_timeout 10;
    client_body_timeout 10;
    reset_timedout_connection on;
    send_timeout 10;
    limit_conn_zone $binary_remote_addr zone=addr:5m;
    limit_conn addr 100;
    include /etc/nginx/mime.types;
    default_type text/html;
    charset UTF-8;
    gzip on;
    gzip_http_version 1.0;
    gzip_disable "msie6";
    gzip_proxied any;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
    open_file_cache max=40000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
-----


# vhost設定(zabbix.supisupi.comはお好きなドメイン名に変更してください)
vi /etc/nginx/sites-available/zabbix.supisupi.com
-----
#=======================================
# zabbix.supisupi.com
#---------------------------------------
server {
	listen 80;
	server_name zabbix.supisupi.com;
	return 301 https://zabbix.supisupi.com$request_uri;
}

server {
	listen          443 ssl http2;
	server_name     zabbix.supisupi.com;
	root    /usr/share/zabbix;
	index   index.php;

	ssl_certificate      /etc/letsencrypt/live/zabbix.supisupi.com/fullchain.pem;
	ssl_certificate_key  /etc/letsencrypt/live/zabbix.supisupi.com/privkey.pem;
	ssl_dhparam /etc/ssl/dhparam.pem;
	ssl_session_tickets     on;
	ssl_session_ticket_key     /etc/ssl/sslsessionticket.key;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout  5m;

	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
	ssl_prefer_server_ciphers   on;

	access_log  /usr/local/nginx/vhosts/zabbix.supisupi.com/logs/access.log main;
	error_log   /usr/local/nginx/vhosts/zabbix.supisupi.com/logs/error.log warn;


	location = /favicon.ico {
		log_not_found   off;
    }

	location / {
		try_files       $uri $uri/ =404;
	}

	location /assets {
		access_log      off;
		expires         10d;
	}

	location ~ /\.ht {
		deny            all;
	}

	location ~ /(api\/|conf[^\.]|include|locale) {
		deny            all;
		return          404;
	}
        
	location ~ [^/]\.php(/|$) {
		fastcgi_pass    unix:/run/php-fpm/zabbix.sock;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_index   index.php;
		
		fastcgi_param   DOCUMENT_ROOT   /usr/share/zabbix;
		fastcgi_param   SCRIPT_FILENAME /usr/share/zabbix$fastcgi_script_name;
		fastcgi_param   PATH_TRANSLATED /usr/share/zabbix$fastcgi_script_name;
		
		include fastcgi_params;
		fastcgi_param   QUERY_STRING    $query_string;
		fastcgi_param   REQUEST_METHOD  $request_method;
		fastcgi_param   CONTENT_TYPE    $content_type;
		fastcgi_param   CONTENT_LENGTH  $content_length;
		
		fastcgi_intercept_errors        on;
		fastcgi_ignore_client_abort     off;
		fastcgi_connect_timeout         60;
		fastcgi_send_timeout            180;
		fastcgi_read_timeout            180;
		fastcgi_buffer_size             128k;
		fastcgi_buffers                 4 256k;
		fastcgi_busy_buffers_size       256k;
		fastcgi_temp_file_write_size    256k;
	}
}
-----

# シムリンク
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/zabbix.supisupi.com zabbix.supisupi.com

# dhparam.pem, sessionticket
openssl dhparam -out /etc/ssl/dhparam.pem 4096
openssl rand 48 > /etc/ssl/sslsessionticket_`date +%Y%m%d`.key
ln -s /etc/ssl/sslsessionticket_`date +%Y%m%d`.key /etc/ssl/sslsessionticket.key

# 起動
systemctl start nginx
systemctl enable nginx

php-fpm

vi /etc/php-fpm.d/zabbix.conf
-----
user = nginx
group = nginx
-----

systemctl restart php-fpm

firewalld

dnf -y install firewalld
systemctl start firewalld
systemctl enable firewalld

firewall-cmd --add-service=http --zone=public --permanent
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --add-service=zabbix-server --zone=public --permanent
firewall-cmd --add-service=zabbix-agent --zone=public --permanent
firewall-cmd --reload

Zabbix5設定

ここまでの手順を実施したら、もうアクセスが出来ると思います。ブラウザからアクセスしてみましょう。アクセスできない場合は、作業に間違いがないか確認しましょう。

無事にアクセスができたら、「Japanese」を選択して、「次のステップ」ボタンを押下。

「前提条件のチェック」がすべて「OK」であることを確認し「次のステップ」ボタンを押下。

データベースの接続情報を入力します。まるっと手順通りやっている人は、おそらくパスワードのみ入力すれば良い。

Zabbixサーバーについて聞かれるので、Nameに「Zabbix Server」とでも入力して「次のステップ」ボタンを押下。

デフォルトのタイムゾーンを「(UTC+09:00) Asia/Tokyo」に変更し、「次のステップ」ボタンを押下。

確認画面が表示されるので、「次のステップ」ボタンを押下して、完了。

終了ボタンを押すと、ログイン画面に。

ログイン

初期管理ユーザーは、ユーザー名:Admin、パスワード:zabbixとなっているので、ログインしてみる。

無事ログインできました。「システム情報」欄の、「Zabbixサーバーの起動」というパラメータが「はい」になっていることを確認にする。

このあとどうやって使うの?

ここでは、詳しい手順までは述べませんが、その後にやるべきことをざっくり書きます。

まずはログインユーザー作成

マスターアカウントでログインするのは初回だけにして、ログインする個人に大してアカウントを発行し、必要に応じて管理者権限を付与しよう

ホストを登録

基本的な監視については、監視対象のサーバーにzabbix-agentを起動させ、zabbix側でホスト登録を行うと、監視対象として追加されます。

アラート設定

エラーが発生したなど、監視対象について通知が必要になった場合の、通知方法を登録します。「アラート用のメーリングリストに送信する」とか「開発チームのslackに通知する」とか、方法は色々設定できます。

より複雑な監視設定の世界へ

ホストの生死を確認するだけの単純な監視だけでなく、より複雑な監視の設定も可能です。設定の難易度も少し上がり、必要に応じて独自にスクリプトを書いたりするかもしれません。応用編といったところでしょうか。

まとめ

どうでしたか。初心者のエンジニアさんはとくに監視ツールなどに関わったことがない方が多いのではないでしょうか。少しだけ手を伸ばしてみるだけで、触れてみることは出来ますし、そこまで深くやらなくても知っているだけで、かなり変わると思いますので、お時間があれば是非触ってみてください。

ではでは。