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に通知する」とか、方法は色々設定できます。
より複雑な監視設定の世界へ
ホストの生死を確認するだけの単純な監視だけでなく、より複雑な監視の設定も可能です。設定の難易度も少し上がり、必要に応じて独自にスクリプトを書いたりするかもしれません。応用編といったところでしょうか。
まとめ
どうでしたか。初心者のエンジニアさんはとくに監視ツールなどに関わったことがない方が多いのではないでしょうか。少しだけ手を伸ばしてみるだけで、触れてみることは出来ますし、そこまで深くやらなくても知っているだけで、かなり変わると思いますので、お時間があれば是非触ってみてください。
ではでは。