[Solved][Jekyll] Failed to run Jekyll site locally on Windows (port error)
I found this issue when testing the jekyll website on Windows envronment.
Main Error message
C:/Ruby32-x64/lib/ruby/3.2.0/socket.rb:205:in `bind': Permission denied - bind(2) for 127.0.0.1:4000 (Errno::EACCES)
Full error message
PS C:\0_Workspace\ChiaoY\ChiaoY.github.io\docs> bundle exec jekyll serve
Configuration file: C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs/_config.yml
To use retry middleware with Faraday v2.0+, install `faraday-retry` gem
Source: C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs
Destination: C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs/_site
Incremental build: disabled. Enable with --incremental
Generating...
Jekyll Feed: Generating feed for posts
done in 0.972 seconds.
Auto-regeneration: enabled for 'C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs'
jekyll 3.9.5 | Error: Permission denied - bind(2) for 127.0.0.1:4000
C:/Ruby32-x64/lib/ruby/3.2.0/socket.rb:205:in `bind': Permission denied - bind(2) for 127.0.0.1:4000 (Errno::EACCES)
from C:/Ruby32-x64/lib/ruby/3.2.0/socket.rb:205:in `listen'
from C:/Ruby32-x64/lib/ruby/3.2.0/socket.rb:768:in `block in tcp_server_sockets'
from C:/Ruby32-x64/lib/ruby/3.2.0/socket.rb:231:in `each'
from C:/Ruby32-x64/lib/ruby/3.2.0/socket.rb:231:in `foreach'
from C:/Ruby32-x64/lib/ruby/3.2.0/socket.rb:766:in `tcp_server_sockets'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/webrick-1.8.1/lib/webrick/utils.rb:60:in `create_listeners'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/webrick-1.8.1/lib/webrick/server.rb:130:in `listen'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/webrick-1.8.1/lib/webrick/server.rb:111:in `initialize'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/webrick-1.8.1/lib/webrick/httpserver.rb:47:in `initialize'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/lib/jekyll/commands/serve.rb:229:in `new'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/lib/jekyll/commands/serve.rb:229:in `start_up_webrick'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/lib/jekyll/commands/serve.rb:104:in `process'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/lib/jekyll/commands/serve.rb:93:in `block in start'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/lib/jekyll/commands/serve.rb:93:in `each'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/lib/jekyll/commands/serve.rb:93:in `start'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/lib/jekyll/commands/serve.rb:75:in `block (2 levels) in init_with_program'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `block in execute'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `each'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `execute'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/mercenary-0.3.6/lib/mercenary/program.rb:42:in `go'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/mercenary-0.3.6/lib/mercenary.rb:19:in `program'
from C:/Ruby32-x64/lib/ruby/gems/3.2.0/gems/jekyll-3.9.5/exe/jekyll:15:in `<top (required)>'
from C:/Ruby32-x64/bin/jekyll:25:in `load'
from C:/Ruby32-x64/bin/jekyll:25:in `<main>'
Solution
This is becuse the default port 4000 used by jekyll is occupied by other services.
To check if there’s any service using port 4000, we can use the following command.
PS C:\0_Workspace\ChiaoY\ChiaoY.github.io\docs> netstat -ano | find """4000"""
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:4000 0.0.0.0:0 LISTENING 6860
Note: the find cmd is similar to grep in linux. However, if I don’t quote the
keyword three times, the find command would complain the parameter format is not correct.
So we confirmed that the process with PID 6860 is using the port 4000.
We have two solution:
- Kill
process 6860 - Use different port for Jekyll
Solution 1: Kill the process 6860
- Open the Task Manager with hotkey
Ctrl + Alt + Del. - Select Task Manager.
- In the Task Manager, right click the column header and enable the PID.
- Clik the PID column header to sort it.
- Found out the process or software with
PID 6860. - If the process is not important, kill it.
Solution 2: Use different port for Jekyll
Add --port <port> to assign the different port for jekyll, take port 4444 for example
PS C:\0_Workspace\ChiaoY\ChiaoY.github.io\docs> bundle exec jekyll serve --port 4444
Configuration file: C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs/_config.yml
To use retry middleware with Faraday v2.0+, install `faraday-retry` gem
Source: C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs
Destination: C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs/_site
Incremental build: disabled. Enable with --incremental
Generating...
Jekyll Feed: Generating feed for posts
done in 0.744 seconds.
Auto-regeneration: enabled for 'C:/0_Workspace/ChiaoY/ChiaoY.github.io/docs'
Server address: http://127.0.0.1:4444/
Server running... press ctrl-c to stop.