问题背景

由于近期关闭博客访问密码,由此凌晨访问博客发现无法访问。随即打开电脑,登录服务器查看原因。

问题排查

登录服务器后,top查看资源消耗。发现内存爆了。发现php-fpm很活跃,由于php有内存泄漏问题。顾杀死php-fpm观察,发现关闭php-fpm后内存正常(ps 租用的阿里云虚拟机,1核512M)。打开php-fpm后,刚开始能打开网站,很快又陷入无法访问。考虑到是php-fpm内存占用过多的问题,故研究了下php-fpm。

#关闭php-fpm
service php-fpm stop
#打开php-fpm
service php-fpm start

php-fpm优化

pm = dynamic #如何控制子进程,选项有static和dynamic

pm.max_children = 8#静态方式下开启的php-fpm进程数量

pm.max_requests = 100#php-fpm子进程能处理的最大请求数

pm.start_servers = 4#动态方式下的起始php-fpm进程数量
pm.min_spare_servers = 2 #动态方式下的最小php-fpm进程数
pm.max_spare_servers = 8 #动态方式下的最大php-fpm进程数量

如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。
系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程,
然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。
数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。

我的配置

pm = dynamic
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 8</code></pre>
<pre><code>ps -ef | grep php-fpm | grep -v grep | wc -l #查看进程数

问题解决的后续思考

为什么突然访问量暴增?
打开wordpress统计插件,发现有大量访客来自国内不同地区。当时凌晨4点,我的网站没有任何推广。emmm…我的站点可能被别的服务器扫描了,互联网安全,你懂的。。。

如何通过可视化界面来监控服务器环境
netdata 实时监控与告警

  1. 以二进制编译形式进行安装
bash <(curl -Ss https://my-netdata.io/kickstart.sh) all</code></pre></li>
</ol>
<p>bash <(curl -Ss <a href="https://my-netdata.io/kickstart-static64.sh">https://my-netdata.io/kickstart-static64.sh</a>) #64位
  1. 默认端口19999,防火墙设置
service iptables status #查看防火墙状态
service iptables -I INPUT -p tcp --dport 19999 -j ACCEPT #添加流入端口
service iptables save
service iptables restart
service iptables status

环境可以可视化,如何使服务器配置可视化了
webmin

  • 创建webmin.repo
#vi  /etc/yum.repo.d/webmin.repo
[Webmin]
name=Webmin Distribution Neutral
baseurl=http://download.webmin.com/download/yum
enabled=1
gpgcheck=1
gpgkey=http://www.webmin.com/jcameron-key.asc</code></pre>
  • 安装webmin
yum check-update
yum install webmin –y
service webmin start
  • 配置防火墙
service iptables -I INPUT -p tcp --dport 10000 -j ACCEPT
service iptables save
service iptables restart
  • 配置域名(nginx)

无负载模式

location / {
    # 不需要考虑到负载的,就无需配置upstream节点。
    proxy_pass      https://127.0.0.1:10000;
    proxy_redirect  off;

    #Proxy Settings
    proxy_redirect     off;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

    proxy_max_temp_file_size 0;
    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;
    proxy_buffer_size          128k;
    proxy_buffers              32 32k;
    proxy_busy_buffers_size    256k;
    proxy_temp_file_write_size 256k;
}

负载模式

upstream node {
    server 127.0.0.1:19999;
}
server {
    listen 80;
    server_name webmin.wyxxt.org.cn;
    location / {
        # 配置upstream节点
        proxy_pass      https://node;
        proxy_redirect  off;

        #Proxy Settings
        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          128k;
        proxy_buffers              32 32k;
        proxy_busy_buffers_size    256k;
        proxy_temp_file_write_size 256k;
    }
}

Scroll to Top