问题
- 在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对该程序将会失效,如果你的程序依赖它来找到所需要的库,那么你可以考虑使用端口转发了。