{"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":"error","filePath":"packages/vite/src/node/http.ts","lineNumber":266,"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":248,"sourceCodeEnd":284,"githubUrl":"https://github.com/vitejs/vite/blob/89620f09afcfef6b35e7bb8660132ab5b4d0cd3b/packages/vite/src/node/http.ts#L248-L284","documentation":"Port resolution loops from `startPort` up to `MAX_PORT` (65535) and, if every port in that range is unavailable, gives up with this error. It is the non-strict counterpart of error 44: when `strictPort` is false Vite tries to walk upward, and only throws when the entire range is exhausted.","triggerScenarios":"Starting a server with `strictPort: false` on a machine where a large contiguous block of high ports is occupied — e.g. many dev servers, heavy container usage, ephemeral port exhaustion, or a high `server.port` start near 65535.","commonSituations":"Ephemeral-port exhaustion on Linux (net.ipv4.ip_local_port_range consuming candidate ports); running dozens of Vite instances in CI; a misconfigured `server.port` like 65530 leaving almost no room to increment; firewall/proxy binding wide ranges.","solutions":["Free up ports: stop unneeded processes/containers and raise the count of free high ports.","Set an explicit lower `server.port` so the walk has a large range to scan.","On Linux, shrink `net.ipv4.ip_local_port_range` so the kernel doesn't grab Vite's candidate ports.","Use `strictPort: true` with a known-free port to fail fast instead of scanning 60k ports."],"exampleFix":"// before\nexport default defineConfig({ server: { port: 65000 } }) // almost no room to walk\n\n// after\nexport default defineConfig({ server: { port: 5173, strictPort: true } })","handlingStrategy":"validation","validationCode":"import net from 'node:net'\nconst MAX_PORT = 65535\nasync function findFree(startPort: number, host?: string): Promise<number | null> {\n  for (let p = startPort; p <= MAX_PORT; p++) {\n    const ok = await new Promise<boolean>((res) => {\n      const s = net.createServer().unref()\n      s.once('error', () => res(false)).listen(p, host, () => s.close(() => res(true)))\n    })\n    if (ok) return p\n  }\n  return null\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep startPort low (e.g. 5173) to maximize the scan range.","Reduce ephemeral-port pressure (containers, sockets) before starting many servers.","On Linux, tune net.ipv4.ip_local_port_range away from your dev ports."],"tags":["server","network","port","resource-exhaustion"],"analyzedSha":"89620f09afcfef6b35e7bb8660132ab5b4d0cd3b","analyzedAt":"2026-08-03T19:28:02.920Z","schemaVersion":2}