Driver FixRecommendedSound, Wi-Fi or graphics acting up? Check drivers firstFind missing or outdated drivers fast.Check DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsClean PCRecommendedOne scan can reveal what keeps slowing WindowsLook for cleanup and repair opportunities.Run Scan×
Skip to content
Chromium

How to Fix Puppeteer Chromium Startup Failures with Phusion Passenger

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When Puppeteer fails to start Chromium under Phusion Passenger, Passenger is usually only exposing an environment problem: the Node process may use the wrong entry file, the browser may not exist in the deployed cache, Linux libraries may be missing, Chrome’s sandbox may be unavailable, or Passenger’s Unix user may not be able to read or execute the required files. Fix the failure by identifying the stage at which it occurs, then test that layer using the same account and environment Passenger uses.

Start with the exact failure, not the word “Passenger”

Capture the complete Passenger/application log and Chromium’s stderr from the same launch attempt. The remedy depends on the message:

Observed stage Likely class of problem First check
Passenger application never starts Wrong startup file, app type, syntax or dependency error Passenger app_type, startup_file and Node logs
Node starts, but Puppeteer says “Could not find Chrome” Browser download/cache was not deployed or the path is wrong Installed browser and executablePath
Executable is found, then exits immediately Missing shared libraries or incompatible system image ldd output for the browser binary
Stderr contains No usable sandbox! Kernel, user-namespace or security-policy restriction Host sandbox and AppArmor configuration
Works in a shell but not through Passenger Different Unix user, environment, permissions or writable paths Repeat tests as Passenger’s effective app user

Keep the Puppeteer version, browser revision, Linux distribution or container image, Passenger engine and version, runtime user, and launch options with the error report. There is no single Passenger-specific cause or universal configuration.

1. Confirm Passenger launches the intended Node application

Passenger’s Node.js convention is app.js. Applications generated by Express commonly start from bin/www. If your file has another name, configure the startup file explicitly and set the application type to Node.js.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall

What to verify

  • The configured application root is the directory that contains package.json and your startup file.
  • app_type is Node.js, not a different Passenger application type.
  • startup_file points to a file that exists relative to the application root.
  • The startup file actually reaches the code that calls puppeteer.launch().

Passenger’s configuration reference documents these settings and defaults: Passenger Standalone configuration reference. A wrong entry point can look like a Chromium failure because the browser-launching code never runs.

2. Verify that a compatible browser exists after deployment

Puppeteer normally downloads a compatible Chrome for Testing browser during package installation. A deployment can lose that browser when package-manager install scripts are disabled, dependencies are installed in a build environment whose cache is not copied to production, or the runtime account cannot read the cache.

Check the installation and cache

  1. Install dependencies using the same lockfile and deployment procedure used in production.
  2. Inspect the Puppeteer cache location and confirm that a Chrome for Testing executable is present.
  3. Check that the Passenger runtime user can traverse every parent directory and read and execute the browser file.
  4. Restart the Passenger application after correcting the deployment; do not rely on a shell process that has a different environment.

If Chrome is managed outside Puppeteer, pass its absolute path:

const browser = await puppeteer.launch({
  executablePath: '/absolute/path/to/chrome'
});

The executablePath option is supported, but Puppeteer states that operation is guaranteed only with its bundled browser. An externally installed Chrome or Chromium must therefore be kept compatible with your Puppeteer release. See the Puppeteer installation guide and LaunchOptions reference.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Make the browser path observable

Log the resolved path and the effective user at application startup, without printing credentials:

import os from 'node:os';
import puppeteer from 'puppeteer';

console.log({ user: os.userInfo().username, cwd: process.cwd() });
console.log('Puppeteer executable:', puppeteer.executablePath());

If you use puppeteer-core, it does not manage a browser download; provide an explicit executable path and verify it during deployment.

3. Check shared libraries on the actual Passenger host

A browser file can exist and still fail before startup because the dynamic linker cannot load a required library. Run Puppeteer’s documented diagnostic against the exact Chrome executable:

ldd /absolute/path/to/chrome | grep not

Any output indicates unresolved shared libraries. Install the corresponding runtime packages for the distribution and browser revision used by the deployed image, then rerun ldd until no libraries are reported missing. Package names differ between Debian/Ubuntu, CentOS/RHEL and other distributions, and Chrome requirements change; do not copy a package list intended for a different base image. Puppeteer’s troubleshooting guide links current dependency guidance: Puppeteer troubleshooting.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Container and release checks

  • Run the diagnostic inside the production container or VM, not on your laptop.
  • Ensure the final runtime image contains libraries installed only in a build stage.
  • Check architecture (for example, x86_64 versus ARM) and that the browser binary matches it.
  • After changing packages, restart Passenger so the new process sees the updated filesystem.

4. Treat “No usable sandbox!” as a separate security branch

Chrome can exit with No usable sandbox! when the host cannot provide a usable sandbox. Puppeteer documents an AppArmor interaction on Ubuntu 23.10 and later that can affect Chrome for Testing user namespaces. Inspect kernel/user-namespace support and the host’s AppArmor policy, then follow the guidance for your exact Ubuntu and Chrome revisions.

The Puppeteer project explicitly warns: “Running without a sandbox is strongly discouraged.” Do not make --no-sandbox your routine production fix. If the page content is absolutely trusted and your security owner accepts the reduced isolation, the temporary diagnostic is:

const browser = await puppeteer.launch({
  args: ['--no-sandbox']
});

This removes a browser security boundary; it does not repair the host sandbox. Document the exception, restrict the content and process permissions, and pursue a functioning sandbox or an approved isolation boundary instead. The relevant host-specific discussion is in the Puppeteer troubleshooting guide.

5. Reproduce as Passenger’s Unix user

Passenger’s user sandboxing means a successful administrator shell test is not conclusive. Passenger documents that the application user needs read access to application files and write access to logs. Chromium also needs access to its executable, cache, temporary directory and, when configured, a user-data/profile directory.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Permission checklist

  • Identify the effective Unix user and group configured for the Passenger application.
  • As that account, test that the application root and browser cache are traversable and readable.
  • Verify the browser file has execute permission and that its interpreter and libraries are accessible.
  • Use a writable, private temporary/profile directory; avoid a directory created only for an administrator.
  • Confirm Passenger’s log directory is writable so the real browser stderr is not lost.

Passenger’s deployment and user-sandboxing documentation provides the surrounding permission model: Deploying a Node.js app and Sandboxing apps with Unix user accounts.

6. Use a minimal launch test before restoring application complexity

Remove application-specific options temporarily and prove that Passenger can start one browser and close it:

import puppeteer from 'puppeteer';

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
  console.log(await page.title());
  await browser.close();
})().catch(error => {
  console.error(error);
  process.exitCode = 1;
});

Run the same script through the deployed release and Passenger, changing one variable at a time. Once it works, reintroduce custom arguments, proxy settings, profiles and navigation code individually. This separates a browser startup defect from a later page-load or application exception.

Common errors and precise fixes

“Could not find Chrome” or an executable-not-found error

Cause: the Puppeteer browser download did not run, the cache was not included in the release, or the configured path is wrong. Fix the install/deploy process, expose the cache to the Passenger user, or set and validate an absolute executablePath. Check whether your package manager blocked install scripts.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

ldd reports “not found”

Cause: missing runtime libraries in the production image. Install distribution-appropriate packages, verify architecture, and repeat the command against the exact binary Passenger launches.

No usable sandbox!

Cause: unavailable user namespaces or a security policy such as the documented Ubuntu 23.10+ AppArmor interaction. Repair host policy and kernel support. Use --no-sandbox only for absolutely trusted content with an explicit security decision.

Works over SSH, fails in Passenger

Cause: different user, PATH, home directory, cache, current directory, permissions or temporary paths. Log non-secret environment details, then repeat the checks as the Passenger account.

Passenger reports an application startup exception

Cause: wrong startup_file, missing production dependency, syntax error or code that throws before launch. Verify the entry point and run the minimal script in the deployed release before investigating Chromium.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Reliability, performance and cost considerations

  • Keep browser installation deterministic with a lockfile and a deployment step that preserves the intended Puppeteer cache.
  • Do not share one writable profile between concurrent browser processes; create isolated temporary or user-data directories.
  • Close pages and browsers on every success and failure path to prevent Passenger workers accumulating Chrome processes.
  • Record browser revision, Puppeteer version and host image in deployment metadata so upgrades can be correlated with failures.
  • Changing hosts may alter libraries, namespaces or AppArmor behavior, but no provider change alone guarantees a fix.

Or skip the browser setup:

For a service that returns a screenshot without you maintaining Chromium under Passenger, ScreenshotNeo provides a website screenshot API and MCP server. It accepts consent banners as a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets before capture; failed loads, bot checks/CAPTCHAs, blank pages, timeouts and cache hits are not billed, with the result identified by X-Page-Verdict and X-Billed headers. Its MCP tools—take_screenshot, get_page_info and capture_pdf—let Claude, Cursor and other MCP clients request captures.

One GET request is enough:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the complete options and authentication details in the ScreenshotNeo documentation. You can also use its 63 options for full-page or CSS-element captures, device and viewport settings, dark mode, retina scale, PDF output, custom CSS/JavaScript, waits, blocking rules, headers, cookies, geolocation, signed links, asynchronous webhooks and bulk capture.

The Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 screenshots; every feature is available on every plan. Create a free ScreenshotNeo account.

FAQ

Does Passenger itself download Chromium?

No. Passenger launches your Node application; Puppeteer or your deployment process must provide the browser and its dependencies.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Is an externally installed Chrome always supported?

Puppeteer supports selecting an executable path, but guarantees operation only with its bundled browser. Validate external browser compatibility for your exact versions.

Best Value

Should I add --no-sandbox to every Passenger deployment?

No. The Puppeteer documentation strongly discourages running without a sandbox. Investigate host namespaces and security policy first.

Why does a browser test pass as root but fail in production?

Passenger normally runs the app as another Unix user with different file, cache, temporary-directory and security-policy access. Test as that effective user.

Frequently Asked Questions

Can I fix every startup failure by reinstalling Puppeteer?

No. Reinstallation helps only when the browser download or dependency installation was the failing layer; library, sandbox, entry-point and permission errors require their corresponding fixes.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

What information should I include when escalating the issue?

Provide the complete browser stderr, Passenger log, Puppeteer and browser versions, Linux image, runtime user, configured startup file, and launch arguments, while removing secrets.

The Bottom Line

Diagnose the failure stage first: entry point, browser availability, shared libraries, sandbox, or Passenger-user permissions. Correct that layer in the deployed environment, then retest with a minimal launch before restoring application options.

Quick Recap

Bestseller No. 1
The Chromium Connection: A Lesson in Nutrition
The Chromium Connection: A Lesson in Nutrition
Used Book in Good Condition
$215.30
Bestseller No. 3
Bestseller No. 4
Bestseller No. 5
The Chromium Diet, Supplement and Exercise Strategy
The Chromium Diet, Supplement and Exercise Strategy
Used Book in Good Condition
$17.95

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Read next

Recommended PC Tool
Recommended PC Tool
Windows Errors? Fix Them Before They SpreadFree repair scan
Crashes, No Sound, or Screen Glitches?Free driver scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.