{"record":{"id":"83eb40c2ff7e224a","repo":"vitejs/vite","slug":"no-available-ports-found-between-startport-and","errorCode":null,"errorMessage":"No available ports found between ${startPort} and ${MAX_PORT}","messagePattern":"No available ports found between (.+?) and (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"packages/vite/src/node/http.ts","lineNumber":314,"sourceCode":"      }\n      if (result.error.code !== 'EADDRINUSE') {\n        throw result.error\n      }\n      throw new Error(`Port ${port} is already in use`)\n    }\n\n    if (portAvailableOnWildcard) {\n      const result = await tryBindServer(httpServer, port, host)\n      if (result.success) {\n        return port\n      }\n      if (result.error.code !== 'EADDRINUSE') {\n        throw result.error\n      }\n    }\n    logger.info(`Port ${port} is in use, trying another one...`)\n  }\n  throw new Error(\n    `No available ports found between ${startPort} and ${MAX_PORT}`,\n  )\n}\n\nexport function setClientErrorHandler(\n  server: HttpServer,\n  logger: Logger,\n): void {\n  server.on('clientError', (err, socket) => {\n    // https://github.com/nodejs/node/blob/v26.2.0/lib/_http_server.js#L992\n    let msg\n    switch ((err as any).code) {\n      case 'HPE_HEADER_OVERFLOW': {\n        msg = '431 Request Header Fields Too Large'\n        logger.warn(\n          colors.yellow(\n            'Server responded with status code 431. ' +\n              'See https://vite.dev/guide/troubleshooting.html#_431-request-header-fields-too-large.',","sourceCodeStart":296,"sourceCodeEnd":332,"githubUrl":"https://github.com/vitejs/vite/blob/b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab/packages/vite/src/node/http.ts#L296-L332","documentation":"Thrown when Vite exhausts its port scan from `server.port` (startPort) up to MAX_PORT and every candidate is in use or unavailable on a wildcard address. This only happens with strictPort=false, because strict mode bails on the first port instead of scanning. It means Vite could not find any free port in the configured window to bind the dev/preview server.","triggerScenarios":"Loop at http.ts:277 iterates `port` from startPort to MAX_PORT; each port either fails `isPortAvailable` (wildcard 0.0.0.0/:: check) or fails `tryBindServer` with EADDRINUSE. After the loop ends at line 314, the error is thrown. Triggered when a host machine has a long contiguous block of occupied ports (e.g. many dev servers, browser port range exhaustion).","commonSituations":"Running dozens of Vite instances in parallel test grids. Linux ephemeral port range (`net.ipv4.ip_local_port_range`) overlapping 5173–5273. A proxy or VPN client grabbing a port range. Port scanners / security tools holding ranges. Misconfigured `MAX_PORT` window.","solutions":["Reduce concurrent Vite instances, or stagger startup so earlier servers settle before later ones scan.","Pin `server.port` to a known-free high port outside the OS ephemeral range, e.g. `server: { port: 8080 }`.","Set `server.port: 0` to let the OS hand back a free ephemeral port immediately, bypassing the scan.","On Linux, check `sysctl net.ipv4.ip_local_port_range` and raise MAX_PORT or move out of the ephemeral range.","Free wildcard listeners (`ss -ltnp`) that block the availability pre-check on 0.0.0.0/::.","If in CI, allocate isolated network namespaces or randomize `server.port` per job."],"exampleFix":"// before\nexport default defineConfig({\n  server: { port: 5173 }, // all 5173..5173+100 taken\n})\n\n// after\nexport default defineConfig({\n  server: { port: 0 }, // OS picks a free port\n})","handlingStrategy":"validation","validationCode":"import net from 'node:net'\n\nasync function firstFreePort(start: number, max: number): Promise<number | null> {\n  for (let p = start; p <= max; p++) {\n    const free = await new Promise<boolean>((res) => {\n      const t = net.createServer().once('error', () => res(false)).once('listening', () => t.close(() => res(true)))\n      t.listen(p)\n    })\n    if (free) return p\n  }\n  return null\n}\n// Pre-check the window before starting Vite\nconst p = await firstFreePort(5173, 5273)\nif (!p) throw new Error('Port range exhausted before Vite start')","typeGuard":null,"tryCatchPattern":"try {\n  await server.listen()\n} catch (e) {\n  if (e instanceof Error && /No available ports found/.test(e.message)) {\n    // fall back to OS-assigned ephemeral port\n    await server.listen(0)\n  } else throw e\n}","preventionTips":["Limit the number of concurrent Vite servers per host.","Move server.port out of the OS ephemeral range (check net.ipv4.ip_local_port_range on Linux).","Use server.port: 0 in environments where any free port is acceptable."],"tags":["network","server","startup","port-exhaustion"],"backgroundTag":null,"analyzedSha":"b4d66fee14d970f45b8a6f3d7d6aee73ca9b88ab","analyzedAt":"2026-08-11T11:49:19.515Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}