vitejs/vite · error · Error

No available ports found between ${startPort} and ${MAX_PORT

Error message

No available ports found between ${startPort} and ${MAX_PORT}

What it means

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.

Source

Thrown at packages/vite/src/node/http.ts:266

      }
      if (result.error.code !== 'EADDRINUSE') {
        throw result.error
      }
      throw new Error(`Port ${port} is already in use`)
    }

    if (portAvailableOnWildcard) {
      const result = await tryBindServer(httpServer, port, host)
      if (result.success) {
        return port
      }
      if (result.error.code !== 'EADDRINUSE') {
        throw result.error
      }
    }
    logger.info(`Port ${port} is in use, trying another one...`)
  }
  throw new Error(
    `No available ports found between ${startPort} and ${MAX_PORT}`,
  )
}

export function setClientErrorHandler(
  server: HttpServer,
  logger: Logger,
): void {
  server.on('clientError', (err, socket) => {
    // https://github.com/nodejs/node/blob/v26.2.0/lib/_http_server.js#L992
    let msg
    switch ((err as any).code) {
      case 'HPE_HEADER_OVERFLOW': {
        msg = '431 Request Header Fields Too Large'
        logger.warn(
          colors.yellow(
            'Server responded with status code 431. ' +
              'See https://vite.dev/guide/troubleshooting.html#_431-request-header-fields-too-large.',

View on GitHub (pinned to 89620f09af)

Solutions

  1. Free up ports: stop unneeded processes/containers and raise the count of free high ports.
  2. Set an explicit lower `server.port` so the walk has a large range to scan.
  3. On Linux, shrink `net.ipv4.ip_local_port_range` so the kernel doesn't grab Vite's candidate ports.
  4. Use `strictPort: true` with a known-free port to fail fast instead of scanning 60k ports.

Example fix

// before
export default defineConfig({ server: { port: 65000 } }) // almost no room to walk

// after
export default defineConfig({ server: { port: 5173, strictPort: true } })
Defensive patterns

Strategy: validation

Validate before calling

import net from 'node:net'
const MAX_PORT = 65535
async function findFree(startPort: number, host?: string): Promise<number | null> {
  for (let p = startPort; p <= MAX_PORT; p++) {
    const ok = await new Promise<boolean>((res) => {
      const s = net.createServer().unref()
      s.once('error', () => res(false)).listen(p, host, () => s.close(() => res(true)))
    })
    if (ok) return p
  }
  return null
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of vitejs/vite@89620f09af (2026-08-03). Data as JSON: /data/errors/83eb40c2ff7e224a.json. Report an issue: GitHub.