The only agent that thinks for itself

Autonomous Monitoring with self-learning AI built-in, operating independently across your entire stack.

Unlimited Metrics & Logs
Machine learning & MCP
5% CPU, 150MB RAM
3GB disk, >1 year retention
800+ integrations, zero config
Dashboards, alerts out of the box
> Discover Netdata Agents

Centralized metrics streaming and storage

Aggregate metrics from multiple agents into centralized Parent nodes for unified monitoring across your infrastructure.

Stream from unlimited agents
Long-term data retention
High availability clustering
Data replication & backup
Scalable architecture
Enterprise-grade security
> Learn about Parents

Fully managed cloud platform

Access your monitoring data from anywhere with our SaaS platform. No infrastructure to manage, automatic updates, and global availability.

Zero infrastructure management
99.9% uptime SLA
Global data centers
Automatic updates & patches
Enterprise SSO & RBAC
SOC2 & ISO certified
> Explore Netdata Cloud

Deploy Netdata Cloud in your infrastructure

Run the full Netdata Cloud platform on-premises for complete data sovereignty and compliance with your security policies.

Complete data sovereignty
Air-gapped deployment
Custom compliance controls
Private network integration
Dedicated support team
Kubernetes & Docker support
> Learn about Cloud On-Premises

Powerful, intuitive monitoring interface

Modern, responsive UI built for real-time troubleshooting with customizable dashboards and advanced visualization capabilities.

Real-time chart updates
Customizable dashboards
Dark & light themes
Advanced filtering & search
Responsive on all devices
Collaboration features
> Explore Netdata UI

Monitor on the go

Native iOS and Android apps bring full monitoring capabilities to your mobile device with real-time alerts and notifications.

iOS & Android apps
Push notifications
Touch-optimized interface
Offline data access
Biometric authentication
Widget support
> Download apps

The future of infrastructure observability

See our strategic direction across AI-native observability, full-stack signals, operational intelligence, and enterprise platform maturity.

AI-native observability
Full-stack signal coverage
Operational intelligence
Enterprise platform maturity
Agent releases every 6 weeks
Cloud continuous delivery
> Explore Product Roadmap

Best energy efficiency

True real-time per-second

100% automated zero config

Centralized observability

Multi-year retention

High availability built-in

Zero maintenance

Always up-to-date

Enterprise security

Complete data control

Air-gap ready

Compliance certified

Millisecond responsiveness

Infinite zoom & pan

Works on any device

Native performance

Instant alerts

Monitor anywhere

AI-native observability

Continuous delivery

Open source foundation

80% Faster Incident Resolution

AI-powered troubleshooting from detection, to root cause and blast radius identification, to reporting.

True Real-Time and Simple, even at Scale

Linearly and infinitely scalable full-stack observability, that can be deployed even mid-crisis.

90% Cost Reduction, Full Fidelity

Instead of centralizing the data, Netdata distributes the code, eliminating pipelines and complexity.

See and Map Your Entire Network

Live topology, flow analytics, and SNMP device and trap monitoring — unified with your full-stack observability.

Control Without Surrender

SOC 2 Type 2 certified with every metric kept on your infrastructure.

Integrations

800+ collectors and notification channels, auto-discovered and ready out of the box.

800+ data collectors
Auto-discovery & zero config
Cloud, infra, app protocols
Notifications out of the box
> Explore integrations
Real Results
46% Cost Reduction

Reduced monitoring costs by 46% while cutting staff overhead by 67%.

— Leonardo Antunez, Codyas

Zero Pipeline

No data shipping. No central storage costs. Query at the edge.

From Our Users
"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

No Query Language

Point-and-click troubleshooting. No PromQL, no LogQL, no learning curve.

Enterprise Ready
67% Less Staff, 46% Cost Cut

Enterprise efficiency without enterprise complexity—real ROI from day one.

— Leonardo Antunez, Codyas

SOC 2 Type 2 Certified

Zero data egress. Only metadata reaches the cloud. Your metrics stay on your infrastructure.

Full Coverage
800+ Collectors

Auto-discovered and configured. No manual setup required.

Any Notification Channel

Slack, PagerDuty, Teams, email, webhooks—all built-in.

Built for the People Who Get Paged

Because 3am alerts deserve instant answers, not hour-long hunts.

Every Industry Has Rules. We Master Them.

See how healthcare, finance, and government teams cut monitoring costs 90% while staying audit-ready.

Monitor Any Technology. Configure Nothing.

Install the agent. It already knows your stack.
From Our Users
"A Rare Unicorn"

Netdata gives more than you invest in it. A rare unicorn that obeys the Pareto rule.

— Eduard Porquet Mateu, TMB Barcelona

99% Downtime Reduction

Reduced website downtime by 99% and cloud bill by 30% using Netdata alerts.

— Falkland Islands Government

Real Savings
30% Cloud Cost Reduction

Optimized resource allocation based on Netdata alerts cut cloud spending by 30%.

— Falkland Islands Government

46% Cost Cut

Reduced monitoring staff by 67% while cutting operational costs by 46%.

— Codyas

Real Coverage
"Plugin for Everything"

Netdata has agent capacity or a plugin for everything, including Windows and Kubernetes.

— Eduard Porquet Mateu, TMB Barcelona

"Out-of-the-Box"

So many out-of-the-box features! I mostly don't have to develop anything.

— Simon Beginn, LANCOM Systems

Real Speed
Troubleshooting in 30 Seconds

From 2-3 minutes to 30 seconds—instant visibility into any node issue.

— Matthew Artist, Nodecraft

20% Downtime Reduction

20% less downtime and 40% budget optimization from out-of-the-box monitoring.

— Simon Beginn, LANCOM Systems

Pay per Node. Unlimited Everything Else.

One price per node. Unlimited metrics, logs, users, and retention. No per-GB surprises.

Free tier—forever
No metric limits or caps
Retention you control
Cancel anytime
> See pricing plans

What's Your Monitoring Really Costing You?

Most teams overpay by 40-60%. Let's find out why.

Expose hidden metric charges
Calculate tool consolidation
Customers report 30-67% savings
Results in under 60 seconds
> See what you're really paying

Your Infrastructure Is Unique. Let's Talk.

Because monitoring 10 nodes is different from monitoring 10,000.

On-prem & air-gapped deployment
Volume pricing & agreements
Architecture review for your scale
Compliance & security support
> Start a conversation

Monitoring That Sells Itself

Deploy in minutes. Impress clients in hours. Earn recurring revenue for years.

30-second live demos close deals
Zero config = zero support burden
Competitive margins & deal protection
Response in 48 hours
> Apply to partner

Per-Second Metrics at Homelab Prices

Same engine, same dashboards, same ML. Just priced for tinkerers.

Community: Free forever · 5 nodes · non-commercial
Homelab: $90/yr · unlimited nodes · fair usage
> Get the Homelab Plan

$1,000 Per Referral. Unlimited Referrals.

Your colleagues get 10% off. You get 10% commission. Everyone wins.

10% of subscriptions, up to $1,000 each
Track earnings inside Netdata Cloud
PayPal/Venmo payouts in 3-4 weeks
No caps, no complexity
> Get your referral link
Cost Proof
40% Budget Optimization

"Netdata's significant positive impact" — LANCOM Systems

Calculate Your Savings

Compare vs Datadog, Grafana, Dynatrace

Savings Proof
46% Cost Reduction

"Cut costs by 46%, staff by 67%" — Codyas

30% Cloud Bill Savings

"Reduced cloud bill by 30%" — Falkland Islands Gov

Enterprise Proof
"Better Than Combined Alternatives"

"Better observability with Netdata than combining other tools." — TMB Barcelona

Real Engineers, <24h Response

DPA, SLAs, on-prem, volume pricing

Why Partners Win
Demo Live Infrastructure

One command, 30 seconds, real data—no sandbox needed

Zero Tickets, High Margins

Auto-config + per-node pricing = predictable profit

Homelab Ready
Free Video Course

8-episode Netdata tutorial by LearnLinux.tv

76k+ GitHub Stars

3rd most starred monitoring project

Worth Recommending
Product That Delivers

Customers report 40-67% cost cuts, 99% downtime reduction

Zero Risk to Your Rep

Free tier lets them try before they buy

AI Support Assistant, Available 24/7

Nedi has access to all official documentation, source code, and resources. Ask any question about Netdata—responds in your language.

Deployment & configuration
Troubleshooting & sizing
Alerts & notifications
Evidence-based answers
> Ask Nedi now

Never Fight Fires Alone

Docs, community, and expert help—pick your path to resolution.

Learn.netdata.cloud docs
Discord, Forums, GitHub
Premium support available
> Get answers now

60 Seconds to First Dashboard

One command to install. Zero config. 850+ integrations documented.

Linux, Windows, K8s, Docker
Auto-discovers your stack
> Read our documentation

76,000+ Engineers Strong

615+ contributors. 1.5M daily downloads. One mission: simplify observability.

Per-Second. 90% Cheaper. Data Stays Home.

Side-by-side comparisons: costs, real-time granularity, and data sovereignty for every major tool.

See why teams switch from Datadog, Prometheus, Grafana, and more.

> Browse all comparisons
Edge-Native Observability, Born Open Source
Per-second visibility, ML on every metric, and data that never leaves your infrastructure.
Founded in 2016
615+ contributors worldwide
Remote-first, engineering-driven
Open source first
> Read our story
Promises We Publish—and Prove
12 principles backed by open code, independent validation, and measurable outcomes.
Open source, peer-reviewed
Zero config, instant value
Data sovereignty by design
Aligned pricing, no surprises
> See all 12 principles
Edge-Native, AI-Ready, 100% Open
76k+ stars. Full ML, AI, and automation—GPLv3+, not premium add-ons.
76,000+ GitHub stars
GPLv3+ licensed forever
ML on every metric, included
Zero vendor lock-in
> Explore our open source
Build Real-Time Observability for the World
Remote-first team shipping per-second monitoring with ML on every metric.
Remote-first, fully distributed
Open source (76k+ stars)
Challenging technical problems
Your code on millions of systems
> See open roles
Meet the Team Behind Netdata
Conferences, meetups, and tradeshows where you can see Netdata in action and talk to the engineers who build it.
Live demos and deep dives
Book 1-on-1 meetings
Talks and panel sessions
Event recaps and photos
> See all events
Talk to a Netdata Human in <24 Hours
Sales, partnerships, press, or professional services—real engineers, fast answers.
Discuss your observability needs
Pricing and volume discounts
Partnership opportunities
Media and press inquiries
> Book a conversation
Your Data. Your Rules.
On-prem data, cloud control plane, transparent terms.
Trust & Scale
76,000+ GitHub Stars

One of the most popular open-source monitoring projects

SOC 2 Type 2 Certified

Enterprise-grade security and compliance

Data Sovereignty

Your metrics stay on your infrastructure

Validated
University of Amsterdam

"Most energy-efficient monitoring solution" — ICSOC 2023, peer-reviewed

ADASTEC (Autonomous Driving)

"Doesn't miss alerts—mission-critical trust for safety software"

Community Stats
615+ Contributors

Global community improving monitoring for everyone

1.5M+ Downloads/Day

Trusted by teams worldwide

GPLv3+ Licensed

Free forever, fully open source agent

Why Join?
Remote-First

Work from anywhere, async-friendly culture

Impact at Scale

Your work helps millions of systems

$ guides / php-fpm / php-fpm-open-basedir-disable-functions ▌

Operations Guides

PHP-FPM open_basedir and disable_functions: sandboxing worker pools

PHP-FPM runs each worker as an OS user. Whatever that user can read or execute, the PHP code inside the worker can read or execute. On a host running more than one application, or on any host where a compromise is plausible, that is a wide blast radius. A single uploaded webshell in one pool can read /etc/passwd, walk into adjacent application directories for credentials, or shell out to enumerate the network.

Two PHP directives narrow that radius: open_basedir restricts filesystem access to a configured tree, and disable_functions removes dangerous internal functions like exec(), system(), and passthru() from the runtime. Both are per-pool, both are cheap, and both are routinely applied in a form that userland code can quietly override. This article covers what each control actually enforces, why php_admin_value in the pool .conf is the only form that holds under pressure, the version-specific behaviors that change the math, and the documented bypasses that mean you should treat these as defense-in-depth, not a security boundary.

What each directive protects against

DirectiveWhat it blocksWhat it does not block
open_basedirFile reads and writes outside the configured directory tree (/etc/passwd, other apps’ code, credentials in adjacent paths)Outbound network connections, process spawning, writes inside the allowed tree, data already loaded into memory
disable_functionsInvocation of named internal functions: exec(), system(), passthru(), shell_exec(), proc_open(), popen()Functions you forgot to list, extension-level C calls (e.g., fork() from a loaded extension), indirect execution paths

The default state is permissive. open_basedir defaults to an empty value, meaning no restriction. disable_functions defaults to an empty string, meaning every internal function is callable. A pool that has never been hardened has both unset, and a compromised script in that pool runs with the full reach of the worker user.

How per-pool enforcement works

The mechanism that makes these directives stick is php_admin_value in the pool configuration file (typically under /etc/php/*/fpm/pool.d/). Settings applied through php_admin_value and php_admin_flag cannot be overridden by ini_set() at runtime. This is the only FPM-level mechanism that produces an immutable restriction from the perspective of application code.

The changeability of the two directives differs, and that difference is the source of most misconfiguration:

  • open_basedir is PHP_INI_ALL. Without php_admin_value, it can be set in php.ini, in a .user.ini, and widened or moved at runtime via ini_set(). A restriction placed only in php.ini gives the application a way out. Setting php_admin_value[open_basedir] in the pool .conf closes that exit.
  • disable_functions is PHP_INI_SYSTEM. It cannot be set via .user.ini or ini_set() under any circumstance. It is evaluated at system startup. You can place it in php.ini globally, or scope it per pool using php_admin_value[disable_functions].

Example pool configuration:

[app-a]
user = appa
group = appa
listen = /run/php/app-a.sock

; Restrict filesystem access to this app's tree plus the session store
php_admin_value[open_basedir] = /var/www/app-a:/var/lib/php/sessions-app-a:/tmp

; Remove command-execution primitives this app does not need
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen

The exact disable list must match each application’s real needs. A CMS that shells out to imagick or ffmpeg will break if you copy a generic hardening template verbatim.

flowchart TD
  A[PHP request in worker] --> B[open_basedir gate]
  B -->|path outside tree| C[File access denied]
  B -->|path inside tree| D[File access allowed]
  A --> E[disable_functions gate]
  E -->|function disabled| F[Call fails]
  E -->|function enabled| G[Function executes]
  H[Direct FastCGI socket access] -.->|PHP_VALUE overrides open_basedir| B
  I[Loaded C extension] -.->|Direct syscall, bypasses PHP layer| G

disable_functions appends, it does not replace

The PHP-FPM configuration documentation states that defining disable_functions in the pool config does not overwrite a value already set in php.ini. It appends. If php.ini carries disable_functions = exec,system and the pool adds php_admin_value[disable_functions] = passthru, the effective list is exec,system,passthru.

This means the pool layer can only widen the global restriction, never narrow it. If you need a pool with a shorter list than php.ini, remove the directive from php.ini and set it per pool.

Version-specific behaviors that change the math

A few version transitions change how these controls behave or what an attacker can do with them.

PHP 8.0: disabled functions have no definition. Prior to PHP 8.0, disabling a function blocked invocation but the function definition remained. As of PHP 8.0, the function definition is removed entirely. Userland code can redefine a disabled function name (for example, define its own exec()), but the original internal implementation is gone. function_exists('exec') returns false when exec is disabled on PHP 8.0+. This is mostly a curiosity for attackers, but it matters if your code or a dependency gates behavior on function_exists.

PHP 8.3: open_basedir rejects .. at runtime. As of PHP 8.3, open_basedir no longer accepts paths containing the parent-directory reference (..) when set at runtime via ini_set(). This closes a classic bypass where a script would chdir() and then expand the restriction using relative segments. The manual scopes this restriction to runtime ini_set(); startup and FPM pool-admin values are outside that runtime path.

open_basedir is not deprecated in PHP 8.5. The PHP 8.5 deprecation RFC does not list open_basedir or disable_functions. An earlier internals discussion proposed deprecating open_basedir as a security feature, but that proposal was not accepted. Both directives remain supported.

The cost of open_basedir: realpath cache

Setting open_basedir disables PHP’s realpath cache. Every filesystem path resolution goes through a real stat() call instead of a cached lookup. On filesystem-heavy applications (frameworks with deep autoload trees, many include and require calls), this adds measurable overhead. The protection is real, but it is not free. Benchmark before and after if request latency is tight.

The documented bypasses

Neither directive is a complete security boundary. The PHP manual itself states that open_basedir is an extra safety net that is “in no way comprehensive” and should not be relied upon where security is required. The internals team has historically treated open_basedir bypass reports as non-security issues. Plan accordingly.

FastCGI parameter injection. If an attacker can speak directly to the PHP-FPM socket (a reachable TCP port, a writable Unix socket, or an SSRF that can hit FastCGI), they can send a PHP_VALUE FastCGI environment variable that sets open_basedir at request time, overriding the pool-level restriction. disable_functions cannot be overridden this way because it is INI_SYSTEM. The practical defense is to keep the FPM socket unreachable from untrusted networks and from the application itself.

Symlinks. PHP resolves symlinks when checking open_basedir. A symlink whose target resolves outside the allowed tree is denied. The historical risk is that if the application user can create symlinks inside the allowed tree, edge cases in path resolution have occasionally allowed escapes. Keep the application’s writable directories out of the code path, and do not grant the worker user write access to directories where PHP code is executed.

Extension-level execution. disable_functions operates at the PHP function-call layer. It does not prevent a loaded PHP extension from calling C-level fork(), execve(), or socket syscalls directly. If you load extensions like pcntl, disabling pcntl_fork() blocks the PHP function but not a malicious extension calling fork() in C. The extension itself must be removed (for example, phpdismod pcntl) to close that surface.

Functions you forgot to list. disable_functions is an explicit denylist. The usual targets (exec, system, passthru, shell_exec, proc_open, popen) cover direct command execution, but PHP has a long tail of indirect paths: mail() invoking a sendmail binary, putenv() poisoning LD_PRELOAD in combination with mail() or error_log(), and error_log() with a type that shells out. The list must match the application’s actual surface, not a copied template.

Auditing the current configuration

Two checks cover the configuration view and the runtime view.

# Check effective values after merging php.ini and pool configs
php-fpm8.x -tt 2>&1 | grep -E "open_basedir|disable_functions"

# Or via a PHP script served through the pool
# <?php echo 'open_basedir: ' . ini_get('open_basedir') . "\n";
#       echo 'disable_functions: ' . ini_get('disable_functions') . "\n"; ?>

The php-fpm -tt form parses the full configuration (php.ini plus pool configs) and reports what would be applied at startup, which is the authoritative view. ini_get() from a script served through the pool reports the per-pool effective value after php_admin_value has been applied.

To audit the pool files directly:

grep -E "open_basedir|disable_functions" /etc/php/*/fpm/pool.d/*.conf

Confirm that each restriction appears under php_admin_value, not php_value. The php_value form can be overridden by ini_set() and defeats the purpose.

Per-pool isolation completes the picture

open_basedir and disable_functions restrict what PHP code can do, but they do not isolate pools from each other at the OS level. Run each pool as a distinct least-privilege user, and give each pool its own socket and its own session directory inside its own open_basedir tree. A pool running as root, or multiple applications sharing a single pool user, gives a compromise in one pool a path to the others regardless of how tight the PHP directives are.

The session storage point is easy to miss. PHP’s default session.save_path is /tmp. If your open_basedir does not include /tmp, session reads and writes fail. Either include /tmp (less isolated) or set session.save_path to a directory inside the allowed tree, one per pool.

Applying changes safely

open_basedir changes take effect for newly spawned workers after a reload. disable_functions changes require the worker function table to be rebuilt.

The PHP-FPM graceful reload (SIGUSR2) re-executes the master and forks fresh workers, so the worker startup path applies disable_functions again. After a reload, verify the effective value from a script served by the affected pool; if it did not change, inspect the installed unit before repeating the change.

Either operation causes a brief window with no workers serving requests, and a full restart clears opcache. Apply during a maintenance window, or use rolling restarts across multiple FPM instances behind a load balancer. See PHP-FPM graceful reload: the brief no-worker window on SIGUSR2 for the mechanics of that gap.

Signals to watch

SignalWhy it mattersWarning sign
Application errors mentioning open_basedir restriction in effectA path the application needs is outside the allowed treeNew errors after tightening open_basedir, or after a deploy that added a new dependency path
Call to undefined function errorsA function the application legitimately needs was removed from the runtimeErrors appearing only after adding to disable_functions
Session read or write failuressession.save_path is outside open_basedirLogin failures or session losses isolated to one pool
Worker crashes after a hardening changeA disabled function or restricted path hit an extension’s initialization codeNew SIGSEGV entries in the FPM error log immediately after the config change

How Netdata helps

Netdata’s per-second metrics let you correlate a hardening change with its operational fallout without guessing at cause and effect.

  • PHP-FPM worker counts, active/idle ratio, and listen queue depth show whether a new open_basedir restriction and its realpath cache cost are pushing the pool toward saturation.
  • Worker exit rate and the FPM error log stream surface crashes triggered by a disabled function hitting extension initialization.
  • Per-process memory and CPU let you measure the realpath cache overhead of open_basedir on a filesystem-heavy application before and after the change.
  • Status page signals (accepted connections, slow requests, max children reached) confirm whether request latency or capacity shifted after the change.
  • For multi-pool hosts, per-pool breakdowns let you compare an unrestricted pool against a hardened one under the same load.