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
- 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.
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
- 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.
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
- Port ${port} is already in use
- Cannot print server URLs before server is listening.
- Cannot call server.listen in middleware mode.
AI-assisted analysis of vitejs/vite@89620f09af (2026-08-03).
Data as JSON: /data/errors/83eb40c2ff7e224a.json.
Report an issue: GitHub.