{"id":37605,"date":"2026-07-28T11:41:34","date_gmt":"2026-07-28T10:41:34","guid":{"rendered":"https:\/\/www.milesweb.co.uk\/blog\/?p=37605"},"modified":"2026-07-28T11:42:13","modified_gmt":"2026-07-28T10:42:13","slug":"zabbix-architecture-explained","status":"publish","type":"post","link":"https:\/\/www.milesweb.co.uk\/blog\/technology-hub\/zabbix-architecture-explained\/","title":{"rendered":"Zabbix Architecture Explained: How Zabbix Works Under the Hood"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Every alert that reaches an inbox has already passed through several layers of decisions about what to collect, how to process it, and when it counts as urgent. Zabbix is built almost entirely around getting that sequence right.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Underneath the dashboard sits an architecture that decides how fast a warning reaches someone and how much data a database can hold before performance suffers. Getting familiar with that architecture turns Zabbix from software running somewhere in the stack into a system an engineer actually understands and adjusts with intent.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Organisations running their infrastructures on a <a href=\"https:\/\/www.milesweb.co.uk\/hosting\/cloud-hosting\/\">cloud hosting<\/a> platform or a self-managed server usually pick Zabbix because it grows without forcing a redesign every time the server count doubles. That growth is possible because Zabbix keeps collection, processing, storage, and presentation as separate layers, each communicating with the next through a defined path rather than one large, tangled process.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this post, we will explore each of these layers individually and how they pass data between one another. We&#8217;ll also look at how the whole structure adjusts once monitoring scales from a single server room to infrastructure spread across regions.<\/p>\n\n\n\n<div class=\"skrlto-container\" style=\"border-radius: 13px;\npadding: 25px;\nbackground: #EEF6FF;\">\n<h2 class=\"skrlto-header-title\">Table Of Content<\/h2>\n<div class=\"skrlto-links-wrapper\">\n<ul>\n<li class=\"skroll-button\" data-skrolllto=\"WPT1WPTheme\">What is Zabbix architecture?<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT2WPTheme\">What are the core components of Zabbix architecture?<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT3WPTheme\">What does a Zabbix architecture diagram look like?<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT4WPTheme\">How do Zabbix servers and agents communicate?<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT5WPTheme\">What role does the Zabbix proxy play in distributed monitoring?<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT6WPTheme\">How does monitoring data flow through the system?<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT7WPTheme\">How can Zabbix architecture scale for large infrastructures?<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT8WPTheme\">Zabbix Architecture: Single-Server vs. Distributed Setup Comparison<\/li>\n<li class=\"skroll-button\" data-skrolllto=\"WPT9WPTheme\">Frequently Asked Questions<\/li>\n<\/div>\n<\/div>\n\n\n\n<h2 id=\"WPT1WPTheme\" class=\"wp-block-heading\">What is Zabbix architecture?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zabbix architecture describes how the server, agent, proxy, frontend, and database are arranged so they can collect, process, and present monitoring data without stepping on each other&#8217;s responsibilities. Each piece handles exactly one function, which is why a two-host setup and a two-thousand-host setup follow the same underlying design, with only the scale changing rather than the model itself. That consistency is what keeps monitoring Zabbix across infrastructure of any size predictable, rather than something that needs rebuilding as an environment expands.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Related Read<\/strong>: <a href=\"https:\/\/www.milesweb.co.uk\/blog\/technology-hub\/zabbix-dashboard-and-templates\/\">Zabbix Dashboard &amp; Templates: Building Custom Monitoring Views<\/a><\/p>\n\n\n\n<h2 id=\"WPT2WPTheme\" class=\"wp-block-heading\">What are the core components of Zabbix architecture?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Five components work together to move a metric from a monitored host into something an engineer can act on. None of them duplicate another&#8217;s job, ensuring that the entire system remains lightweight even as more hosts are added over time. Here is what each one actually does.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/www.milesweb.in\/blog\/wp-content\/uploads\/2026\/07\/what-are-the-core-components-of-zabbix-architecture.png\" alt=\"what-are-the-core-components-of-zabbix-architecture\" class=\"wp-image-52730\" style=\"width:840px;height:auto\"\/><\/figure>\n\n\n\n<title>Zabbix Components<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=Inter:wght@400;500;600;700&amp;display=swap\" rel=\"stylesheet\">\n<style>\n  :root{\n    --bg: #FFFFFF;\n    --panel: #F7F9FB;\n    --line: #E3E8EE;\n    --text: #1F2937;\n    --muted: #6B7684;\n    --c1: #2563EB; --c1-bg: #EAF2FE; --c1-tx: #1D4ED8;\n    --c2: #7C3AED; --c2-bg: #F1E9FE; --c2-tx: #6D28D9;\n    --c3: #0F9D8B; --c3-bg: #E4F5F3; --c3-tx: #0F5C58;\n    --c4: #D98A2B; --c4-bg: #FBF0DF; --c4-tx: #8A4E0E;\n    --c5: #0F9D58; --c5-bg: #E7F8EF; --c5-tx: #0B7A44;\n  }\n  *{box-sizing:border-box; margin:0; padding:0;}\n  body{\n    background: var(--bg) !important;\n    color: var(--text) !important;\n    font-family: 'Inter', sans-serif !important;\n    padding: 24px !important;\n  }\n  .pipeline{\n    width:100% !important;\n    max-width:860px !important;\n    margin:0 auto !important;\n  }\n  .stage{\n    display:table !important;\n    width:100% !important;\n    border-collapse:separate !important;\n    border-spacing:0 !important;\n    margin-bottom:16px !important;\n  }\n  .stage:last-child{ margin-bottom:0 !important; }\n\n  .node-cell{\n    display:table-cell !important;\n    vertical-align:top !important;\n    width:56px !important;\n    padding-right:20px !important;\n  }\n  .node{\n    width:56px !important;\n    height:56px !important;\n    border-radius:50% !important;\n    background: var(--panel) !important;\n    border:1.5px solid var(--line) !important;\n    display:flex !important;\n    align-items:center !important;\n    justify-content:center !important;\n    font-family:'IBM Plex Mono', monospace !important;\n    font-size:13px !important;\n    font-weight:600 !important;\n    color: var(--muted) !important;\n  }\n  .stage.c1 .node{ border-color: var(--c1) !important; color: var(--c1) !important; }\n  .stage.c2 .node{ border-color: var(--c2) !important; color: var(--c2) !important; }\n  .stage.c3 .node{ border-color: var(--c3) !important; color: var(--c3) !important; }\n  .stage.c4 .node{ border-color: var(--c4) !important; color: var(--c4) !important; }\n  .stage.c5 .node{ border-color: var(--c5) !important; color: var(--c5) !important; }\n\n  .card-cell{\n    display:table-cell !important;\n    vertical-align:top !important;\n  }\n  .card{\n    background: var(--panel) !important;\n    border:1px solid var(--line) !important;\n    border-left:4px solid var(--line) !important;\n    border-radius:10px !important;\n    padding:18px 20px !important;\n  }\n  .stage.c1 .card{ border-left-color: var(--c1) !important; }\n  .stage.c2 .card{ border-left-color: var(--c2) !important; }\n  .stage.c3 .card{ border-left-color: var(--c3) !important; }\n  .stage.c4 .card{ border-left-color: var(--c4) !important; }\n  .stage.c5 .card{ border-left-color: var(--c5) !important; }\n\n  .card-title{\n    font-size:15px !important;\n    font-weight:600 !important;\n    margin-bottom:6px !important;\n    display:flex !important;\n    align-items:center !important;\n    gap:10px !important;\n  }\n  .tag{\n    font-family:'IBM Plex Mono', monospace !important;\n    font-size:10px !important;\n    letter-spacing:0.08em !important;\n    border-radius:4px !important;\n    padding:2px 6px !important;\n    border:1px solid transparent !important;\n    display:inline-block !important;\n  }\n  .stage.c1 .tag{ color: var(--c1-tx) !important; background: var(--c1-bg) !important; border-color: var(--c1) !important; }\n  .stage.c2 .tag{ color: var(--c2-tx) !important; background: var(--c2-bg) !important; border-color: var(--c2) !important; }\n  .stage.c3 .tag{ color: var(--c3-tx) !important; background: var(--c3-bg) !important; border-color: var(--c3) !important; }\n  .stage.c4 .tag{ color: var(--c4-tx) !important; background: var(--c4-bg) !important; border-color: var(--c4) !important; }\n  .stage.c5 .tag{ color: var(--c5-tx) !important; background: var(--c5-bg) !important; border-color: var(--c5) !important; }\n\n  .card-desc{\n    font-size:13.5px !important;\n    color: var(--muted) !important;\n    line-height:1.55 !important;\n  }\n\n  @media (max-width:480px){\n    .node-cell{ width:44px !important; padding-right:14px !important; }\n    .node{ width:44px !important; height:44px !important; font-size:11px !important; }\n  }\n<\/style>\n\n\n\n  <div class=\"pipeline\">\n\n    <div class=\"stage c1\">\n      <div class=\"node-cell\"><div class=\"node\">01<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Zabbix Server <span class=\"tag\">CORE<\/span><\/div>\n          <div class=\"card-desc\">The processing core evaluates every incoming metric against configured triggers and runs the alerting engine that decides who gets notified and when.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage c2\">\n      <div class=\"node-cell\"><div class=\"node\">02<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Zabbix Database <span class=\"tag\">DB<\/span><\/div>\n          <div class=\"card-desc\">Typically MySQL or PostgreSQL, it stores configuration data, historical values, and trend information; running it on a dedicated server keeps queries fast even as years of history accumulate.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage c3\">\n      <div class=\"node-cell\"><div class=\"node\">03<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Zabbix Frontend <span class=\"tag\">UI<\/span><\/div>\n          <div class=\"card-desc\">The web interface where the Zabbix Dashboard lives; this component pulls processed data from the database and renders it as graphs and widgets teams can tailor to their view.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage c4\">\n      <div class=\"node-cell\"><div class=\"node\">04<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Zabbix Proxy <span class=\"tag\">OPTIONAL<\/span><\/div>\n          <div class=\"card-desc\">An optional layer that collects and forwards data on the server&#8217;s behalf once monitoring spans multiple locations, which is covered in more depth further down.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage c5\">\n      <div class=\"node-cell\"><div class=\"node\">05<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Zabbix Agent \/ Agent2 <span class=\"tag\">HOST<\/span><\/div>\n          <div class=\"card-desc\">The agent sits on each monitored host and collects local metrics such as CPU load and memory usage. Agent2 is the newer build, adding plugin support for faster, more frequent checks.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"WPT3WPTheme\" class=\"wp-block-heading\">What does a Zabbix architecture diagram look like?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Built around a website monitoring setup, a diagram like this would show several web hosts feeding metrics into one central server, with the frontend pulling uptime and response time figures straight from that pipeline.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/www.milesweb.in\/blog\/wp-content\/uploads\/2026\/07\/what-does-a-zabbix-architecture-diagram-look-like.png\" alt=\"what-does-a-zabbix-architecture-diagram-look-like\" class=\"wp-image-52731\" style=\"width:840px;height:auto\"\/><\/figure>\n\n\n\n<h2 id=\"WPT4WPTheme\" class=\"wp-block-heading\">How do Zabbix servers and agents communicate?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Communication between server and agent runs on a small set of rules, and getting these right avoids most of the connectivity issues teams run into during setup.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n<title>Checks, Ports, and Polling<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  :root{\n    --border: #E3E8EE;\n  }\n  *{box-sizing:border-box; margin:0; padding:0;}\n  body{\n    font-family:'Inter', sans-serif;\n    padding:24px;\n    background:#FFFFFF;\n  }\n  .row{\n    display:flex;\n    flex-direction:column;\n    gap:16px;\n    max-width:960px;\n    margin:0 auto;\n  }\n  .card{\n    background:#FFFFFF !important;\n    border:1px solid var(--border) !important;\n    border-radius:12px !important;\n    padding:20px 22px !important;\n    display:table !important;\n    width:100% !important;\n  }\n  .icon{\n    display:table-cell !important;\n    vertical-align:top !important;\n    width:44px !important;\n    padding-right:18px !important;\n  }\n  .icon span{\n    display:flex;\n    width:44px;\n    height:44px;\n    align-items:center;\n    justify-content:center;\n  }\n  .icon svg{ width:24px; height:24px; }\n  .card-body{\n    display:table-cell !important;\n    vertical-align:top !important;\n    text-align:left !important;\n  }\n  .card-title{\n    font-size:16px;\n    font-weight:700;\n    color:#000000;\n    line-height:1.35;\n    margin-bottom:6px;\n  }\n  .card-desc{\n    font-size:14px;\n    color:#000000;\n    line-height:1.6;\n  }\n\n  .icon.checks svg{ stroke:#2563EB; }\n  .icon.ports svg{ stroke:#D98A2B; }\n  .icon.poll svg{ stroke:#0F9D58; }\n\n  @media (max-width:520px){\n    .card, .icon, .card-body{ display:block !important; }\n    .icon{ margin-bottom:12px; }\n  }\n<\/style>\n<\/head>\n<body>\n\n  <div class=\"row\">\n\n    <div class=\"card\">\n      <div class=\"icon checks\">\n        <span><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 12h4M7 8h4M7 16h2\"\/><rect x=\"3\" y=\"4\" width=\"8\" height=\"16\" rx=\"1.5\"\/><path d=\"M15 7l3 3 5-5\"\/><path d=\"M15 15l3 3 5-5\"\/><\/svg><\/span>\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"card-title\">Active checks vs. passive checks<\/div>\n        <div class=\"card-desc\">Passive checks have the server request data from the agent on its own schedule, while active checks flip that relationship and let the agent push information whenever it&#8217;s ready, a pattern that suits environments with a large host count better.<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"icon ports\">\n        <span><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"9\" width=\"18\" height=\"10\" rx=\"2\"\/><path d=\"M8 9V6a4 4 0 0 1 8 0v3\"\/><circle cx=\"12\" cy=\"14\" r=\"1.5\"\/><\/svg><\/span>\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"card-title\">Ports 10050 \/ 10051<\/div>\n        <div class=\"card-desc\">Port 10050 belongs to the agent and listens for requests during passive checks, while port 10051 belongs to the server, receiving data pushed by agents running active checks or by proxies forwarding what they&#8217;ve collected.<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"icon poll\">\n        <span><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M12 7v5l3.5 2\"\/><\/svg><\/span>\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"card-title\">Polling vs. trapping<\/div>\n        <div class=\"card-desc\">Polling describes the server pulling data at intervals, matching passive checks, while trapping describes the agent pushing data the moment a local trigger fires, matching active checks; most production environments end up blending both.<\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n<\/body>\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Related Read<\/strong>: <a href=\"http:\/\/www.milesweb.co.uk\/blog\/technology-hub\/what-is-agent-zero-ai\/\">What Is Agent Zero AI? Complete Guide to Installation, Safety &amp; Setup<\/a><\/p>\n\n\n\n<h2 id=\"WPT5WPTheme\" class=\"wp-block-heading\">What role does the Zabbix proxy play in distributed monitoring?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A proxy earns its place once an environment spans remote websites, crosses firewall segments, or includes enough hosts that one server would struggle polling everyone directly. Instead of every host reporting straight to a central server, hosts report to a nearby proxy, which batches that data before forwarding it onward. This reduces both network traffic and the load on the main server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Direct agent-to-server communication works perfectly well for a single location with a manageable host count, since adding an intermediate layer there gains nothing. Proxies prove genuinely useful once server monitoring spans more than one cloud platform or geographic region, trimming how much data crosses network boundaries on its way to the central server. The choice between the two depends on the infrastructure&#8217;s actual distribution, not just the number of hosts.<\/p>\n\n\n\n<h2 id=\"WPT6WPTheme\" class=\"wp-block-heading\">How does monitoring data flow through the system?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Data inside Zabbix follows the same sequence regardless of whether an environment runs ten hosts or ten thousand. Each stage hands off cleanly to the next, and naming these stages individually makes the whole pipeline easier to visualise, whether for internal documentation or for building an actual infographic of the process.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/www.milesweb.in\/blog\/wp-content\/uploads\/2026\/07\/how-does-monitoring-data-flow-through-the-system.png\" alt=\"how-does-monitoring-data-flow-through-the-system\" class=\"wp-image-52769\" style=\"width:840px;height:auto\"\/><\/figure>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n<title>Monitoring Pipeline<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Mono:wght@400;500;600&#038;family=Inter:wght@400;500;600;700&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  :root{\n    --bg: #FFFFFF;\n    --panel: #F7F9FB;\n    --line: #E3E8EE;\n    --text: #1F2937;\n    --muted: #6B7684;\n    --signal: #2BA6A0;\n    --alert: #D98A2B;\n    --alert-bg: #FBF0DF;\n    --alert-tx: #8A4E0E;\n  }\n  *{box-sizing:border-box; margin:0; padding:0;}\n  body{\n    background: var(--bg) !important;\n    color: var(--text) !important;\n    font-family: 'Inter', sans-serif !important;\n    padding: 24px !important;\n  }\n  .pipeline{\n    width:100% !important;\n    max-width:860px !important;\n    margin:0 auto !important;\n  }\n  .stage{\n    display:table !important;\n    width:100% !important;\n    border-collapse:separate !important;\n    border-spacing:0 !important;\n    margin-bottom:16px !important;\n  }\n  .stage:last-child{ margin-bottom:0 !important; }\n\n  .node-cell{\n    display:table-cell !important;\n    vertical-align:top !important;\n    width:56px !important;\n    padding-right:20px !important;\n  }\n  .node{\n    width:56px !important;\n    height:56px !important;\n    border-radius:50% !important;\n    background: var(--panel) !important;\n    border:1px solid var(--line) !important;\n    display:flex !important;\n    align-items:center !important;\n    justify-content:center !important;\n    font-family:'IBM Plex Mono', monospace !important;\n    font-size:13px !important;\n    color: var(--muted) !important;\n  }\n  .stage.final .node{\n    border-color: var(--alert) !important;\n    color: var(--alert) !important;\n  }\n\n  .card-cell{\n    display:table-cell !important;\n    vertical-align:top !important;\n  }\n  .card{\n    background: var(--panel) !important;\n    border:1px solid var(--line) !important;\n    border-radius:10px !important;\n    padding:18px 20px !important;\n  }\n  .stage.final .card{\n    border-color: var(--alert) !important;\n  }\n  .card-title{\n    font-size:15px !important;\n    font-weight:600 !important;\n    margin-bottom:6px !important;\n    display:flex !important;\n    align-items:center !important;\n    gap:10px !important;\n  }\n  .tag{\n    font-family:'IBM Plex Mono', monospace !important;\n    font-size:10px !important;\n    letter-spacing:0.08em !important;\n    color: #0F5C58 !important;\n    background: #E4F5F3 !important;\n    border:1px solid var(--signal) !important;\n    border-radius:4px !important;\n    padding:2px 6px !important;\n    display:inline-block !important;\n  }\n  .stage.final .tag{\n    color: var(--alert-tx) !important;\n    background: var(--alert-bg) !important;\n    border-color: var(--alert) !important;\n  }\n  .card-desc{\n    font-size:13.5px !important;\n    color: var(--muted) !important;\n    line-height:1.55 !important;\n  }\n\n  @media (max-width:480px){\n    .node-cell{ width:44px !important; padding-right:14px !important; }\n    .node{ width:44px !important; height:44px !important; font-size:11px !important; }\n  }\n<\/style>\n<\/head>\n<body>\n\n  <div class=\"pipeline\">\n\n    <div class=\"stage\">\n      <div class=\"node-cell\"><div class=\"node\">01<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Collection <span class=\"tag\">AGENT<\/span><\/div>\n          <div class=\"card-desc\">The agent reads local system metrics or executes configured checks against the host it&#8217;s installed on.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage\">\n      <div class=\"node-cell\"><div class=\"node\">02<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Transmission <span class=\"tag\">NETWORK<\/span><\/div>\n          <div class=\"card-desc\">The agent sends data straight to the server, or through a proxy if one is in between.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage\">\n      <div class=\"node-cell\"><div class=\"node\">03<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Processing <span class=\"tag\">SERVER<\/span><\/div>\n          <div class=\"card-desc\">The server runs each value against its configured triggers.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage\">\n      <div class=\"node-cell\"><div class=\"node\">04<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Storage <span class=\"tag\">DATABASE<\/span><\/div>\n          <div class=\"card-desc\">The database keeps that data, current and past, so it&#8217;s available later.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage\">\n      <div class=\"node-cell\"><div class=\"node\">05<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Visualisation <span class=\"tag\">FRONTEND<\/span><\/div>\n          <div class=\"card-desc\">The frontend turns stored data into graphs, widgets, and dashboard views.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"stage final\">\n      <div class=\"node-cell\"><div class=\"node\">06<\/div><\/div>\n      <div class=\"card-cell\">\n        <div class=\"card\">\n          <div class=\"card-title\">Alerting <span class=\"tag\">NOTIFY<\/span><\/div>\n          <div class=\"card-desc\">The moment a trigger condition is satisfied, the server routes a notification through whichever media type has been configured.<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n<\/body>\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Related Read<\/strong>: <a href=\"https:\/\/www.milesweb.co.uk\/blog\/hosting\/vps\/how-to-run-grafana-with-docker\/\">How to Run Grafana with Docker? (Step-by-Step Guide for Beginners)<\/a><br><\/p>\n\n\n\n<h2 id=\"WPT7WPTheme\" class=\"wp-block-heading\">How can Zabbix architecture scale for large infrastructures?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Scaling Zabbix rarely means replacing what&#8217;s already running. It usually means adding the right component at the right point, and three approaches cover most large-infrastructure needs.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<title>Scaling Considerations<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Mono:wght@400;500;600&amp;family=Inter:wght@400;500;600;700&amp;display=swap\" rel=\"stylesheet\">\n<style>\n  :root{\n    --bg: #FFFFFF;\n    --panel: #F7F9FB;\n    --line: #E3E8EE;\n    --text: #000000;\n    --muted: #1F2937;\n    --signal: #2BA6A0;\n    --signal-bg: #E4F5F3;\n    --signal-text: #0F5C58;\n  }\n  *{box-sizing:border-box; margin:0; padding:0;}\n  body{\n    background: var(--bg);\n    color: var(--text);\n    font-family: 'Inter', sans-serif;\n    padding: 24px;\n  }\n  .row{\n    display:flex;\n    flex-direction:column;\n    gap:16px;\n    max-width:960px;\n    margin:0 auto;\n  }\n  .card{\n    background: var(--panel) !important;\n    border:1px solid var(--line) !important;\n    border-radius:12px !important;\n    padding:20px 22px !important;\n    display:table !important;\n    width:100% !important;\n  }\n  .icon{\n    display:table-cell !important;\n    vertical-align:top !important;\n    width:44px !important;\n    padding-right:18px !important;\n  }\n  .icon span{\n    display:flex;\n    width:44px;\n    height:44px;\n    align-items:center;\n    justify-content:center;\n  }\n  .icon svg{ width:22px; height:22px; }\n  .card-body{\n    display:table-cell !important;\n    vertical-align:top !important;\n    text-align:left !important;\n  }\n  .card-title{\n    font-size:16px;\n    font-weight:600;\n    color: var(--text);\n    line-height:1.35;\n  }\n  .card-desc{\n    font-size:13.5px;\n    color: var(--muted);\n    line-height:1.6;\n  }\n\n  .icon.ha span{ background:none; }\n  .icon.ha svg{ stroke:#2563EB; }\n  .icon.proxy span{ background:none; }\n  .icon.proxy svg{ stroke:#0F9D58; }\n  .icon.tuning span{ background:none; }\n  .icon.tuning svg{ stroke:#D98A2B; }\n\n  @media (max-width:520px){\n    .card, .icon, .card-body{ display:block !important; }\n    .icon{ margin-bottom:12px; }\n  }\n<\/style>\n\n\n\n  <div class=\"row\">\n\n    <div class=\"card\">\n      <div class=\"icon ha\">\n        <span><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"6\" rx=\"1.5\"><\/rect><rect x=\"3\" y=\"14\" width=\"18\" height=\"6\" rx=\"1.5\"><\/rect><circle cx=\"7\" cy=\"7\" r=\"0.5\"><\/circle><circle cx=\"7\" cy=\"17\" r=\"0.5\"><\/circle><\/svg><\/span>\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"card-title\">High-availability clustering<\/div>\n        <div class=\"card-desc\">Runs multiple server instances at once, with a standby node ready to take over automatically the moment the active instance fails, keeping monitoring continuous through hardware failures or planned maintenance.<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"icon proxy\">\n        <span><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"><\/circle><path d=\"M3 12h18M12 3c2.5 2.5 3.8 5.6 3.8 9s-1.3 6.5-3.8 9c-2.5-2.5-3.8-5.6-3.8-9s1.3-6.5 3.8-9z\"><\/path><\/svg><\/span>\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"card-title\">Multiple proxies for geo-distributed monitoring<\/div>\n        <div class=\"card-desc\">Positioning a proxy in each region lets local hosts report nearby instead of sending data across long network paths back to one server. Teams handling a <a href=\"https:\/\/www.milesweb.co.uk\/hosting\/website-migration\" style=\"color: #1F7A3D; font-weight: bold;\">website migration<\/a> to larger, multi-region infrastructure often expand their proxy count at the same time as new regions come online.<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"card\">\n      <div class=\"icon tuning\">\n        <span><svg viewBox=\"0 0 24 24\" fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3v4M12 17v4M5 12H3M21 12h-2M7.8 7.8 6.3 6.3M17.7 17.7l-1.5-1.5M7.8 16.2l-1.5 1.5M17.7 6.3l-1.5 1.5\"><\/path><circle cx=\"12\" cy=\"12\" r=\"4\"><\/circle><\/svg><\/span>\n      <\/div>\n      <div class=\"card-body\">\n        <div class=\"card-title\">Performance tuning<\/div>\n        <div class=\"card-desc\">Partitioning large historical tables speeds up queries. Housekeeping settings control how long historical data stays in the database, which shapes both its size and its performance.<\/div>\n      <\/div>\n    <\/div>\n\n  <\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 id=\"WPT8WPTheme\" class=\"wp-block-heading\">Zabbix Architecture: Single-Server vs. Distributed Setup Comparison<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A single-server setup keeps everything centralised, making it a natural fit for smaller teams, including those running a single <a href=\"https:\/\/www.milesweb.co.uk\/ai-website-builder\">AI website-building<\/a> platform across a limited number of hosts. A distributed setup spreads proxies and monitoring logic across regions, and unlike lightweight tools such as <a href=\"http:\/\/www.milesweb.co.uk\/blog\/technology-hub\/what-is-airtable\/\">Airtable<\/a> used for tracking spreadsheets, Zabbix&#8217;s frontend stays purpose-built for live infrastructure data in either configuration.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n\n<title>Setup Comparison<\/title>\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700;800&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  :root{\n    --ink: #0F172A;\n    --sub: #475569;\n    --border: #E2E8F0;\n    --single-a: #2563EB;\n    --single-b: #1D4ED8;\n    --dist-a: #0EA572;\n    --dist-b: #0A8058;\n    --row-alt: #F8FAFC;\n  }\n  *{box-sizing:border-box; margin:0; padding:0;}\n  body{\n    font-family:'Inter', sans-serif;\n    padding:32px 20px;\n    background:#FFFFFF;\n  }\n  .wrap{\n    max-width:920px;\n    margin:0 auto;\n  }\n  h1{\n    font-size:22px;\n    font-weight:800;\n    color:var(--ink);\n    letter-spacing:-0.01em;\n    margin-bottom:6px;\n  }\n  .sub{\n    font-size:14px;\n    color:var(--sub);\n    margin-bottom:24px;\n  }\n  table{\n    width:100%;\n    border-collapse:separate;\n    border-spacing:0;\n    border-radius:16px;\n    overflow:hidden;\n    box-shadow: 0 1px 2px rgba(15,23,42,0.04), 0 12px 32px -12px rgba(15,23,42,0.18);\n    border:1px solid var(--border);\n  }\n  thead th{\n    text-align:left;\n    padding:18px 22px;\n    font-size:13px;\n    font-weight:700;\n    letter-spacing:0.03em;\n    text-transform:uppercase;\n  }\n  thead th:first-child{\n    background:var(--ink);\n    color:#F1F5F9;\n    width:22%;\n  }\n  thead th.single{\n    background:linear-gradient(135deg, var(--single-a), var(--single-b));\n    color:#EFF6FF;\n  }\n  thead th.dist{\n    background:linear-gradient(135deg, var(--dist-a), var(--dist-b));\n    color:#ECFDF5;\n  }\n  .th-inner{\n    display:flex;\n    align-items:center;\n    gap:8px;\n  }\n  .th-inner svg{ width:16px; height:16px; flex-shrink:0; opacity:0.9; }\n\n  tbody td{\n    padding:16px 22px;\n    font-size:14px;\n    color:#1E293B;\n    border-bottom:1px solid var(--border);\n    vertical-align:top;\n    line-height:1.55;\n  }\n  tbody tr:last-child td{ border-bottom:none; }\n  tbody tr:nth-child(even) td{ background:var(--row-alt); }\n\n  tbody td:first-child{\n    font-weight:700;\n    color:var(--ink);\n    font-size:13.5px;\n    border-left:3px solid transparent;\n  }\n  tbody td.single{ border-left:3px solid #BFDBFE; }\n  tbody td.dist{ border-left:3px solid #A7F3D0; }\n\n  @media (max-width:640px){\n    table{ box-shadow:none; border-radius:12px; }\n    table, thead, tbody, th, td, tr{ display:block; }\n    thead{ display:none; }\n    tbody tr{ border-bottom:1px solid var(--border); padding:14px 0; }\n    tbody tr:nth-child(even){ background:var(--row-alt); }\n    tbody tr:last-child{ border-bottom:none; }\n    tbody td{ border-bottom:none; padding:8px 20px; border-left:none !important; }\n    tbody td:first-child{ padding-bottom:2px; }\n    tbody td.single::before{ content:\"Single-server \u2014 \"; color:var(--single-b); font-weight:700; }\n    tbody td.dist::before{ content:\"Distributed \u2014 \"; color:var(--dist-b); font-weight:700; }\n  }\n<\/style>\n<\/head>\n<body>\n<div class=\"wrap\">\n\n  <table>\n    <thead>\n      <tr>\n        <th>Criteria<\/th>\n        <th class=\"single\">\n          <div class=\"th-inner\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"6\" rx=\"1.5\"\/><rect x=\"3\" y=\"14\" width=\"18\" height=\"6\" rx=\"1.5\"\/><\/svg>\n            Single-server\n          <\/div>\n        <\/th>\n        <th class=\"dist\">\n          <div class=\"th-inner\">\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"5\" cy=\"6\" r=\"2.5\"\/><circle cx=\"19\" cy=\"6\" r=\"2.5\"\/><circle cx=\"12\" cy=\"18\" r=\"2.5\"\/><path d=\"M7 7.5 10.5 16M17 7.5 13.5 16\"\/><\/svg>\n            Distributed Setup\n          <\/div>\n        <\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr>\n        <td>Best Suited For<\/td>\n        <td class=\"single\">One location, moderate host count<\/td>\n        <td class=\"dist\">Multiple regions, firewalled segments, large host count<\/td>\n      <\/tr>\n      <tr>\n        <td>Key Strength<\/td>\n        <td class=\"single\">Simple to configure and manage<\/td>\n        <td class=\"dist\">Reduces network load and central server strain<\/td>\n      <\/tr>\n      <tr>\n        <td>Trade-off<\/td>\n        <td class=\"single\">Limited headroom as host count climbs<\/td>\n        <td class=\"dist\">Requires managing multiple proxies<\/td>\n      <\/tr>\n      <tr>\n        <td>Network Load<\/td>\n        <td class=\"single\">All hosts report directly to one server<\/td>\n        <td class=\"dist\">Local hosts report to a nearby proxy first<\/td>\n      <\/tr>\n      <tr>\n        <td>Maintenance Effort<\/td>\n        <td class=\"single\">Low \u2014 one instance to patch and monitor<\/td>\n        <td class=\"dist\">Higher \u2014 each proxy needs its own upkeep<\/td>\n      <\/tr>\n      <tr>\n        <td>Scalability<\/td>\n        <td class=\"single\">Vertical only \u2014 bigger server, same architecture<\/td>\n        <td class=\"dist\">Horizontal \u2014 add proxies as regions or hosts grow<\/td>\n      <\/tr>\n      <tr>\n        <td>Failure Impact<\/td>\n        <td class=\"single\">Server outage stops all monitoring<\/td>\n        <td class=\"dist\">A proxy outage only affects its own segment<\/td>\n      <\/tr>\n      <tr>\n        <td>Typical Cost<\/td>\n        <td class=\"single\">Lower \u2014 single instance to license and host<\/td>\n        <td class=\"dist\">Higher \u2014 additional infrastructure per proxy<\/td>\n      <\/tr>\n    <\/tbody>\n  <\/table>\n\n<\/div>\n<\/body>\n<\/html>\n\n\n\n<div class=\"vlt-box \">\n<div class=\"box-title\" style=\"background:#D5EAFF; color:#000\">Final Thoughts<\/div>\n<div class=\"box-content\" >\n<p>Zabbix architecture holds together because each component does one job well and connects cleanly to whatever comes next. The agent collects the data, and the proxy forwards it when distance requires that extra hop. The server processes it and raises alerts, while the database stores it. The frontend then turns all of that into something people can actually use. Once that flow is clear, scaling stops feeling uncertain and turns into a matter of adding the right component at the right point.<\/p>\n<p>Teams just getting started should build from the official templates first, then adjust dashboards for different audiences as monitoring requirements evolve. Get that foundation right, and everything after it becomes far less of a headache, whether it&#8217;s a second data center, an added proxy, or a monitoring setup nobody has thought of yet.<\/p>\n<\/div><\/div>\n\n\n\n<div class=\"vlt-box \">\n<h2 class=\"box-title\" style=\"background:#D5EAFF; color:#000\" id=\"WPT9WPTheme\">Frequently Asked Questions<\/h2>\n<div class=\"box-content\" >\n<h3 class=\"box-title\" style=\"background:#D5EAFF; color:#000\">1. What is a Zabbix proxy used for?<\/h3>\n<p>A proxy operates between agents and the server, collecting data locally and forwarding it onward. Teams usually add one when hosts are spread across regions or behind separate firewalls, so the central server isn&#8217;t left polling every host directly.<\/p>\n<h3 class=\"box-title\" style=\"background:#D5EAFF; color:#000\">2. Does Zabbix need a database?<\/h3>\n<p>Yes. Zabbix runs on either MySQL or PostgreSQL to hold its configuration, historical values, and trend data. Without that database, the server has no place to write anything.<\/p>\n<h3 class=\"box-title\" style=\"background:#D5EAFF; color:#000\">3. Can Zabbix monitor both Linux and Windows servers?<\/h3>\n<p>Yes. Agents run on both operating systems, and once added as hosts, the server treats them the same way. A single setup can cover a mixed environment without extra configuration layers.<\/p>\n<h3 class=\"box-title\" style=\"background:#D5EAFF; color:#000\">4. How long does Zabbix keep historical data?<\/h3>\n<p>Retention depends on the housekeeping settings for each item. Most teams keep a few weeks of detailed history and a year or more of trend data, depending on how much storage they can spare.<\/p>\n<h3 class=\"box-title\" style=\"background:#D5EAFF; color:#000\">5. How does Zabbix send alerts?<\/h3>\n<p>Zabbix sends alerts through whichever media type is configured, be it email, SMS, or a tool like Slack. Each trigger links to an action, so different severities can reach different people through different channels.<\/p>\n<h3 class=\"box-title\" style=\"background:#D5EAFF; color:#000\">6. Is Zabbix free to use?<\/h3>\n<p>Yes. Zabbix is open-source, and there&#8217;s no license fee tied to how many hosts you monitor. Paid support and training exist separately for teams that want direct help from the vendor.<\/p>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every alert that reaches an inbox has already passed through several layers of decisions about what to collect, how to process it, and when it counts as urgent. Zabbix is built almost entirely around getting that sequence right. Underneath the dashboard sits an architecture that decides how fast a warning reaches someone and how much&#8230; <a class=\"read-more\" href=\"https:\/\/www.milesweb.co.uk\/blog\/technology-hub\/zabbix-architecture-explained\/\">Read More<\/a><\/p>\n","protected":false},"author":964,"featured_media":37606,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[127],"tags":[],"class_list":["post-37605","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology-hub"],"_links":{"self":[{"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/posts\/37605","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/users\/964"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/comments?post=37605"}],"version-history":[{"count":4,"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/posts\/37605\/revisions"}],"predecessor-version":[{"id":37611,"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/posts\/37605\/revisions\/37611"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/media\/37606"}],"wp:attachment":[{"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/media?parent=37605"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/categories?post=37605"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milesweb.co.uk\/blog\/wp-json\/wp\/v2\/tags?post=37605"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}