Nginx容器绑定81端口报拒绝访问错误的解决 本文介绍普通用户运行容器时绑定81端口出错的解决过程。起因由于之前亲自将测试服务器搞挂了此后即使是测试环境服务器也不敢轻易使用root权限了。由于有大量程序使用docker容器部署于是做了一系列的权限修改。其中某个Nginx容器使用普通用户启动时报错了信息如下nginx: [emerg] bind() to 0.0.0.0:81 failed (13: Permission denied)使用ss和netstat等命令确认宿主机 81 端口并没有被占用但容器内就是不能绑定该端口。注意上述报错的是 “Permission denied”没有提到端口占用问题。问了AI其回复曰在 Linux 系统中绑定低端口小于1024或受限制端口需要特定权限。当容器以非 root 用户运行时进程仍然可能因为缺少CAP_NET_BIND_SERVICE能力而无法绑定端口。笔者在所使用的docker-compose.yml文件中配置了 user: “1000:1000”因此容器内进程没有 root 权限——因为上述原因如果我用root权限生成的日志或其它文件变成root权限不统一维护不方便。另外AI也提到说缺少了绑定端口的能力即Linux Capabilities 机制限制了非root用户绑定端口的能力Nginx因此报出permission denied错误。解决过程先确认端口是否被占用ss -tlnp | grep :81输出为空说明 81 端口未被占用排除端口冲突。再到容器里运行id查询身份docker exec -it 容器名 id输出显示 uid1000 而非 uid0(root)即容器以普通用户运行。除了root权限运行外可以修改 Nginx 配置让其监听 1024 以上的高位端口如 8081示例upstream xxxx { server 172.18.18.168:8081 weight1; } server { listen 8081; listen [::]:8081; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; proxy_pass http://onlinefee; } # 转发到后端 location /proxy { proxy_pass http://xxxx # 标准代理头设置 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; access_log /var/log/nginx/fee_pare2_access.log feeextended; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location /50x.html { root /usr/share/nginx/html; } }再在docker-compose.yaml文件里做端口映射yaml services: nginx: image: your-nginx-image user: 1000:1000 ports: - 81:8081 # nginx使用8081端口小结本文不涉及过多的技术只是笔者第一次遇到因此记录。