zoukankan      html  css  js  c++  java
  • nginx recv() failed (104: Connection reset by peer) while reading response header from upstream解决方法

    首先说下 先看 按照ab 每秒请求的结果 看看 都有每秒能请求几个 如果并发量超出你请求的个数 会这样 所以一般图片和代码服务器最好分开 还有看看io瓶ding 和有没有延迟的PHP代码执行

    0 先修改内核参数

    <pre>
    1、调整同时打开文件数量

    ulimit -n 20480
    2、TCP最大连接数(somaxconn)

    echo 10000 > /proc/sys/net/core/somaxconn
    3、TCP连接立即回收、回用(recycle、reuse)

    echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
    echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
    4、不做TCP洪水抵御

    echo 0 > /proc/sys/net/ipv4/tcp_syncookies
    </pre>
    也可以直接使用优化后的配置,在/etc/sysctl.conf中加入:
    <pre>
    net.core.somaxconn = 20480
    net.core.rmem_default = 262144
    net.core.wmem_default = 262144
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 4096 16777216
    net.ipv4.tcp_wmem = 4096 4096 16777216
    net.ipv4.tcp_mem = 786432 2097152 3145728
    net.ipv4.tcp_max_syn_backlog = 16384
    net.core.netdev_max_backlog = 20000
    net.ipv4.tcp_fin_timeout = 15
    net.ipv4.tcp_max_syn_backlog = 16384
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_max_orphans = 131072
    net.ipv4.tcp_syncookies = 0
    </pre>


    然后修改nginx.conf 比如worker_processes等等


    1 查看nginx错误日记 error.log日志得到connect() to unix:/tmp/php-cgi.sock failed xxxxx........
    如果是因为突然的网站访问量大(这里说明这个是说tcp过高,并不能说明cpu过高和内存使用率过高,带宽过高)导致那么一般是因为子进程数不足:
    到php-fpm.conf找到max_children也就是子进程最大数改为:<value name="max_children">128</value>


    2

    <pre>
    tail -n 10 /var/log/messages


    Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:31 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:32 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:32 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    Dec 1 15:33:32 iZ238qupob7Z kernel: TCP: time wait bucket table overflow
    </pre>
    time wait bucket table overflow 这种代表 服务器的TCP连接数,超出了内核定义最大数

    查看当前的内核定义最大数
    <pre>
    cat /proc/sys/net/ipv4/tcp_max_tw_buckets
    </pre>


    <pre>
    解决方法:
    修改内核参数 /proc/sys/net/ipv4/tcp_max_tw_buckets
    # echo 30000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
    写入/etc/sysctl.conf使之永久生效
    echo 'net.ipv4.tcp_max_tw_buckets = 30000' >> /etc/sysctl.conf && sysctl -p
    </pre>


    3 当然也有可能PHP代码 消耗太多CPU 执行时间过长 将采取如下方法 看看里面的错误连接的链接是不是请求时间过长

    nginx recv() failed (104: Connection reset by peer) while reading response header from upstream解决方法 除了升级服务器配置还有以下方法可以参考下


    request_terminate_timeout = 0//这样 就不怕了 之前是PHP执行时间因为超过了设置的值所以报错 这个时候需要重启php-fpm 或者等他自己重启时间相当漫长
    还有另外设置下PHP限制执行时间 设置2秒即可 超过2秒就直接报错让用户不要继续访问了 就不影响服务器性能了
    <pre>
    max_execution_time = 10;
    </pre>

    比如像导出excel耗时的 在代码中加
    <pre>
    set_time_limit(0);
    </pre>


    ps:可以开启慢查询日记 PHP执行超过1秒的记录下
    <pre>
    slowlog = /data/logs/php-fpm.log.slow
    request_slowlog_timeout = 6
    </pre>


    4 如果以上都不行 图片都用CDN 或者就直接再买个服务器负载均衡就好了 买1个星期的 估计能抗几下


    复制ecs实例的方法
    1、系统盘
    通过创建自定义镜像的方式,创建一个自定义镜像,然后使用这个自定义镜像创建ECS即可。
    http://help.aliyun.com/knowledge_detail.htm?spm=5176.7114037.1996646101.1.uamHK9&categoryId=8314847&knowledgeId=5974456&pos=1


    2、数据盘
    对已经配置完成的数据盘进行打快照。
    然后在购买或者升级页面,添加磁盘的地方点:“用快照创建磁盘”,选择你要的快照即可。

  • 相关阅读:
    包含了访问命名服务的类和接口
    JNDI架构提供了一组标准的独立于命名系统的API
    利用JNDI的命名与服务功能来满足企业级API对命名与服务的访问
    JNDI(Java Naming and Directory Interface,Java命名和目录接口)
    Servlet 国际化
    重要的调试技巧
    使用 JDB 调试器
    Servlet 调试
    Servlet 打包部署
    编译包中的 Servlet
  • 原文地址:https://www.cnblogs.com/newmiracle/p/11856413.html
Copyright © 2011-2022 走看看