{"id":4367,"date":"2026-07-17T20:38:37","date_gmt":"2026-07-17T20:38:37","guid":{"rendered":"https:\/\/ownwebservers.com\/kb\/?p=4367"},"modified":"2026-07-17T20:38:37","modified_gmt":"2026-07-17T20:38:37","slug":"install-nodejs-applications-plesk","status":"publish","type":"post","link":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/","title":{"rendered":"How to Install Node.js Applications in Plesk: A Complete Setup Guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Node.js apps are just part of the furniture on Plesk boxes these days \u2014 sitting right next to the PHP sites and static pages we&#8217;ve always run. The good part is Plesk actually treats Node.js like a first-class citizen rather than bolting it on: the Node.js extension, which has shipped since Onyx and gotten steadily better through the Obsidian line, gives you a real interpreter version manager, Passenger integration, and a UI that covers most of what used to mean hand-writing systemd units and reverse proxy blocks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">None of that means it runs itself, though. There&#8217;s a strict order you need to follow \u2014 domain setup, then document root, then package.json checks, then dependencies, then picking the right startup file \u2014 and skipping a step is exactly how you end up staring at a 503 with zero clues in the browser. What follows is the process I actually use on production servers, plus the mistakes that generate the most support tickets in my experience.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What You Need Before You Start<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Server and License Requirements<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You want Plesk Obsidian for this (Onyx still limps along, but it&#8217;s EOL \u2014 don&#8217;t put new work on it). You&#8217;ll also need the Node.js extension installed, which you can check under <strong>Tools &amp; Settings &gt; Updates and Upgrades &gt; Add\/Remove Components<\/strong>, or just open a domain and see if &#8220;Node.js&#8221; shows up in the sidebar. Most license tiers include it, but a few of the stripped-down hosting-only SKUs leave it out, so verify this before you tell a client it&#8217;ll just work.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Enabling the Node.js Extension in Plesk<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If it&#8217;s missing, head to <strong>Extensions<\/strong>, search &#8220;Node.js,&#8221; and install it. That extension is doing all the heavy lifting here \u2014 version manager, Passenger hooks, per-app config panel. Resist the urge to compile Node from source or run your own nvm setup on the shell; Plesk expects to own the interpreter binary paths, and going around it just creates conflicts you&#8217;ll be debugging later.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Preparing Your Application Files<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before you even open the Plesk UI, get your app itself into a deployable state:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A valid <code>package.json<\/code> with a proper <code>start<\/code> script, or at minimum a clearly named entry file like <code>app.js<\/code> or <code>server.js<\/code>.<\/li>\n\n\n\n<li>A <code>.gitignore<\/code> or upload package that leaves out <code>node_modules<\/code> \u2014 Plesk runs its own <code>npm install<\/code> anyway, and shipping a local <code>node_modules<\/code> folder just bloats the upload and can conflict with platform-specific native builds.<\/li>\n\n\n\n<li>Config values like API keys, DB connection strings, and ports pulled from <code>process.env<\/code> instead of hardcoded \u2014 you&#8217;ll wire these in through Plesk in a minute.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Understanding Plesk&#8217;s Node.js Architecture<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">The Node.js Extension and Version Manager<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Plesk&#8217;s version manager keeps multiple Node runtimes installed side by side \u2014 16.x, 18.x, 20.x, whatever your apps need \u2014 without touching the system&#8217;s own Node binary or disturbing anything else on the box. Each app picks its version independently, which is exactly what you want on a shared server where one client&#8217;s legacy app sits next to something built against a current LTS.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How Passenger Integrates with Node.js Apps<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is where most confusion comes from. Plesk doesn&#8217;t launch your app as a bare process bound to some random port managed by PM2 or forever \u2014 it hands the whole thing to Phusion Passenger. Passenger owns the process lifecycle: starting it, killing it, restarting it after a crash, recycling idle workers. It talks to your app over a local socket and does the supervision work you&#8217;d otherwise be configuring by hand with systemd or PM2.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Nginx and Apache&#8217;s Role in Request Handling<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The web server layer \u2014 Nginx, sometimes with Apache sitting in front depending on how the server&#8217;s configured \u2014 takes the incoming connection and proxies it into Passenger, which then hands it to your app. That&#8217;s why things like WebSocket support or upload size limits get configured through Plesk&#8217;s Nginx directive panel rather than inside your app&#8217;s own routing \u2014 there&#8217;s more happening at the web server layer here than you&#8217;d get from a plain Node dev server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Creating a Domain or Subdomain for Your App<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Setting Document Root vs. Application Root<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">More deployments go sideways here than anywhere else. The <strong>document root<\/strong> is where the web server pulls static assets from \u2014 usually a <code>public<\/code>, <code>dist<\/code>, or <code>build<\/code> folder if you&#8217;ve got a compiled React front end sitting in front of an Express backend, for example. The <strong>application root<\/strong> is a different thing entirely \u2014 it&#8217;s the base folder holding <code>package.json<\/code>, and it&#8217;s where Passenger actually starts your app. Mix these two up and you&#8217;ll either be serving raw source code to the world or watching every static asset 404.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Choosing Between a Domain, Subdomain, or Subdirectory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A standalone domain or subdomain is the cleanest setup for a Node app \u2014 you get a dedicated document root, its own SSL cert, and its own Node.js config panel. You can run Node under a subdirectory of an existing PHP domain, but it adds real friction since you&#8217;re now managing two stacks under one vhost. Unless you&#8217;re spinning up a quick proof of concept, just give the app its own subdomain and save yourself the headache.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Uploading and Configuring the Application<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Uploading Files via File Manager, Git, or FTP<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You&#8217;ve got three realistic options: File Manager for a quick drag-and-drop, FTP for bulk transfers, or \u2014 what I&#8217;d recommend for anything that&#8217;s going to keep getting updated \u2014 the Git extension. With Git, you push to a remote, Plesk pulls the changes, runs <code>npm install<\/code>, and restarts the app through deployment actions. It&#8217;s essentially free CI\/CD without bringing in a separate pipeline tool.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verifying package.json and Start Script<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Open the Node.js tab on the domain and confirm Plesk actually picked up <code>package.json<\/code> correctly. If your start script does something out of the ordinary \u2014 a build step before launch, say, rather than a plain <code>node server.js<\/code> \u2014 make sure that&#8217;s properly defined in <code>scripts.start<\/code>. Plesk&#8217;s &#8220;Run Script&#8221; dropdown reads straight from that field, so if it&#8217;s wrong there, it&#8217;s wrong everywhere.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Selecting the Node.js Version per Application<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Same panel \u2014 pick your interpreter version from the dropdown. This setting is per-app, not server-wide, so a new app can run Node 20 while a legacy one sits on Node 16, both on the same box, with zero interference between them.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Installing Dependencies and Starting the App<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Running npm install Through Plesk<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the &#8220;NPM Install&#8221; button in the panel instead of SSHing in and doing it yourself. Plesk logs the full output right there in the UI, and it runs the install in the same environment Passenger will actually use to serve the app \u2014 which matters more than it sounds like. When an install fails, that log is usually the quickest way to spot a missing native build dependency or a bad private registry credential.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Setting the Application Startup File<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Double-check the &#8220;Application Startup File&#8221; field points at the right entry point \u2014 <code>app.js<\/code>, <code>index.js<\/code>, <code>server.js<\/code>, whatever it is for your app. Set <strong>Application Mode<\/strong> to <code>production<\/code> \u2014 this isn&#8217;t just a label, it changes real behavior in Express and most other frameworks: error verbosity, caching, how performance-sensitive middleware behaves. Put your environment variables \u2014 NODE_ENV, DB connection strings, API keys \u2014 into Plesk&#8217;s &#8220;Custom Environment Variables&#8221; section, not into a <code>.env<\/code> file that&#8217;s sitting in your Git repo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Switching Application<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Once everything&#8217;s set, hit &#8220;Restart App.&#8221; Plesk restarts just the Passenger process without taking down the rest of the domain&#8217;s web service. Going forward, any code change needs a restart triggered one of three ways \u2014 this button, a Git deployment hook, or the API \u2014 because Passenger deliberately won&#8217;t pick up file changes on its own in production mode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Best Practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Run Application Mode as <code>production<\/code> on anything live \u2014 never <code>development<\/code>. The gap in performance and security isn&#8217;t subtle.<\/li>\n\n\n\n<li>Keep secrets in Plesk&#8217;s environment variable panel. Never hardcode them, and never commit them to Git.<\/li>\n\n\n\n<li>Use the Git extension with a post-deploy hook (<code>npm install &amp;&amp; restart<\/code>) rather than manual FTP uploads for anything actively being developed.<\/li>\n\n\n\n<li>Keep document root and application root explicitly separate \u2014 don&#8217;t trust Plesk to guess right, because it won&#8217;t always.<\/li>\n\n\n\n<li>Pin the Node.js version per app instead of trusting &#8220;latest&#8221; \u2014 otherwise a server-wide update can break something you weren&#8217;t even thinking about.<\/li>\n\n\n\n<li>Handle WebSocket support and upload limits through &#8220;Additional nginx directives&#8221; \u2014 don&#8217;t hand-edit the vhost config, since Plesk will happily overwrite it on the next update.<\/li>\n\n\n\n<li>Check logs periodically even when nothing looks broken \u2014 memory leaks and slow degradation show up in the Passenger logs long before you get an actual outage.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Almost every Node.js problem I&#8217;ve seen on Plesk boils down to one of these:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Symptom<\/th><th>Likely Cause<\/th><th>Fix<\/th><\/tr><tr><td>502\/503 error on app URL<\/td><td>App crashed or never started<\/td><td>Check Passenger log in Plesk&#8217;s log viewer or <code>\/var\/www\/vhosts\/system\/&lt;domain&gt;\/logs<\/code>; verify startup file path<\/td><\/tr><tr><td>Static assets 404<\/td><td>Document root pointed at app root instead of build folder<\/td><td>Update document root to <code>public<\/code>\/<code>dist<\/code> directory in domain hosting settings<\/td><\/tr><tr><td>npm install fails<\/td><td>Missing native build tools or wrong Node version<\/td><td>Switch Node.js version in extension panel; check install log for missing headers\/deps<\/td><\/tr><tr><td>Environment variables not applied<\/td><td>Values set in local <code>.env<\/code> but not in Plesk panel<\/td><td>Add variables via &#8220;Custom Environment Variables&#8221; and restart app<\/td><\/tr><tr><td>Changes not reflecting after deploy<\/td><td>Passenger cached old process<\/td><td>Manually click &#8220;Restart App,&#8221; or trigger restart via Git deployment action<\/td><\/tr><tr><td>WebSocket connections dropping<\/td><td>Missing proxy headers\/timeouts in Nginx<\/td><td>Add required directives via &#8220;Additional nginx directives,&#8221; not raw config edits<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Deploying Node.js under Plesk isn&#8217;t a fundamentally different job than deploying it anywhere else \u2014 you&#8217;re still dealing with npm, a start script, and a supervised process underneath it all. What&#8217;s different is where the supervision and routing actually happen: Passenger owns your app&#8217;s lifecycle, and the Node.js extension gives you a UI over the version manager, environment config, and restart hooks instead of a pile of hand-built systemd units. Get the document root and application root split correct, keep secrets out of your codebase, and lean on Git deployment instead of manual uploads for anything ongoing \u2014 do those three things and Nginx, Passenger, and the version manager will mostly just stay out of your way.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need to install Node.js manually on the server before using Plesk?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No \u2014 the Node.js extension comes with its own version manager, so you install and switch between Node versions per application without ever touching the system-wide Node install. That keeps apps isolated and stops different sites&#8217; Node versions from stepping on each other.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What is the difference between the document root and application root in Plesk Node.js hosting?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The application root is where your <code>package.json<\/code> and source code live \u2014 it&#8217;s the folder Passenger launches the app from. The document root is the public-facing directory, often <code>public<\/code> or <code>build<\/code>, that Nginx\/Apache serves static files out of. Get both set correctly and Passenger finds your app while static assets still get served efficiently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I run multiple Node.js applications with different versions on the same Plesk server?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes \u2014 the built-in version manager lets each domain or subdomain run its own Node version independently. It doesn&#8217;t touch other sites or the server&#8217;s system Node install, which is exactly what you want in a multi-tenant hosting setup.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How does Plesk start and manage my Node.js application?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Passenger acts as the application server \u2014 it runs whatever startup file your <code>package.json<\/code> points to (usually via the <code>start<\/code> script) and takes care of process lifecycle, restarts, and scaling from there. All of that gets configured through the Plesk interface instead of you manually running <code>node<\/code> or <code>pm2<\/code> commands yourself.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How do I set environment variables like NODE_ENV or API keys in Plesk?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s a dedicated environment variables section inside the Node.js app settings panel where you define NODE_ENV, database credentials, API keys, and so on. That keeps sensitive values out of your codebase entirely, rather than baked into a file that could end up committed somewhere it shouldn&#8217;t be.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How can I automatically redeploy my app when I push new code?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Hook up the Git extension to your repo and enable a deployment action that runs <code>npm install<\/code> and restarts the app on every push. If you&#8217;d rather not automate it, the &#8220;Restart App&#8221; button works fine as a manual trigger too, or you can call it via the API as part of your own CI\/CD setup.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related reading<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/ownwebservers.com\/kb\/php-8x-end-of-life-schedules-compatibility\/\">PHP 8.x End-of-Life Schedules &amp; Compatibility: A Sysadmin\u2019s Upgrade Guide<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/ownwebservers.com\/kb\/zero-downtime-website-migration-rsync-dns-ttl\/\">Zero-Downtime Website Migration: A Complete rsync and DNS TTL Playbook<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/ownwebservers.com\/kb\/serverless-vs-traditional-hosting\/\">Serverless Architecture vs. Traditional Hosting: Which Fits Your Workload?<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/ownwebservers.com\/kb\/ransomware-malware-trends-hosting-environments\/\">Ransomware &amp; Malware Trends Targeting Hosting Environments: A Sysadmin\u2019s Defense Guide<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to deploy Node.js apps in Plesk using the Node.js extension, Passenger integration, version manager, and production-ready configuration.<\/p>\n","protected":false},"author":1,"featured_media":4369,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[147],"class_list":["post-4367","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-node-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Install Node.js Applications in Plesk<\/title>\n<meta name=\"description\" content=\"Learn how to deploy Node.js apps in Plesk using the Node.js extension, Passenger integration, version manager, and production-ready configuration.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Install Node.js Applications in Plesk\" \/>\n<meta property=\"og:description\" content=\"A step-by-step technical guide to installing and configuring Node.js applications in Plesk, covering the Node.js extension, Passenger, version management, and production deployment best practices.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/\" \/>\n<meta property=\"og:site_name\" content=\"OWS KB\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/OWN-WEB-SERVERS-107052961577434\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-17T20:38:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/pexels-photo-1181316.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1880\" \/>\n\t<meta property=\"og:image:height\" content=\"1255\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Deploying Node.js apps on Plesk? Here&#039;s the full sysadmin guide: extension setup, Passenger integration, version control, env vars, and CI\/CD hooks.\" \/>\n<meta name=\"twitter:creator\" content=\"@OwnWebservers\" \/>\n<meta name=\"twitter:site\" content=\"@OwnWebservers\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#\\\/schema\\\/person\\\/4a40fe3fe17a08ddd1d7c113668e75f2\"},\"headline\":\"How to Install Node.js Applications in Plesk: A Complete Setup Guide\",\"datePublished\":\"2026-07-17T20:38:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/\"},\"wordCount\":2136,\"publisher\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pexels-photo-1181316.jpeg\",\"keywords\":[\"Node.js\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/\",\"url\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/\",\"name\":\"How to Install Node.js Applications in Plesk\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pexels-photo-1181316.jpeg\",\"datePublished\":\"2026-07-17T20:38:37+00:00\",\"description\":\"Learn how to deploy Node.js apps in Plesk using the Node.js extension, Passenger integration, version manager, and production-ready configuration.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/#primaryimage\",\"url\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pexels-photo-1181316.jpeg\",\"contentUrl\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/pexels-photo-1181316.jpeg\",\"width\":1880,\"height\":1255,\"caption\":\"Photo by Christina Morillo on Pexels\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/install-nodejs-applications-plesk\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Install Node.js Applications in Plesk: A Complete Setup Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#website\",\"url\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/\",\"name\":\"OWS KB\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#organization\",\"name\":\"Own Web Servers\",\"url\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/OWS-Logo-with-punchline-front-scaled.png\",\"contentUrl\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/OWS-Logo-with-punchline-front-scaled.png\",\"width\":2560,\"height\":994,\"caption\":\"Own Web Servers\"},\"image\":{\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/OWN-WEB-SERVERS-107052961577434\",\"https:\\\/\\\/x.com\\\/OwnWebservers\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/ownwebservers.com\\\/kb\\\/#\\\/schema\\\/person\\\/4a40fe3fe17a08ddd1d7c113668e75f2\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ba5db5841d48bd7517bb2583e13983e6d2fa56a4099a0b3c61ad2daefc321303?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ba5db5841d48bd7517bb2583e13983e6d2fa56a4099a0b3c61ad2daefc321303?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ba5db5841d48bd7517bb2583e13983e6d2fa56a4099a0b3c61ad2daefc321303?s=96&d=mm&r=g\",\"caption\":\"admin\"},\"sameAs\":[\"https:\\\/\\\/ownwebservers.com\\\/kb\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Install Node.js Applications in Plesk","description":"Learn how to deploy Node.js apps in Plesk using the Node.js extension, Passenger integration, version manager, and production-ready configuration.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/","og_locale":"en_US","og_type":"article","og_title":"How to Install Node.js Applications in Plesk","og_description":"A step-by-step technical guide to installing and configuring Node.js applications in Plesk, covering the Node.js extension, Passenger, version management, and production deployment best practices.","og_url":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/","og_site_name":"OWS KB","article_publisher":"https:\/\/www.facebook.com\/OWN-WEB-SERVERS-107052961577434","article_published_time":"2026-07-17T20:38:37+00:00","og_image":[{"width":1880,"height":1255,"url":"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/pexels-photo-1181316.jpeg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_description":"Deploying Node.js apps on Plesk? Here's the full sysadmin guide: extension setup, Passenger integration, version control, env vars, and CI\/CD hooks.","twitter_creator":"@OwnWebservers","twitter_site":"@OwnWebservers","twitter_misc":{"Written by":"admin","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/#article","isPartOf":{"@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/"},"author":{"name":"admin","@id":"https:\/\/ownwebservers.com\/kb\/#\/schema\/person\/4a40fe3fe17a08ddd1d7c113668e75f2"},"headline":"How to Install Node.js Applications in Plesk: A Complete Setup Guide","datePublished":"2026-07-17T20:38:37+00:00","mainEntityOfPage":{"@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/"},"wordCount":2136,"publisher":{"@id":"https:\/\/ownwebservers.com\/kb\/#organization"},"image":{"@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/#primaryimage"},"thumbnailUrl":"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/pexels-photo-1181316.jpeg","keywords":["Node.js"],"articleSection":["Tutorials"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/","url":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/","name":"How to Install Node.js Applications in Plesk","isPartOf":{"@id":"https:\/\/ownwebservers.com\/kb\/#website"},"primaryImageOfPage":{"@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/#primaryimage"},"image":{"@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/#primaryimage"},"thumbnailUrl":"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/pexels-photo-1181316.jpeg","datePublished":"2026-07-17T20:38:37+00:00","description":"Learn how to deploy Node.js apps in Plesk using the Node.js extension, Passenger integration, version manager, and production-ready configuration.","breadcrumb":{"@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/#primaryimage","url":"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/pexels-photo-1181316.jpeg","contentUrl":"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/pexels-photo-1181316.jpeg","width":1880,"height":1255,"caption":"Photo by Christina Morillo on Pexels"},{"@type":"BreadcrumbList","@id":"https:\/\/ownwebservers.com\/kb\/install-nodejs-applications-plesk\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/ownwebservers.com\/kb\/"},{"@type":"ListItem","position":2,"name":"How to Install Node.js Applications in Plesk: A Complete Setup Guide"}]},{"@type":"WebSite","@id":"https:\/\/ownwebservers.com\/kb\/#website","url":"https:\/\/ownwebservers.com\/kb\/","name":"OWS KB","description":"","publisher":{"@id":"https:\/\/ownwebservers.com\/kb\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/ownwebservers.com\/kb\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/ownwebservers.com\/kb\/#organization","name":"Own Web Servers","url":"https:\/\/ownwebservers.com\/kb\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/ownwebservers.com\/kb\/#\/schema\/logo\/image\/","url":"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/OWS-Logo-with-punchline-front-scaled.png","contentUrl":"https:\/\/ownwebservers.com\/kb\/wp-content\/uploads\/2026\/07\/OWS-Logo-with-punchline-front-scaled.png","width":2560,"height":994,"caption":"Own Web Servers"},"image":{"@id":"https:\/\/ownwebservers.com\/kb\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/OWN-WEB-SERVERS-107052961577434","https:\/\/x.com\/OwnWebservers"]},{"@type":"Person","@id":"https:\/\/ownwebservers.com\/kb\/#\/schema\/person\/4a40fe3fe17a08ddd1d7c113668e75f2","name":"admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ba5db5841d48bd7517bb2583e13983e6d2fa56a4099a0b3c61ad2daefc321303?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ba5db5841d48bd7517bb2583e13983e6d2fa56a4099a0b3c61ad2daefc321303?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ba5db5841d48bd7517bb2583e13983e6d2fa56a4099a0b3c61ad2daefc321303?s=96&d=mm&r=g","caption":"admin"},"sameAs":["https:\/\/ownwebservers.com\/kb"]}]}},"_links":{"self":[{"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/posts\/4367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/comments?post=4367"}],"version-history":[{"count":2,"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/posts\/4367\/revisions"}],"predecessor-version":[{"id":4370,"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/posts\/4367\/revisions\/4370"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/media\/4369"}],"wp:attachment":[{"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/media?parent=4367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/categories?post=4367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ownwebservers.com\/kb\/wp-json\/wp\/v2\/tags?post=4367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}