📑 文章章节大纲 (点击平滑直达)
问题
- 在 Linux 中,1024 以下端口被称为 privileged port,即特权端口。特权端口只能被由 root 启动的进程监听,该问题常出现在 nginx 非 root 启动的场景下(web 需要 80 端口,而非 root 启动 nginx 后 nginx 无法 bind 80 端口)
解决方法
-
为特定可执行文件赋予绑定特定端口的权限(执行一次永久生效)
```
setcap 'cap_net_bind_service=+ep' /path/to/program
```
-
取消可执行文件绑定端口的权限
```
setcap -r /path/to/program
```
注意
- 要使用 setcap,你的内核版本必须大于 2.6.24
- 如果目标文件是一个脚本,这样做是不行的(执行 bind 和 listen 的实际上是脚本解释器)
- 如果你为一个程序设置了这种权限,那么 LD_LIBRARY_PATH 对该程序将会失效,如果你的程序依赖它来找到所需要的库,那么你可以考虑使用端口转发了。