树莓派4B运行Express.js监听80端口遇EACCES权限拒绝问题
解决Express.js在树莓派4 Model B上启动时的EACCES权限错误
你遇到的错误信息如下:
events.js:291 throw er; // Unhandled 'error' event ^ Error: listen EACCES: permission denied 0.0.0.0:80 at Server.setupListenHandle [as _listen2] (net.js:1293:21) at listenInCluster (net.js:1358:12) at Server.listen (net.js:1444:7) at Function.listen (/home/malinapi/Documents/node_modules/express/lib/application.js:635:24) at Object.<anonymous> (/home/malinapi/Documents/app.js:9:5) at Module._compile (internal/modules/cjs/loader.js:999:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) at Module.load (internal/modules/cjs/loader.js:863:32) at Function.Module._load (internal/modules/cjs/loader.js:708:14) at Function.executeUserEntryPoint [as runMain] (internal/process/run_main.js:60:12) Emitted 'error' event on Server instance at: at emitErrorNT (net.js:1337:8) at processTicksAndRejections (internal/process/task_queues.js:84:21) { code: 'EACCES', errno: 'EACCES', syscall: 'listen', address: '0.0.0.0', port: 80 }
问题原因
端口80属于Linux系统的特权端口(端口号小于1024的端口都需要root权限才能绑定),当前普通用户没有权限让Express应用绑定该端口,因此触发权限拒绝错误。
解决方案
1. 临时用sudo运行应用(不推荐)
直接以root权限启动应用,快速解决但存在安全隐患:
sudo node app.js
2. 修改应用监听非特权端口
将Express应用的监听端口改为1024以上的端口(如3000),修改app.js中的代码:
app.listen(3000, '0.0.0.0', () => { console.log('应用运行在http://0.0.0.0:3000'); });
启动后访问http://你的树莓派IP地址:3000即可。
3. 给Node.js赋予绑定特权端口的权限
使用setcap命令给Node.js二进制文件添加网络绑定权限,这样普通用户也能让应用监听80端口:
# 先确认Node.js的安装路径 which node # 执行setcap命令(替换路径为实际输出结果) sudo setcap cap_net_bind_service=+ep /usr/bin/node
如果是用nvm安装的Node.js,路径类似~/.nvm/versions/node/v18.17.0/bin/node,替换成实际路径即可。
4. 配置Nginx反向代理(生产环境推荐)
通过Nginx监听80端口,将请求转发到Express应用的非特权端口(如3000),既安全又便于管理:
- 安装Nginx:
sudo apt update && sudo apt install nginx
- 创建应用配置文件:
sudo nano /etc/nginx/sites-available/express-app
写入以下内容(替换你的树莓派IP或域名和3000为实际值):
server { listen 80; server_name 你的树莓派IP或域名; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 启用配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/express-app /etc/nginx/sites-enabled/ sudo nginx -t # 检查配置是否正确 sudo systemctl restart nginx
之后启动Express应用监听3000端口,用户访问80端口时Nginx会自动转发请求到应用。
内容的提问来源于stack exchange,提问作者Olex7iMatix
相关产品推荐
相关产品推荐

