当前位置: 首页 > news >正文

天津市网站建设管理办法搜索网站

天津市网站建设管理办法,搜索网站,wordpress watermark,凤翔做网站最近用containerd在部署nginx的时候,发生了一个比较诡异的问题,当笔者通过nerdctl stop把原来的nginx容器关闭,然后再通过nerdctl run启动一个新的nginx容器的时候,把原来的宿主机端口映射到这个新容器上,但新启动的容…

最近用containerd在部署nginx的时候,发生了一个比较诡异的问题,当笔者通过nerdctl stop把原来的nginx容器关闭,然后再通过nerdctl run启动一个新的nginx容器的时候,把原来的宿主机端口映射到这个新容器上,但新启动的容器却无法通过映射的端口收到任何请求,而且新容器启动顺利,没有任何报错。这个问题的原因十分隐蔽,而且一开始让人无从下手。本文介绍了这个问题的解决办法,为被该问题困扰的同学提供一个脱困的思路。

1. 环境

出现问题的服务器环境长这样:

$ sudo uname -a
Linux ubuntu-1 5.4.0-121-generic #137-Ubuntu SMP Wed Jun 15 13:33:07 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
$ sudo nerdctl version
Client:Version:       v0.20.0OS/Arch:       linux/amd64Git commit:    e77e05b5fd252274e3727e0439e9a2d45622ccb9Server:containerd:Version:      1.6.6GitCommit:    10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1

同时还更新了cni网络插件到v1.1.1版本。
使用最新的nginx镜像:

$ sudo nerdctl exec nginx-4087e nginx -v
nginx version: nginx/1.25.0

2. 问题重现

首先启动一个nginx容器:

$ sudo nerdctl run -d -v /home/linmao/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/linmao/nginx/cert:/cert/ -p 8000:8000 -p 4443:4443 nginx
15b4bc769d04e6c28ac895c0403085656e866a35f72157edd6b81aec5464cbe6

其中映射了2个端口,8000端口用来提供http端点,4443端口用来提供https端点。
nginx.conf长这样:

events {worker_connections 64;
}http {resolver 8.8.8.8;server {listen 8000;# 这是部署在nginx服务器上层的网络入口防火墙的ip地址,4443端口映射到本机的4443端口。rewrite ^(.*) https://xxx.xxx.xxx.xxx:4443$1 permanent;}server {listen 4443 ssl;# 这是笔者自签的证书ssl_certificate /cert/self_cert.pem;ssl_certificate_key /cert/self_key.pem;location ~ /(.*)$ {# 这是代理的后端服务的域名proxy_pass https://www.xxxx.com/$1;proxy_redirect off;proxy_set_header Host $proxy_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}

此时8000端口和4443端口是正常的。

$ curl localhost:8000
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.25.0</center>
</body>
</html>$ curl localhost:4443
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.25.0</center>
</body>
</html>

关闭这个容器之后再用同样的命令run一个新的nginx,新的nginx启动日志是正常的,但是该新nginx无法收到任何网络流量。映射出来的端口并没有被监听。

$ sudo nerdctl stop 15b4bc769d04
15b4bc769d04$ sudo nerdctl run -d -v /home/linmao/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/linmao/nginx/cert:/cert/ -p 8000:8000 -p 4443:4443 nginx
b8bf8e71ce1578d2b1f79c5d66cb75d2287a0f0d942d978761124f2dc003b3b8$ sudo nerdctl logs -f b8bf8e71ce1578d2b1f79c5d66cb75d2287a0f0d942d978761124f2dc003b3b8
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: No route to host
$ curl localhost:4443
curl: (7) Failed to connect to localhost port 4443: No route to host$ netstat -ano|grep :8000
$
$ netstat -ano|grep :4443
$

3. 问题的原因

遇到这样的问题笔者是一点不慌(才怪),马上打开iptables看一下nat表,一下发现了一些不正常的地方(列表较长,不相关的规则被笔者去掉了,留下的都是相关的规则)。nat表的POSTROUTING链多了2个名为CNI-xxxxxx的规则,并且增加了2个名称对应为CNI-xxxxx的链。另外CNI-HOSTPORT-DNAT的链增加了2个名为CNI-DN-xxx的规则,同时增加了2个对应名称为CNI-DN-xxxxx的规则链。

$ sudo iptables -nL -t nat --line-numbers
...
Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
...
9    CNI-d7ad1e347f6ac6bffdae5988  all  --  10.4.0.54            0.0.0.0/0            /* name: "bridge" id: "default-15b4bc769d04e6c28ac895c0403085656e866a35f72157edd6b81aec5464cbe6" */
10   CNI-a294464dbb367262e6fa35c6  all  --  10.4.0.55            0.0.0.0/0            /* name: "bridge" id: "default-b8bf8e71ce1578d2b1f79c5d66cb75d2287a0f0d942d978761124f2dc003b3b8" */
...
Chain CNI-HOSTPORT-DNAT (2 references)
num  target     prot opt source               destination
1    CNI-DN-d7ad1e347f6ac6bffdae5  tcp  --  0.0.0.0/0            0.0.0.0/0            /* dnat name: "bridge" id: "default-15b4bc769d04e6c28ac895c0403085656e866a35f72157edd6b81aec5464cbe6" */ multiport dports 8000,4443
2    CNI-DN-a294464dbb367262e6fa3  tcp  --  0.0.0.0/0            0.0.0.0/0            /* dnat name: "bridge" id: "default-b8bf8e71ce1578d2b1f79c5d66cb75d2287a0f0d942d978761124f2dc003b3b8" */ multiport dports 8000,4443
...
Chain CNI-DN-a294464dbb367262e6fa3 (1 references)
num  target     prot opt source               destination
1    CNI-HOSTPORT-SETMARK  tcp  --  10.4.0.0/24          0.0.0.0/0            tcp dpt:8000
2    CNI-HOSTPORT-SETMARK  tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:8000
3    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:10.4.0.55:8000
4    CNI-HOSTPORT-SETMARK  tcp  --  10.4.0.0/24          0.0.0.0/0            tcp dpt:4443
5    CNI-HOSTPORT-SETMARK  tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:4443
6    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:4443 to:10.4.0.55:4443
...
Chain CNI-DN-d7ad1e347f6ac6bffdae5 (1 references)
num  target     prot opt source               destination
1    CNI-HOSTPORT-SETMARK  tcp  --  10.4.0.0/24          0.0.0.0/0            tcp dpt:8000
2    CNI-HOSTPORT-SETMARK  tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:8000
3    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:10.4.0.54:8000
4    CNI-HOSTPORT-SETMARK  tcp  --  10.4.0.0/24          0.0.0.0/0            tcp dpt:4443
5    CNI-HOSTPORT-SETMARK  tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:4443
6    DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:4443 to:10.4.0.54:4443
...
Chain CNI-d7ad1e347f6ac6bffdae5988 (1 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            10.4.0.0/24          /* name: "bridge" id: "default-15b4bc769d04e6c28ac895c0403085656e866a35f72157edd6b81aec5464cbe6" */
2    MASQUERADE  all  --  0.0.0.0/0           !224.0.0.0/4          /* name: "bridge" id: "default-15b4bc769d04e6c28ac895c0403085656e866a35f72157edd6b81aec5464cbe6" */
...
Chain CNI-a294464dbb367262e6fa35c6 (1 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            10.4.0.0/24          /* name: "bridge" id: "default-b8bf8e71ce1578d2b1f79c5d66cb75d2287a0f0d942d978761124f2dc003b3b8" */
2    MASQUERADE  all  --  0.0.0.0/0           !224.0.0.0/4          /* name: "bridge" id: "default-b8bf8e71ce1578d2b1f79c5d66cb75d2287a0f0d942d978761124f2dc003b3b8" */
...

再看一下mangle表,mangle表正常(空的):

$ sudo iptables -nL -t mangle --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destinationChain INPUT (policy ACCEPT)
num  target     prot opt source               destinationChain FORWARD (policy ACCEPT)
num  target     prot opt source               destinationChain OUTPUT (policy ACCEPT)
num  target     prot opt source               destinationChain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destinationChain KUBE-IPTABLES-HINT (0 references)
num  target     prot opt source               destinationChain KUBE-KUBELET-CANARY (0 references)
num  target     prot opt source               destination

再看一下filter表也正常,不过在笔者的另一台机器里发现了fliter表也被增加了几个规则。不过在笔者尝试重现问题的时候并未发现filter表有异常。建议同学们也查一下这个表。

$ sudo iptables -nL -t filter --line-numbers

这些新增的规则和规则链不会因为容器的停止而删除。后来笔者发现,这些规则的新增,是因为nginx.conf配置文件中,server块的rewrite命令后边写了ip地址。

    server {listen 8000;# 就是这一句写了ip地址,导致出现了上边那些规则,如果把ip地址改成localhost就不会出现上边的问题。rewrite ^(.*) https://xxx.xxx.xxx.xxx:4443$1 permanent;}

4. 问题的解决

知道了原因就很好办了,直接使用iptables -F 或者 iptables -D删掉多出来的规则就行了。有同学知道为什么nginx.conf把rewrite写成一个ip地址,就会在iptables增加一些不会自动删除的规则和规则链的原因的吗?快来评论区告诉笔者吧。

http://www.hrbkazy.com/news/35986.html

相关文章:

  • 网站从哪些方面来做百度站长工具seo
  • 做内贸哪个网站找客户优化百度涨
  • 外国平面设计网站有哪些一个品牌的策划方案
  • 网站设计大小seo整站优化方案
  • 品牌推广软文南昌seo实用技巧
  • 新楼盘网站模板今日足球赛事数据
  • 哪个网站做演唱会门票全自动引流推广软件下载
  • 哪些网站是做快消品的产品怎样推广有效
  • 哪个网站做衣服的发帖效果好的网站
  • 北京营销型网站建设培训班seo公司推广宣传
  • 外国黄网站色网址百度seo怎么操作
  • 肇庆住房和城乡建设部网站seo排名工具给您好的建议
  • 电子销售网站报表模块如何做营销策划方案怎么写
  • 网页设计与制作课程教学大纲seo快速入门教程
  • 永久免费建个人网站品牌推广公司
  • 在百度做推广需要网站吗个人怎么做免费百度推广
  • 企业网站icp备案东莞网站推广排名
  • 网站制作合同模板系统优化的意义
  • 抽奖怎么做网站百度竞价ocpc
  • 深圳网站建设制作设计平台合肥seo服务商
  • 顺德网站建设找顺的手机百度账号登录入口
  • 网站建设方案书要写吗北京百度推广排名优化
  • 自己做视频网站能赚钱吗交换链接是什么意思
  • 建筑学株洲seo优化公司
  • wordpress文件路径如何优化网页
  • 设计比例网站软文推广的标准类型
  • 品牌网站建设4小蝌蚪网络推广人员
  • 企业网站源码生成器引流软件
  • 政务服务网站建设汇报上海优化关键词的公司
  • 聊城网站建设lcbywl网上网络推广