sed 字符串替换

1. sed替换的基本语法为:

sed 's/原字符串/替换字符串/'

单引号里面,s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线””进行转义。

2. 单引号” ‘ ’”是没有办法用反斜线””转义的,这时候只要把命令中的单引号改为双引号就行了,格式如下:

# 要处理的字符包含单引号
sed "s/原字符串包含'/替换字符串包含'/" 

3. 命令中的三根斜线分隔符可以换成别的符号,有时候替换目录字符串的时候有较多斜线,这个时候换成其它的分割符是较为方便,只需要紧跟s定义即可。

# 将分隔符换成问号”?”:
sed 's?原字符串?替换字符串?'

4. 可以在末尾加g替换每一个匹配的关键字,否则只替换每行的第一个,例如:

# 替换所有匹配关键字
sed 's/原字符串/替换字符串/g'

5. 一些特殊字符的使用

”^”表示行首

”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)
  

# 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
sed 's/^/添加的头部&/g'      #在所有行首添加
sed 's/$/&添加的尾部/g'      #在所有行末添加
sed '2s/原字符串/替换字符串/g'  #替换第2行
sed '$s/原字符串/替换字符串/g'   #替换最后一行
sed '2,5s/原字符串/替换字符串/g' #替换2到5行
sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行

6. 批量替换字符串

sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径`
sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir

7. sed处理过的输出是直接输出到屏幕上的,使用参数”i”直接在文件中替换。

# 替换文件中的所有匹配项
sed -i 's/原字符串/替换字符串/g' filename

8. 多个替换可以在同一条命令中执行,用分号”;”分隔,其格式为:

# 同时执行两个替换规则
sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' 

samba文件共享

samba的作用

samba是一款软件,主要功能时提供cifs协议,Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源

samba的安装与启用

虚拟机IP:172.25.254.125(服务端)

yum install samba samba-common samba-client -y
systemctl start smb
systemctl stop firewalld

虚拟机IP:172.25.254.225(客户端)

yum install samba-client -y

samba的基本信息

netstat -lntup|grep smb

端口: 139/tcp 139/udp 445/tcp 445/udp
主配置文件:/etc/samba/smb.conf

基本配置信息

虚拟机IP:172.25.254.125(服务端)

vim /etc/samba/smb.conf
89         workgroup = dream                                                   ###工作组的设定
90         server string = hello world                                         ###全局共享信息
hosts deny = 172.25.254.225                                                    ###黑名单
hosts allow =172.25.254.225  172.25.254. 或  172.25.254.0/24                   ###白名单 

测试

虚拟机IP:172.25.254.225(客户端)

smbclient -L //172.25.254.125 

黑名单打开:

未分类

白名单打开:

未分类

本地用户的建立及访问

虚拟机IP:172.25.254.125(服务端)

useradd aa
useradd dream
smbpasswd -a aa                                           
smbpasswd -a dream                                        ###添加samba用户
[root@samba-server ~]# pdbedit -L                         ###列出samba用户
aa:1002:
dream:1001:
pdbedit -x aa                                             ###删除samba用户
setsebool -P samba_enable_home_dirs on                    ###给家目录权限,/etc/samba/smb.conf的30行 

测试

虚拟机IP:172.25.254.225(客户端)

smbclient //172.25.254.225/dream -U dream                 ###这样很多命令没法使用,所以我们挂载使用文件夹
mount //172.25.254.225/dream /mnt -o username=dream,password=1
vim /etc/fstab
###开机自动挂载
//172.25.254.225/dream /mnt    cifs    defaults,username=dream,password=1 0 0

如果未给家目录权限:

未分类

给了权限:

未分类

未分类

自定义共享目录

(1)用户创建的目录

虚拟机IP:172.25.254.125(服务端)

mkdir /dream
semanage fcontext -a -t samba_share_t '/dream(/.*)?'                 ###开放当前目录的selinux安全上下文
restorecon -FvvR /dream/
[root@samba-server /]# ls -dZ /dream                                 ###查看selinux安全上下文
 drwxr-xr-x. root root system_u:object_r:samba_share_t:s0 /dream
vim /etc/samba/smb.conf                                              ```

###在文件最后面加入
321         [DREAM]                                                  
322         comment = dream_ya                                       ###描述
323         path = /dream
touch /dream/aa                                                      ###我们在共享目录建文件来看下效果

测试

虚拟机IP:172.25.254.225(客户端)

smbclient -L //172.25.254.125 -U dream

未分类

smbclient  //172.25.254.125/DREAM -U dream

未分类

(2)系统目录

虚拟机IP:172.25.254.125(服务端)

vim /etc/samba/smb.conf
326         [SYSTEM]
327         comment = file
328         path = /mnt
setsebool -P samba_export_all_ro on                       ###/etc/samba/smb.conf的49行

测试

虚拟机IP:172.25.254.225(客户端)

smbclient -L //172.25.254.125 -U dream

未分类

smbclient  //172.25.254.125/SYSTEM -U dream

未分类

匿名用户登陆

虚拟机IP:172.25.254.225(客户端)

vim /etc/samba/smb.conf
124 map to guest = bad user
321         [DREAM]
322         comment = dream_ya
323         path = /dream
324        guest ok = yes                              ###匿名用户可以登陆
systemctl restart smb

测试

虚拟机IP:172.25.254.225(客户端)

mount //172.25.254.125/DREAM/mnt/ -o username=guest
df

未分类

权限控制

虚拟机IP:172.25.254.225(客户端)

chmod 777 /dream
setsebool -P samba_export_all_rw on
vim /etc/samba/smb.conf
writable = yes | no                           ###是否开启写权限(开启所有用户都可以写)
把上面的writable = yes | no注释掉,在测试下面的情况
write list = dream                            ###给dream写的权限
write list = +dream                           ###给dream组写的权限
admin users = dream                           ###设定当前共享的root为dream
valid users = @dream                          ###设定当前共享的有效用户组
browseable = yes | no                         ###当前共享是否隐藏

测试

虚拟机IP:172.25.254.225(客户端)

[root@samba-client /]# mount //172.25.254.125/DREAM /mnt -o username=dream,password=1
vim /etc/samba/smb.conf
327         [SYSTEM]
328         comment = file
329         path = /mnt
330         browseable = no
systemctl restart smb.service

测试

虚拟机IP:172.25.254.225(客户端)

smbclient -L //172.25.254.125 -U dream              

未分类

samba的多用户挂载

虚拟机IP:172.25.254.225(客户端)

yum install cifs-utils.x86_64 -y
vim /root/sambapasswd
username=dream
password=1

chmod 600 /root/sambapasswd
mount -o credentials=/root/sambapasswd,sec=ntlmssp,multiuser //172.25.254.125/DREAM /mnt
credentials=/root/sambapasswd                                    ###挂载时的用户认证目录
multiuser                                                        ###支持其他用户认证
sec=ntlmssp                                                      ###其他用户的认证方式

测试

虚拟机IP:172.25.254.125(服务端)

[root@samba-server /]# useradd redhat
[root@samba-server /]# smbpasswd -a redhat
New SMB password:
Retype new SMB password:
Added user redhat. 

虚拟机IP:172.25.254.225(客户端)

[root@samba-client /]# useradd kk
[root@samba-client /]# su - kk
[root@samba-client /]# cifscreds add -u redhat 172.25.254.125
[root@samba-client /]# ls /mnt

未分类

rsync+lsyncd实现文件实时同步

可参考http://seanlook.com/2015/05/06/lsyncd-synchronize-realtime/
可参考http://openlinuxfly.blog.51cto.com/7120723/1679279
可参考http://segmentfault.com/a/1190000002737213

一、环境

lsyncd    192.168.3.71

rsync     192.168.3.72

二、配置rsync服务器

配置rsync以xinetd方式运行

[root@rsync ~]# yum install rsync -y
[root@rsync ~]# yum install xinetd -y

#修改/etc/xinetd.d/rsync
[root@rsync ~]# vim /etc/xinetd.d/rsync
service rsync
{
    disable         = no          ##将yes改成no  
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    log_on_failure  += USERID
}

#启动xinetd服务
[root@rsync ~]# service xinetd start
Starting xinetd:                                           [  OK  ]

#rsync默认的监听端口是873,查看873号端口是否启动
[root@rsync ~]# netstat -tunlp
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:22                  0.0.0.0:*                   LISTEN      1247/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1324/master         
tcp        0      0 :::22                       :::*                        LISTEN      1247/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1324/master         
tcp        0      0 :::873                      :::*                        LISTEN      1561/xinetd

创建rsync服务目录和配置文件

#创建rsync服务目录
[root@rsync ~]# mkdir /etc/rsyncd

# 创建配置文件
[root@rsync ~]# touch /etc/rsyncd/rsyncd.conf

# 创建密码文件
[root@rsync ~]# touch /etc/rsyncd/rsyncd.secrets

#权限修改
[root@rsync ~]# chown root:root /etc/rsyncd/rsyncd.secrets
[root@rsync ~]# chmod 600 /etc/rsyncd/rsyncd.secrets            #这里的权限设置必须是600

创建用户和密码

[root@rsync ~]# echo "rsync:test" >>/etc/rsyncd/rsyncd.secrets

创建rsync配置文件

[root@rsync ~]# cat /etc/rsyncd/rsyncd.conf 
# GLOBAL OPTIONS
uid = root
gid = root

use chroot = yes        #这个参数要设置成yes,如果同步的是软连接文件,同步过来后会多一个前缀,导致软连接不能正常使用

read only = no        #我们需要实时同步lsyncd服务器上的资源,这个需要有写权限,或者在模块中赋予写权限

#limit access to private LANs
hosts allow=192.168.3.0/255.255.0.0
hosts deny=*
max connections = 5

pid file = /var/run/rsyncd.pid

secrets file = /etc/rsyncd/rsyncd.secrets
#lock file = /var/run/rsync.lock           

motd file = /etc/rsyncd/rsyncd.motd        

#This will give you a separate log file
log file = /var/log/rsync.log               

#This will log every file transferred - up to 85,000+ per user, per sync
transfer logging = yes

log format = %t %a %m %f %b
syslog facility = local3
timeout = 300

# MODULE OPTIONS
[test]
path = /data/test
list=yes
ignore errors
auth users = rsync            #客户端连接过来使用的用户是rsync
comment = welcome to rsync server

编辑xinetd的rsync配置文件,添加配置文件路径

#添加rsync的配置文件路径
[root@rsync ~]# vim /etc/xinetd.d/rsync
service rsync
{
    disable = no
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon --config=/etc/rsyncd/rsyncd.conf    #添加配置文件路径
    log_on_failure  += USERID
}

#重启xinetd服务
[root@rsync ~]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
[root@rsync ~]# netstat -anpt |grep 873
tcp        0      0 :::873                      :::*                        LISTEN      1586/xinetd 

#创建数据目录
[root@rsync ~]# mkdir -p /data/test

三、配置lsyncd服务器

#安装rsync,lsyncd
[root@lsyncd ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@lsyncd ~]# sed -i 's@#b@b@g' /etc/yum.repos.d/epel.repo
[root@lsyncd ~]# sed  -i 's@mirrorlist@#mirrorlist@g' /etc/yum.repos.d/epel.repo
[root@lsyncd ~]# yum install rsync lsyncd -y

配置lsyncd服务配置文件

本地同步

1.1 本地目录同步:direct:cp/rm/mv。 适用:500+万文件,变动不大

[root@lsyncd ~]# vim /etc/lsyncd.conf 
settings {
        logfile         = "/tmp/lsyncd.log",
        statusFile      = "/tmp/lsyncd.status",
        statusInterval  = 5,
}

sync {
        default.direct,
        source          = "/data/test",            #要同步的源目录
        target          = "/data/dest",            #同步的目的目录
        delay           = 1,    
        maxProcesses    = 1,
}

#启动服务
[root@lsyncd ~]# /etc/init.d/lsyncd start
Starting lsyncd:                                           [  OK  ]

#测试,查看目录内容
[root@lsyncd ~]# ll /data/test
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:00 1.txt
-rw-r--r-- 1 root root 0 Jul 30 15:01 test.txt
[root@lsyncd ~]# ll /data/dest/
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:00 1.txt
-rw-r--r-- 1 root root 0 Jul 30 15:01 test.txt

#创建一个新文件
[root@lsyncd ~]# touch /data/test/for.py

#查看结果
[root@lsyncd ~]# ll /data/dest/
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:00 1.txt
-rw-r--r-- 1 root root 0 Jul 30 15:03 for.py
-rw-r--r-- 1 root root 0 Jul 30 15:01 test.txt

#删除/data/test目录下的txt文件
[root@lsyncd ~]# rm -rf /data/test/*.txt
[root@lsyncd ~]# ll /data/dest/
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:03 for.py

1.2 本地目录同步rsync模式:rsync

#编辑lsyncd配置文件添加如下内容
[root@lsyncd ~]# vim /etc/lsyncd.conf 
sync{
        default.rsync,
        source          = "/data/test",
        target          = "/tmp/ceshi",            #如果目录不存在,会自动创建目录
        delete          = true,
        exclude         = { "test"},
        rsync = {
                compress = true,
                verbose  = true,
                archive  = true,
        }
}

#重启服务
[root@lsyncd ~]# /etc/init.d/lsyncd restart
Stopping lsyncd:                                           [  OK  ]
Starting lsyncd:                                           [  OK  ]

#测试
[root@lsyncd ~]# ll /tmp/ceshi/
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:03 for.py

#在/data/test下添加一个文件ceshi.txt
[root@lsyncd ~]# touch /data/test/ceshi.txt
[root@lsyncd ~]# ll /tmp/ceshi/                #有点延迟,可能是虚拟机的原因
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:14 ceshi.txt
-rw-r--r-- 1 root root 0 Jul 30 15:03 for.py

远程同步

2.1 远程同步: rsync模式 + rsyncd daemon

#创建密码文件
[root@lsyncd ~]# echo "test" > /etc/backserver.pas
[root@lsyncd ~]# chmod 600 /etc/backserver.pas 

#修改lsyncd的配置文件,添加如下内容
[root@lsyncd ~]# vim /etc/lsyncd.conf 
sync{
        default.rsync,
        source          = "/data/test",
        target          = "[email protected]::test",    #这里的用户是192.168.3.72里设置的用户
        delete          = true,
        exclude         = { ".tmp"},
        delay           = 1,
        rsync   = {
                binary = "/usr/bin/rsync",
                archive = true,
                compress = true,
                verbose = true,
                password_file = "/etc/backserver.pas",    #需要的密码配置文件
                _extra  = {"--bwlimit=200",}
        }
}

[root@lsyncd ~]# /etc/init.d/lsyncd restart
Stopping lsyncd:                                           [  OK  ]
Starting lsyncd:                                           [  OK  ]

#测试,查看rsync:192.168.3.72上的test模块下的文件
[root@rsync ~]# hostname
rsync
[root@rsync ~]# ll /data/test/
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:15 1.txt
-rw-r--r-- 1 root root 0 Jul 30 15:14 ceshi.txt
-rw-r--r-- 1 root root 0 Jul 30 15:03 for.py
-rw-r--r-- 1 root root 0 Jul 30 15:23 test

#在lsyncd上删除/data/test目录下的for.py
[root@lsyncd ~]# hostname 
lsyncd
[root@lsyncd ~]# rm -rf /data/test/for.py 

#查看结果
[root@rsync ~]# hostname
rsync
[root@rsync ~]# ll /data/test/
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:15 1.txt
-rw-r--r-- 1 root root 0 Jul 30 15:14 ceshi.txt
-rw-r--r-- 1 root root 0 Jul 30 15:23 test

#测试添加一个文件
[root@lsyncd ~]# hostname
lsyncd
[root@lsyncd ~]# touch /data/test/docker.txt

#查看结果
[root@rsync ~]# ll /data/test/
total 0
-rw-r--r-- 1 root root 0 Jul 30 15:15 1.txt
-rw-r--r-- 1 root root 0 Jul 30 15:14 ceshi.txt
-rw-r--r-- 1 root root 0 Jul 30 15:31 docker.txt
-rw-r--r-- 1 root root 0 Jul 30 15:23 test

rsync远程同步

1、rsync:快速增量备份工具,实现远程同步,可使用ssh和rsync备份源rsync服务器:备份源,提供一个目录供客户端上传或下载

2、rsync的配置

建立rsync的配置文件:/etc/rsyncd.conf

use chroot=yes 禁锢在源地址

port 837 默认端口号为873

pid file 进程号文件位置

hosts allow 允许访问客户机地址

[wwwroot] 共享名

path=/路径 真正的文件夹位置

comment= 描述

read only=yes|no 只读|读写

auth users=用户名 认证的用户

secrets file=文件名路径 验证文件

验证文件格式: 用户名:密码

权限必须设置为600

3、管理rsync服务:

启动:rsync --daemon

停止:kill 进程号

4、rsync的使用

格式:rsync 选项 原始位置 目标位置

选项:-a:归档模式,等同于 -rlptgoD

  -r:递归,包含目录

  -p:权限(保留权限)

  -t:时间

  -z:压缩

  -v:同步过程信息

  --delete:删除目标位置有而原始位置没有的文件

5、备份源(服务器端)的表达方式:

1)用户名@服务器IP::共享名

例:[email protected]::wwwroot

2)rsync://用户名@服务器IP/共享名

Rsync -avz [email protected]::wwwroot /root

6、实现免交互模式:

1)创建密码文件并设置权限为600

2)同步时使用 --password-file=文件名 的方式指定文件位置

7、实时同步:有变化则备份,无变化不备份

通过inotify机制实现,实时监控本地文件系统目录的变化,并作出通知响应,适当调整监控文件数量

inotify-tools辅助工具,有两个命令:

inotifywait:持续监控,实时输出结果

inotifywatch:短期监控,完成后输出结果

格式:inotifywait -mrq -e 监控事件类型 /监控目标

-m:持续监控 

-r:监控整个目录

-q:简化输出 

-e:监控事件类型

类型有:

modify(修改) 

create(创建) 

move(移动)

delete(删除) 

attrib(属性更改)

关于 Python 垃圾回收机制的初步认识

一、前言

  Python 是一门高级语言,使用起来类似于自然语言,开发的时候自然十分方便快捷,原因是Python在背后为我们默默做了很多事情,其中一件就是垃圾回收,来解决内存管理,内存泄漏的问题。

  内存泄漏:当程序不停运行,有一部分对象没有作用,但所占内存没有被释放,服务器内存随时间越来越少,最终导致系统的崩溃,所以内存泄漏是一个需要重点关注的问题。

二、引用计数

Python 标记一个对象是否还有用的方法就是用引用计数,以下情形会为该对象的计数+1:

  1. 创建时

  2. 被引用时

  3. 作为参数传入函数时

相反,以下情形会为该对象的计数-1:

  1. 被del

  2. 被重引用

  3. 函数执行完毕

查看某一元素的计数可以通过 sys.getrefcount(),当引用计数为0 的时候,内存就会被释放。

可以想到和其他垃圾回收相比,Python的机制优点很明显,就是实时性,Python的gc 模块就是开放的接口用以管理。

也可以很容易猜到这样的缺点就是性能相对较低,看过这样的报道,instagram 通过禁用 gc 模块,性能提升10%!

三、 循环引用

有一种特殊情况,当两个或多个变量互相循环引用的时候,按照计数引用的机制就无法处理了

a = []
b = []
a.append(b)
b.append(a)
print(a,b)

a,b 的引用计数均为2,无法回收两者内存

四、解决方案

1、通过 ”标记-清除“ 来解决循环调用问题:

垃圾回收器定时去寻找这类循环调用,并清除

具体是 先从 根对象集合副本中 开始寻找,这些对象计数不为0,没有被清除

然后一个个检测,将其分为可达对象和不可达对象,底层通过链表的数据结构实现,通过操作副本清除标记,来在不影响原数据的情况下,判断是否为循环调用

最后将不可达对象清除,释放内存,效率较低。    

有三种情况会触发垃圾回收:

  1. 调用gc.collect(),
  2. 当gc模块的计数器达到阀值的时候。
  3. 程序退出的时候

2、分代回收,利用 “空间换时间”策略提高效率:

有些内存块生存时间从开始到结束,有些则很短,所以同样对他们进行垃圾回收是很浪费的一件事情,

所有对象开始被划分到零代中,Python 默认 有三代,一个代就是一个链表

年轻代中的对象优先处理,经历垃圾处理次数愈多的,越“老资格” ,就会上升,最终放在第二代中。

备注:

Python的垃圾回收机制是通过检测数量是否到达阈值来决定是否进行。

Python 这方面源码是c写的,暂时看不懂,留待以后搞懂链表结构再来研究,

gc 模块 留待以后研究。

php-fpm启动,重启,终止操作方法

启动php-fpm

/usr/work/php/sbin/php-fpm

php5.3.3以后的版本不在支持这种方式,需要以信号方式控制

INT, TERM 立刻终止
QUIT 平滑终止
USR1 重新打开日志文件
USR2 平滑重载所有worker进程并重新载入配置和二进制模块php-fpm master进程可以理解以下信号

先查看php-fpm的master进程号

未分类

kill -USR2 10856    

就直接平滑重启php-fpm了

但是如果生成php-fpm.pid,重启时可以使用下面这种方案:

上面master进程可以看到,matster使用的是/usr/work/tool/php/etc/php-fpm.conf这个配置文件,cat /usr/work/tool/php/etc/php-fpm.conf 发现:

未分类

pid文件路径应该位于/usr/work/tool/php/etc/php-fpm.conf,由于注释掉,所以没有生成,我们把注释去除,再kill -USR2 10856 重启php-fpm,便会生成pid文件,下次就可以使用以下命令重启,关闭php-fpm了:

php-fpm 关闭:

kill -INT `cat /usr/work/tool/php/var/run/php-fpm.pid`

php-fpm 重启:

kill -USR2 `cat /usr/work/local/php/var/run/php-fpm.pid`

php-fpm进程过多,内存耗尽

重拾博客,在启用伪静态等加速技术后,服务器mysql数据库频繁出现宕机现象。

未分类

输入命令top查看进程后,发现php-fpm占用多达20个进程,每个进程占用内存4%,使得mysql因为内存耗尽而停止。在改动php-fpm后,问题迎刃而解。

一、内存耗尽解决方案

找到php-fpm.conf,该配置文件与php.ini一起在php的文件夹下。

我所在的目录是 /usr/local/php54/etc/php-fpm.conf

找到如下设置:

未分类

由于我所使用的服务器为1G内存的,故改为如上设置

二、php-fpm参数概述

下面对每个参数的意义进行简要的概述分析

pm=dynamic

该项共有三种设置方式 static 、 dynamic 、ondemand

  • 一种是pm = static,始终保持一个固定数量的子进程,这个数由pm.max_children定义,这种方式很不灵活,也通常不是默认的。

  • 另一种是pm = dynamic,他是这样的,启动时,会产生固定数量的子进程(由pm.start_servers控制)可以理解成最小子进程数,而最大子进程数则由pm.max_children去控制,这样的话,子进程数会在最大和最小数范围中变化,还没有完,闲置的子进程数还可以由另2个配置控制,分别是pm.min_spare_servers和pm.max_spare_servers,也就是闲置的子进程也可以有最小和最大的数目,而如果闲置的子进程超出了pm.max_spare_servers,则会被杀掉。(注意,pm.max_spare_servers应小于pm.max_children)

  • 第三种就是pm = ondemand模式,这种模式和pm = dynamic相反,把内存放在第一位,他的工作模式很简单,每个闲置进程,在持续闲置了pm.process_idle_timeout秒后就会被杀掉,有了这个模式,到了服务器低峰期内存自然会降下来,如果服务器长时间没有请求,就只会有一个php-fpm主进程,当然弊端是,遇到高峰期或者如果pm.process_idle_timeout的值太短的话,无法避免服务器频繁创建进程的问题,因此pm = dynamic和pm = ondemand谁更适合视实际情况而定。

可以看到,pm = dynamic模式非常灵活,也通常是默认的选项。但是,dynamic模式为了最大化地优化服务器响应,会造成更多内存使用,因为这种模式只会杀掉超出最大闲置进程数(pm.max_spare_servers)的闲置进程,比如最大闲置进程数是30,最大进程数是50,然后网站经历了一次访问高峰,此时50个进程全部忙碌,0个闲置进程数,接着过了高峰期,可能没有一个请求,于是会有50个闲置进程,但是此时php-fpm只会杀掉20个子进程,始终剩下30个进程继续作为闲置进程来等待请求,这可能就是为什么过了高峰期后即便请求数大量减少服务器内存使用却也没有大量减少,也可能是为什么有些时候重启下服务器情况就会好很多,因为重启后,php-fpm的子进程数会变成最小闲置进程数,而不是之前的最大闲置进程数。

max_requests

即是说每个进程若超过这个数目(跟php进程有一点点关系,关 系不大),就自动杀死.

max_children

最大进程数,一般来说一台服务器正常情况下每一个php-fpm所耗费的内存在40M左右,理想最大进程数可计算为1000/40=25,但是实际上内存不止有php-fpm在占用,故可根据实际情况来,适当减小使得内存不会因php-fpm进程过多而耗尽。而如果我 的”max_children”设置的较小,比如5-10个,那么php-fpm就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处 理的请求就会出现504 Gateway Time-out这个错误。

request_terminate_timeout

据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分 钟因此我设置了1200秒,这样不会导致php-fpm死掉而出现502 Bad gateway这个错误。

pm.start_servers

动态方式下的起始php-fpm进程数量

pm.min_spare_servers

动态方式下的最小php-fpm闲置进程数

pm.min_spare_servers

动态方式下的最大php-fpm闲置进程数量

三、相关命令参考

php-fpm 重启

kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`

查看php-fpm进程数量

ps aux | grep -c php-fpm

查看内存占用情况

free

倒序查看内存详细占用情况

top ————> M

参考:

http://blog.csdn.net/pzqingchong/article/details/53379772