docker 部署 php-fpm nginx 502 (Resource temporarily unavailable)


docker php-fpm Resource temporarily unavailable

環境:

nginx + php-fpm
centos xxx
docker xxx

前提是php-fpm 走的是socket,tcp不用有這問題

切入docker 用ab 壓測300  發現有失敗的請求nginx erro:
2020/06/17 17:49:11 [error] 23#0: *14896 connect() to unix:/dev/shm/php-cgi.sock failed (11: Resource temporarily unavailable) while connecting to upstream, 
client: 172.17.0.1, server: _, request: "GET / HTTP/1.0", upstream: "fastcgi://unix:/dev/shm/php-cgi.sock:", host: "127.0.0.1:9999"

查看:cat /proc/sys/net/core/somaxconn

解決方式:

找了一堆文檔沒找到與docker有關的Resource temporarily unavailable

1、docker run --sysctl net.core.somaxconn=32768 nginx-php-fpm
2、php-fpm  listen.backlog =-1  或者 32768

##-1表示 用系統的 值 ,
操作系統默認是128
docker默認也是128

如果docker 用的net 是host 不需要設置,是直接走的宿主機的。

net.core.somaxconn是Linux中的一個kernel參數,表示socket監聽(listen)的backlog上限。backlog是socket的監聽隊列,當一個請求(request)尚未被處理或建立時,他會進入backlog。而socket server可以一次性處理backlog中的所有請求,處理后的請求不再位於監聽隊列中。當server處理請求較慢,以至於監聽隊列被填滿后,新來的請求會被拒絕。

配置如下說明:

https://docs.docker.com/engine/reference/commandline/run/


Kubernetes Pod中的內核參數調整

下面原文轉:https://blog.csdn.net/lwlfox/article/details/104681603
這塊就復雜 一點:

背景
使用uwsgi部署了一個django的應用,並且使用Kubernetes來運行,但是運行以后老是報如下的錯誤,后來在網上查詢了,是一個系統內核參數(net.core.somaxconn)太小了,默認是128.所以需要將它調整大一些。

uwsgi_proto_uwsgi_parser(): Resource temporarily unavailable [proto/uwsgi.c line 40]

簡介
容器的系統內存參數不是通過echo 一個值到指定的文件,然后sysctl -p 就生效了。在docker 中可以使用 如下的命令來調整

docker run --sysctl net.core.somaxconn=1000 nginx

但是這K8S中,步驟稍微要復雜一點,主要是還需要修改kubelet的啟動參數。

步驟
1. 修改kubelet的service文件

vi /etc/systemd/system/kubelet.service ,在啟動命令中添加 --allowed-unsafe-sysctls=net.*

[root@ai-test-k8s07 ~]# cat /etc/systemd/system/kubelet.service

[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
 
[Service]
WorkingDirectory=/var/lib/kubelet
ExecStartPre=/bin/mount -o remount,rw '/sys/fs/cgroup'
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/memory/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/pids/system.slice/kubelet.service
ExecStart=/opt/kube/bin/kubelet \
  --config=/var/lib/kubelet/config.yaml \
  --cni-bin-dir=/opt/kube/bin \
  --cni-conf-dir=/etc/cni/net.d \
  --hostname-override=10.215.0.24 \
  --kubeconfig=/etc/kubernetes/kubelet.kubeconfig \
  --network-plugin=cni \
  --pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.1 \
  --root-dir=/var/lib/kubelet \
  --v=2 \
  --allowed-unsafe-sysctls=net.*
Restart=always
RestartSec=5
 
[Install]
WantedBy=multi-user.target

2. 重新啟動kubelet

systemctl daemon-reload && systemctl restart kubelet
3. 在Pod中添加內存參數,我是直接在Deployment里面改,securityContext 這個里面定義需要修改的內核參數,如果有多個,就在sysctls下面添加就可以。

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels: 
    app: nginx
 
spec: 
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template: 
    metadata:
      labels:
        app: nginx
    spec:
      securityContext:
        sysctls:
        - name: net.core.somaxconn
          value: "1000"
        - name: net.ipv4.tcp_keepalive_time
          value: "1200"
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 80

4. 運行這個Deployment

kubectl apply -f nginx.yaml

5. 進入容器查看內核參數

[root@master ~]# kubectl exec -it nginx-57b5f658d-44nq4 bash
root@nginx-57b5f658d-44nq4:/# cat /proc/sys/net/core/somaxconn
1000

其它的k8s文章:

https://yq.aliyun.com/articles/603745?utm_content=m_1000003707


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM