我认为,这更多的是一个 Docker 问题,而不是其他问题,但请允许我先描述一下情况。
我们将基础镜像升级到我们的一个容器中php:7.3.28-fpm-alpine3.13到php:7.3.28-fpm-alpine3.14。图像中发生变化的项目包括:
- Alpine Linux:从版本 3.13.5 到 3.14.0(根据cat /etc/os-release)
- Nginx:从 1/18.0 到 nginx/1.20.2
nginx 配置文件和用于生成最终镜像的 Dockerfile 在构建期间均未发生改变。然而,网络状态-tulpn有一个完全不同的故事要讲。
使用旧镜像构建的容器显示:
# netstat -tupln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 51/nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 51/nginx
tcp 0 0 127.0.0.11:36625 0.0.0.0:* LISTEN -
tcp 0 0 :::9000 :::* LISTEN 52/php-fpm.conf)
udp 0 0 127.0.0.11:57860 0.0.0.0:* -
最新报道显示:
# netstat -tupln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.11:40511 0.0.0.0:* LISTEN -
tcp 0 0 :::9000 :::* LISTEN 49/php-fpm.conf)
udp 0 0 127.0.0.11:49917 0.0.0.0:* -
所以我不知道哪个组件升级导致突然拒绝监听端口 80 或端口 443。
我想我得再次处理类似的情况,所以我对诊断和隔离此类问题的方法非常感兴趣。我仔细阅读了所有相关组件的发行说明,但没有发现任何会关闭端口访问的更改。
我思考nginx 最有可能是罪魁祸首,但我无法确定。它的主要配置文件看起来不错:
# cat /etc/nginx/conf.d/default.conf
server {
listen 80 default_server;
include ssl.conf;
server_name my_server.test;
root /var/www/html/my_server;
index index.php;
location / {
try_files $uri $uri/ =404;
}
rewrite ^/v1/(.*) /api.php/$1 break;
location ~ [^/]\.php(/|$) {
include php-fpm.conf;
}
}
这是一个已知问题(但记录不全)吗?我还可以检查什么?
答案1
我有过类似的经历,这是由于当 docker 以非 root 用户身份运行时,nginx 试图打开一个特权端口(低于 1024)。