
This article provides a guide demonstrating how to deploy Zabbix multi-node monitoring system on AlmaLinux VPS.
What is Zabbix?
Zabbix is a free, open-source IT infrastructure monitoring software that collects, analyzes, and visualizes data from networks, servers, virtual machines, cloud services, and applications. It provides real-time performance data and alerting to ensure system reliability by monitoring key metrics like CPU load, network traffic, and disk space. Zabbix can alert users to problems through various notification mechanisms, such as email, and offers features for reporting and data visualization.
Here’s a detailed, step-by-step technical guide for installing a Zabbix multi-node monitoring system on AlmaLinux VPS and configuring it with separate server, database, web frontend, and agent nodes. This guide assumes you are using AlmaLinux 9 VPS (clean install) for each node and are comfortable with using the command line.

🧭 Guide: Deploy Zabbix Multi-Node Monitoring System on AlmaLinux VPS
⚙️ Overview
In a multi-node architecture, we separate key components for scalability and fault tolerance:
| Node | Role | Example Hostname | 
|---|---|---|
| Node 1 | Zabbix Server + Frontend | zabbix-master.yourdomain.com | 
| Node 2 | Database (MariaDB) | db01.yourdomain.com | 
| Node 3 | Zabbix Proxy | proxy01.yourdomain.com | 
| Node 4+ | Zabbix Agents | agent01.yourdomain.com, etc. | 
-  
🧩 System Preparation
Perform these steps on each AlmaLinux VPS:
sudo dnf update -y sudo dnf install epel-release -y sudo dnf install wget curl nano net-tools -y sudo hostnamectl set-hostname zabbix-master.yourdomain.com
Open required firewall ports (adjust for each node):
sudo firewall-cmd --permanent --add-port=10050/tcp # agent sudo firewall-cmd --permanent --add-port=10051/tcp # server/proxy sudo firewall-cmd --permanent --add-port=80/tcp # web interface sudo firewall-cmd --reload
 - 
🗄️ Install and Configure MariaDB (on Database Node)
-  
Install MariaDB
sudo dnf install mariadb-server -y sudo systemctl enable --now mariadb
 -  
Secure the Installation
sudo mysql_secure_installation
Follow prompts to set root password, remove test DB, and disable remote root login.
 -  
Create Zabbix Database and User
mysql -u root -p
CREATE DATABASE zabbix CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix'@'%' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%'; FLUSH PRIVILEGES; EXIT;
 -  
Enable Remote Access
Edit
/etc/my.cnf.d/mariadb-server.cnf:[mysqld] bind-address=0.0.0.0
Restart service:
sudo systemctl restart mariadb
 
 -  
 - 
🖥️ Install Zabbix Server + Web Frontend (on Zabbix Master Node)
-  
Add Zabbix Repository
For Zabbix 7.0 (LTS):
sudo rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-3.el9.noarch.rpm sudo dnf clean all
 -  
Install Packages
sudo dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-agent -y
 -  
Import Database Schema
Connect to your remote database:
zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -h db01.yourdomain.com -u zabbix -p zabbix
 -  
Configure Zabbix Server
Edit
/etc/zabbix/zabbix_server.conf:DBHost=db01.yourdomain.com DBName=zabbix DBUser=zabbix DBPassword=StrongPassword123!
 -  
Configure PHP Frontend
Edit
/etc/php-fpm.d/zabbix.confand ensure:php_value[date.timezone] = America/Chicago
Enable and start services:
sudo systemctl enable --now zabbix-server zabbix-agent httpd php-fpm
 
 -  
 - 
🌐 Access Zabbix Web Interface
Open your browser and visit:
http://zabbix-master.yourdomain.com/zabbix
Default credentials:
- Username: 
Admin - Password: 
zabbix 
Complete the installation wizard:
- Database host: 
db01.yourdomain.com - DB name: 
zabbix - DB user: 
zabbix - DB password: (as configured)
 - Zabbix server host: 
localhost - Port: 
10051 
 - Username: 
 - 
🛰️ Install Zabbix Proxy (Optional but Recommended)
Use a proxy for remote or distributed networks.
-  
On Proxy Node
sudo dnf install zabbix-proxy-mysql mariadb-server -y sudo systemctl enable --now mariadb
Create local DB:
mysql -u root -p CREATE DATABASE zabbix_proxy CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; CREATE USER 'zabbix_proxy'@'localhost' IDENTIFIED BY 'ProxyPass!'; GRANT ALL PRIVILEGES ON zabbix_proxy.* TO 'zabbix_proxy'@'localhost'; FLUSH PRIVILEGES; EXIT;
 -  
Initialize Schema
zcat /usr/share/zabbix-sql-scripts/mysql/proxy.sql.gz | mysql -uzabbix_proxy -p zabbix_proxy
 - 
Configure Proxy
Edit
/etc/zabbix/zabbix_proxy.conf:Server=zabbix-master.yourdomain.com Hostname=proxy01.yourdomain.com DBName=zabbix_proxy DBUser=zabbix_proxy DBPassword=ProxyPass!
Enable and start:
sudo systemctl enable --now zabbix-proxy
Then, in the Zabbix frontend:
- Navigate to Administration → Proxies → Create Proxy
 - Add 
proxy01.yourdomain.comas an active proxy 
 
 -  
 - 
💻 Install Zabbix Agent (on Monitored Hosts)
-  
Install Agent
sudo dnf install zabbix-agent -y
 - 
Configure
Edit
/etc/zabbix/zabbix_agentd.conf:Server=zabbix-master.yourdomain.com,proxy01.yourdomain.com ServerActive=zabbix-master.yourdomain.com Hostname=agent01.yourdomain.com
Enable and start:
sudo systemctl enable --now zabbix-agent
Add the host in Zabbix frontend:
- Configuration → Hosts → Create Host
 - Set Host name = 
agent01.yourdomain.com - Choose Proxy if applicable
 - Link to Linux by Zabbix agent template
 
 
 -  
 - 
🧠 Verify and Test
Run:
sudo systemctl status zabbix-server sudo systemctl status zabbix-agent sudo systemctl status zabbix-proxy
In the Zabbix Dashboard, check:
- All nodes have green availability icons ✅
 - Data (CPU, memory, disk usage) appearing for agents

 
 - 
🔐 Hardening and Optimization
- Enable SSL/TLS between agents, proxies, and server
 - Use Nginx reverse proxy for frontend + Let’s Encrypt
 - Limit database user privileges
 - Tune MariaDB (
innodb_buffer_pool_size, etc.) for performance - Regularly back up 
/etc/zabbix/,/usr/share/zabbix/, and DB 
 
🧩 Architecture Diagram
+-------------------+ | Web Frontend | | (Apache/PHP) | +---------+---------+ | v +-------------------+ | Zabbix Server | | (10051/tcp) | +---------+---------+ | +--------------+-------------+ | | v v +------------+ +--------------+ | Zabbix | | Zabbix Proxy | | Agent(s) | | Remote Sites | | (10050/tcp)| | (10051/tcp) | +------------+ +--------------+ | v +-------------------+ | MariaDB Server | +-------------------+
Let’s extend your Zabbix multi-node monitoring system on AlmaLinux VPS with a secure, production-ready HTTPS frontend using Nginx + Let’s Encrypt (Certbot).
This section will assume:
- Zabbix frontend is already running on Apache (default from RPM).
 - You want Nginx to act as a reverse proxy providing SSL termination.
 - Let’s Encrypt handles the certificates automatically with auto-renewal.
 
🔐 Secure Zabbix Frontend with Let’s Encrypt + Nginx Reverse Proxy (Zabbix Multi-Node Monitoring System on AlmaLinux VPS)
- 
🧱 Prerequisites
Ensure:
- Zabbix web frontend works on 
http://zabbix-master.yourdomain.com/zabbix - DNS 
Arecord points to your server’s public IP - Port 80 and 443 are open:
 
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
 - Zabbix web frontend works on 
 -  
🧩 Install Nginx and Certbot
sudo dnf install nginx certbot python3-certbot-nginx -y
Stop Apache (it uses port 80, which Certbot needs for validation):
sudo systemctl stop httpd sudo systemctl disable httpd
 -  
🪶 Configure Nginx Reverse Proxy
Create a new config file for your Zabbix domain:
sudo nano /etc/nginx/conf.d/zabbix.conf
Paste the following configuration 👇
server { listen 80; server_name zabbix-master.yourdomain.com; # Redirect all HTTP to HTTPS location / { return 301 https://$host$request_uri; } } server { listen 443 ssl http2; server_name zabbix-master.yourdomain.com; # SSL Certificates (to be auto-generated by Certbot) ssl_certificate /etc/letsencrypt/live/zabbix-master.yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/zabbix-master.yourdomain.com/privkey.pem; # Recommended SSL settings ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+AESGCM:EDH+AESGCM"; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # Proxy to Apache backend (Zabbix frontend) location / { proxy_pass http://127.0.0.1:8080; # We'll make Apache listen on 8080 proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; } access_log /var/log/nginx/zabbix_access.log; error_log /var/log/nginx/zabbix_error.log; }Save and exit.
 -  
⚙️ Reconfigure Apache to Run Behind Nginx
Since Nginx is now serving on ports 80/443, make Apache serve locally on port
8080.Edit
/etc/httpd/conf/httpd.conf:Find:
Listen 80
Change to:
Listen 127.0.0.1:8080
Restart Apache:
sudo systemctl enable httpd sudo systemctl restart httpd
 - 
🧾 Obtain and Install Let’s Encrypt SSL Certificate
Now generate the SSL certificate with Certbot (for your Nginx server block):
sudo certbot --nginx -d zabbix-master.yourdomain.com
Follow prompts to:
- Agree to terms
 - Provide admin email
 - Enable HTTPS redirection (say Y)
 
Certbot automatically configures your SSL paths in
/etc/nginx/conf.d/zabbix.conf. -  
🪄 Verify HTTPS and Auto-Renewal
Check syntax and restart Nginx:
sudo nginx -t sudo systemctl enable --now nginx sudo systemctl restart nginx
Open your browser:
https://zabbix-master.yourdomain.com/zabbix
✅ You should see your Zabbix login page with a secure lock icon.
Test renewal simulation:
sudo certbot renew --dry-run
 -  
⚡ Optional Hardening
Enable HTTP Security Headers
Edit
/etc/nginx/conf.d/zabbix.confinside the HTTPS server block:add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy "strict-origin-when-cross-origin"; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Restart Nginx:
sudo systemctl restart nginx
 - 
🧠 Verify Integration
- Apache (Zabbix frontend) is running on 
127.0.0.1:8080 - Nginx proxies HTTPS requests to Apache
 - Certificates auto-renew every 60–90 days
 
Check process statuses:
sudo systemctl status nginx sudo systemctl status httpd sudo systemctl status zabbix-server
 - Apache (Zabbix frontend) is running on 
 
🧰 Troubleshooting Tips
| Issue | Solution | |
|---|---|---|
| Certbot fails to bind port 80 | Stop Apache temporarily: systemctl stop httpd before running Certbot. | 
|
| “502 Bad Gateway” | Verify Apache is listening on port 8080 and restart it. | |
| SSL works, but no dashboard | Ensure proxy_pass points to the correct local address and port. | 
|
| Auto-renew not running | Add a cron job: echo "0 3 * * * /usr/bin/certbot renew --quiet"        | sudo tee /etc/cron.d/certbot-renew | 
🔐 Final Architecture (with SSL)
[ User Browser ] | HTTPS (443) | +-------------+ | NGINX | ← SSL termination + reverse proxy +-------------+ | HTTP (8080) | +-------------+ | Apache + | | Zabbix UI | +-------------+ | +-------------+ | Zabbix | | Server | +-------------+ | +-------------+ | MariaDB | +-------------+
Conclusion
You now know how to deploy Zabbix multi-node monitoring system on AlmaLinux VPS.









