php nginx 实时输出

PHP 里开启实时输出方法是ob_implicit_flush(),
但它大部分情况下都不管用,

因为php.ini配置里output_buffering输出缓冲大部分是On开启的,
还有zlib.output_compression也经常会被开启,

除了 PHP 这一层,还有 Nginx 的缓冲设置proxy_buffering,和压缩gzip也大都是开启的。
为了一两个页面的需求,修改整个服务器的网站配置,恐怕没有人会做这种选择。

这里推荐一下简单的方法:

set_time_limit(0);
ob_end_clean();
ob_implicit_flush();

header('X-Accel-Buffering: no'); // 关键是加了这一行。

echo '现在是:'.date('H:i:s').'<br>';
sleep(5);
echo '五秒后:'.date('H:i:s');

使用systemctl设置Nginx、PHP、Mysql开机启动

CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,而systemctl的使用也使得以往系统服务的/etc/init.d的启动脚本的方式就此改变,也大幅提高了系统服务的运行效率。但服务的配置和以往也发生了极大的不同,说实在的,变的简单而易用了许多。

CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,最好还是存在系统服务里面,即:/usr/lib/systemd/system目录下,每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]

我们可以使用systemctl -a来查看所有服务,如果列表里面没有Nginx,PHP、Mysql,又想借助于systemctl来进行统一管理的话,就到上述所说的/usr/lib/systemd/system目录下面创建以下文件吧

Nginx之nginx.service文件[自定义]

[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target

PHP之php.service文件[自定义]

[Unit]
Description=php
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm
ExecStop=/bin/pkill -9 php-fpm
PrivateTmp=true
[Install]
WantedBy=multi-user.target

Mysql之mysqld.service文件[安装的时候软件自动生成]

[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
Alias=mysql.service
[Service]
User=mysql
Group=mysql
#systemctl status就是根据pid来判断服务的运行状态的
PIDFile=/var/run/mysqld/mysqld.pid
# 以root权限来启动程序
PermissionsStartOnly=true
# 设置程序启动前的必要操作。例如初始化相关目录等等
ExecStartPre=/usr/bin/mysql-systemd-start pre
# 启动服务
ExecStart=/usr/bin/mysqld_safe
# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-start post
# Give up if ping don't get an answer
TimeoutSec=600
#Restart配置可以在进程被kill掉之后,让systemctl产生新的进程,避免服务挂掉
Restart=always
PrivateTmp=false

上述文件创建完成后,只要使用systemctl enable 命令就可以将所编写的服务添加至开机启动了。例如:

#将php服务添加至开机启动。执行enable命令后,会自动创建一个软链接/etc/systemd/system/multi-user.target.wants/php.service指向此文件。
systemctl enable php.service
#查看php是否已设置为开机启动
systemctl is-enabled php.service

注意

[Unit]部分主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别

[Service]部分是服务的关键,是服务的一些具体运行参数的设置,这里 Type=forking是后台运行的形式,PIDFile为存放PID的文件路径,
ExecStart为服务的具体运行命令,ExecReload为重启命令,ExecStop为停止命令,PrivateTmp=True表示给服务分配独立的临时空间。[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

[Install]部分是服务安装的相关设置,可设置为多用户的

服务脚本按照上面编写完成后,以754的权限保存在/usr/lib/systemd/system目录下,这时就可以利用systemctl进行配置了

使用systemctl start [服务名(也是文件名)]可以测试服务是否可以成功运行,如果不能运行则可以使用systemctl status [服务名(也是文件名)]查看错误信息和其他服务信息。然后根据报错进行修改,直到可以start,如果不放心还可以测试restart和stop命令。

php7.0编译memcached扩展

场景

系统自带的memcache.so扩展只适用于系统自带的php5.3,由于生产环境的php7.0是自己编译的,所以各种扩展也要重新编译生成

php的memcache客户端扩展有两种

1. memcache扩展

列表地址:http://pecl.php.net/package/memcache

源码包包直接下载地址:http://pecl.php.net/get/memcache

这个最新的版本也是2013年的了,下载编译了一下,报了一个 not found php_smart_str_public.h文件的错误,查看了一下 php安装目录下的 include/php/ext/standard 目录,发现这个头文件在php7.0中已经被改名为php_smart_string_public.h。由此可见这个memcache的客户端版本已太旧,不支持php7.0了

2. memcached扩展

列表地址:http://pecl.php.net/package/memcached

源码包直接下载地址:http://pecl.php.net/get/memcached

此外还有一个git维护地址 https://github.com/php-memcached-dev/php-memcached

这个包最新版本是2017年11月份更新的,是支持php7.0的。

下载流程

git clone https://github.com/php-memcached-dev/php-memcached

wget http://pecl.php.net/get/memcached

解压后将源码放入 /root 下或者 /home/用户目录下

编译流程

进入源码目录

#cd ~/php-memcached

调用phpize(根据实际phpize路径)

#/usr/local/php7.0/bin/phpize

configure目录

#./configure --with-php-config=/usr/local/php7.0/bin/php-config --with-zlib-dir

编译 & 安装

#make && make install

tips

因为memcached版本的扩展基于libmemcached,如果服务器上未安装,编译的时候会提示错误

解决方案就是yum安装即可

yum install libmemcached

yum install libmemcached-devel

成功

打开 php安装目录/lib/php/extensions/no-debug-zts-*/即可看到memcached.so扩展

然后再php.ini配置文件加载即可

Jenkins-发布php代码

1、安装插件

需要安装Git plugin和Publish Over SSH插件
系统管理–插件管理–可选插件里搜索安装,安装完后需要重启Jenkins。
可以在安装时勾选下面的安装完后自动重启Jenkins选项,会看到以下画面:

未分类

安装完成后自动刷新,需要重新登录

2、配置密钥对

需要在插件管理里配置Publish Over SSH,并在管理主机上生成密钥对

首先,利用ssh-keygen工具来生成密钥对:ssh-keygen -t rsa

[root@elk-test1 .jenkins]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  #密钥存放位置,默认回车
Enter passphrase (empty for no passphrase):  #密码,直接回车表示为空
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
20:05:8f:9f:f5:8e:53:36:d5:ae:3f:5c:b3:2c:f3:2d root@elk-test1
The key's randomart image is:
+--[ RSA 2048]----+
|    ...          |
|     +       .   |
|    o o .   . .  |
|     o + . . .   |
|      o S =   .  |
|         = . . ..|
|        o . ....o|
|         .   +Eo.|
|              =+.|
+-----------------+

其次,在系统管理–系统设置中,拉取到最下面位置填写以下信息:

未分类

  • Jenkins SSH Key:Jenkins ssh密码
  • Passphrase:设置的文件密码
  • Path to key:密钥文件路径
  • key:直接填写私钥内容即id_rsa的内容

我们在此直接将私钥的内容直接填写到key栏里。

高级选项中:

  • Name 远程主机名称
  • Hostname 远程主机IP
  • Username 登录用户
  • Remote Directory 远程连接目录

SSH Servers中:

指的是Jenkins需要发布包的远程机器,需要将公钥复制一份在远程机器上,以供Jenkins来连接它

在172.16.16.201的/root/.ssh/下创建文件:authorized_keys,将Jenkins上生成的id_rsa.pub的内容拷贝进去:

vim authorized_keys

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxA4lH50gkIRrr0kSf7qEXYbt/vPC83zdfaXb+qkWyZ4bUzpulp2
fCms70OL8BIKBXVcYxVjZVPnm0zINijX07ChjlAxL8yhVAUcUqoKTyy2mQIW5cm6mYzutmHBXNNHlFEzYeylKcE/L1
qHvrt2aBuP7D2LmdOU+dF4TdmRrUOoeuXbuz8xVSoT5qorQhhMSJbhAtm9UZK+sHXqW7Uf3+b5YxZkEh6Zpyd+MbzB
LILfw668CFwi1wYU4Fq7iR/Wycd/dIvYzGUrr+Fcisl8hHO5aKZXBFK5DsgvhQR8BqNmYsaHROzLLEOwU8kXvC2ZNq
SAtnAU9KA5edBX+bipnz root@elk-test1

在SSH Servers的高级选项卡里,需要填写连接用户的密码

未分类

然后点击”Test Cofiguration“,测试连接,会提示”Success” ,然后保存提交即可。

如果有多个主机,则继续添加。也可以 添加本机进去。

3. 创建任务

未分类

开始创建任务,输入任务名称,选择“构建一个自由风格的软件项目”

未分类

在源码管理栏目里,输入测试的(代码所在仓库,svn、git、gitlab均可)git项目地址:

未分类

以下留空,因为我们要发布的内容不需要解压编译安装等进一步的操作:

未分类

首先需要选择构建步骤,因为我们是通过插件Publish Over SSH来构建发布php,所以,此处选择Send files or execute commands over SSH。

未分类

填写构建信息:

未分类

在高级设置里的其他细节设置暂且忽略;在Add Transfer Set中可以添加更多的传输信息。

有多个远程主机需要发布,则Add Server更多主机信息。

填写完成后就可以“保存”。

4. 开始构建

选择刚刚添加的任务,点击“立即构建”开始构建

未分类

进入构建任务的输出控制台,查看构建进度:

未分类

在172.16.16.201远程发布的sever上查看项目是否发布过来,并且修改了属组

[root@test02 .ssh]# cd /tmp/jenkins_php/
[root@test02 jenkins_php]# ll
total 136
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D11Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D12Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D13Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D14Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D15Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D17Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D18Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D19Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D20Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D21Z
drwxr-xr-x 2 root root  4096 Jan 15 10:43 D22Z
-rw-r--r-- 1 root root 18044 Jan 15 10:43 LICENSE
-rw-r--r-- 1 root root   419 Jan 15 10:43 README.md
-rw-r--r-- 1 root root 66243 Jan 15 10:43 习题答案.txt

至此,简单的Jenkins发布php代码就实验完成了。

mysql慢查询和php-fpm慢日志

MySQL慢查询

在web开发中,我们经常会写出一些SQL语句,一条糟糕的SQL语句可能让你的整个程序都非常慢,超过10秒一般用户就会选择关闭网页,如何优化SQL语句将那些运行时间 比较长的SQL语句找出呢?MySQL给我们提供了一个很好的功能,那就是慢查询!所谓的慢查询就是通过设置来记录超过一定时间的SQL语句!

PHP-FPM慢日志

php-fpm慢日志slowlog设置可以让开发者很好的查找哪些php进程速度过慢而导致的网站问题,让开发者方便的找到问题的所在。该方法同样适用于排查nginx的500、502问题根源,当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。

MySQL慢查询的不足

  • MySQL5.0版本, long_query_time时间粒度不够细,最小值为1秒。对于高并发性能的网页脚本而言,1秒出现的意义不大。即出现1秒的查询比较少。直到mysql5.1.21才提供更细粒度的long_query_time设定.

  • 不能将服务器执行的所有查询记录到慢速日志中。虽然MySQL普通日志记录了所有查询,但是它们是解析查询之前就记录下来了。这意味着普通日志没办法包含诸如执行时间,锁表时间,检查行数等信息。

  • 如果开启了log_queries_not_using_indexes选项,slow query日志会充满过多的垃圾日志记录,这些快且高效的全表扫描查询(表小)会冲掉真正有用的slow queries记录。比如select * from category这样的查询也会被记录下来。

1、如何开启慢查询?  

首先我们先查看MYSQL服务器的慢查询状态是否开启.

mysql>show variables like '%quer%';

    
开启慢查询非常简单, 操作如下:

方法一

vi  /etc/my.cnf       注:my.cnf是mysql的配置文件

      
在mysqld下方加入慢查询的配置语句(一定要在[mysqld]的下方加入)

[mysqld]

    log-slow-queries = /var/lib/mysql/mysql-slow.log

    long_query_time = 1

保存退出   重启mysql

log-slow-queries : 代表MYSQL慢查询的日志存储目录, 此目录文件一定要有写权限。

long_query_time: sql最长执行时间。

方法二

在mysql命令行下执行如下操作:

set global slow_query_log=ON;

未分类

set global long_query_time=1;

未分类

测试

1、查看生成的慢日志记录 此时是空的没有记录

cat mysql-slow.log 

未分类
        
2、执行一条超过设置时间的sql语句 在查看是否被记录

如:select sleep(1); 再去查看慢日子记录

未分类

到此mysql慢查询就OK了。

2、 如何开启php-fpm慢日志?

php-fpm.conf的配置文件中有一个参数request_slowlog_timeout是这样描述的:

未分类 

当request_slowlog_timeout 设为一个具体秒时request_slowlog_timeout =5,表示如果哪个脚本执行时间大于5秒,会记录这个脚本到慢日志文件中

request_slowlog_timeout =0表示关闭慢日志输出。

慢日志文件位置默认在php的安装目录下的log文件夹中,可以通过修改slowlog = log/$pool.log.slow参数来指定。

php-fpm慢日志的例子,慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长。

request_slowlog_timeout 和 slowlog需要同时设置,开启request_slowlog_timeout的同时需要开启 slowlog

慢日志路径需要手动创建 (slowlog)

具体开启步骤如下:

未分类

结束。

linux的php-fpm的pool、慢执行日志、进程管理及open_basedir介绍

php-fpm的pool

Nignx可以配置多个虚拟主机,php-fpm同样也支持配置多个pool,每一个pool可以监听一个端口,也可以监听一个socket。

php-fpm配置说明:

和LAMP不同的是,在LNMP架构中,php-fpm作为独立的一个服务存在,既然是独立服务,那么它必然有自己的配置文件。php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf,它同样也支持include语句,类似于nginx.conf里面的include。

1. 编辑配置文件

[root@gary-tao ~]# cd /usr/local/php-fpm/etc/
[root@gary-tao etc]# ls
pear.conf  php-fpm.conf  php-fpm.conf.default  php.ini
[root@gary-tao etc]# cat php-fpm.conf
[global]
pid = /usr/local/php-fpm/var/run/php-fpm.pid
error_log = /usr/local/php-fpm/var/log/php-fpm.log
[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
[root@gary-tao etc]# vim php-fpm.conf  

//增加一个以下配置:

include = etc/php-fpm.d/*.conf

//include的这一行比较特殊,请注意等号后面的路径,必须写上etc目录,然后需要创建配置文件目录和子配置文件。

编辑好后把php-fpm.conf配置文件里的www以下pool删除,只留下[global]部分

未分类

2. 创建php-fpm.d目录及目录下文件

[root@gary-tao etc]# mkdir php-fpm.d
[root@gary-tao etc]# cd php-fpm.d
[root@gary-tao php-fpm.d]# vim www.conf
[root@gary-tao php-fpm.d]# vim aming.conf
[root@gary-tao php-fpm.d]# ls
aming.conf  www.conf

//两个文件分别增加内容如下:

[www]
listen = /tmp/php-fcgi.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

[aming.com]
listen = /tmp/aming.sock
listen.mode = 666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024

3. 如何把两个站点隔开

  • 原有站点test.com.conf配置如下:

未分类

  • 增加一个aaa.com.conf站点信息,操作如下:
[root@gary-tao php-fpm.d]# cd /usr/local/nginx/conf/vhost/
[root@gary-tao vhost]# ls
aaa.com.conf  ld.conf  proxy.conf  ssl.conf  test.com.conf
[root@gary-tao vhost]# vim aaa.com.conf 

增加如下配置内容:

location ~ .php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/aming.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
    }

未分类

4. 测试语法

[root@gary-tao etc]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jan-2018 16:49:00] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

5. 重启php-fpm

[root@gary-tao etc]# /etc/init.d/php-fpm restart  //或/etc/init.d/php-fpm reload
Gracefully shutting down php-fpm . done
Starting php-fpm  done

6. 查看php-fpm启动状态

输入ps aux |grep php-fpm查看,显示的就有两个pool

未分类

php-fpm慢执行日志

通过php-fpm的慢执行日志,我们可以非常清晰地了解到PHP的脚本哪里执行时间长,它可以定位到具体的行。

1. 编辑配置文件

[root@gary-tao vhost]# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf //针对www文件做一个测试

增加如下内容:

request_slowlog_timeout = 1  //超过一秒中就会记录日志
slowlog = /usr/local/php-fpm/var/log/www-slow.log  //日志存放的路径

1. 测试语法

[root@gary-tao vhost]# /usr/local/php-fpm/sbin/php-fpm -t
[09-Jan-2018 19:15:14] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful

2. 重启php-fpm

[root@gary-tao vhost]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

3. 配置nginx的虚拟主机test.com.conf,把unix:/tmp/php-fcgi.sock改为unix:/tmp/www.sock

4. 编写测试脚本

[root@gary-tao php-fpm.d]# vim /data/wwwroot/test.com/sleep.php

增加如下配置内容:

<?php
echo "test slow log";
sleep(2);
echo "done";
?>

5. 使用curl做测试

[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php -I  //访问的时候出现500,说明有语法错误。 
HTTP/1.1 500 Internal Server Error
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 11:23:17 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

报错处理:

  • 进入vim /usr/local/php-fpm/etc/php.ini

  • 找到display_error,改为On,然后访问有错误主就会有输出信息

未分类

  • 记得reload重新加载配置文件

  • 测试出报错信息,因符号问题导致。

[root@gary-tao php-fpm.d]# /etc/init.d/php-fpm reload
Reload service php-fpm  done
[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/sleep.php
<br />
<b>Parse error</b>:  syntax error, unexpected 'slow' (T_STRING), expecting ',' or ';' in <b>/data/wwwroot/test.com/sleep.php</b> on line <b>2</b><br />
  • 重新去更改配置文件vim /data/wwwroot/test.com/sleep.php的符号问题

  • 查看慢执行日志

[root@gary-tao php-fpm.d]# cat /usr/local/php-fpm/var/log/www-slow.log  //慢执行日志里指出了哪个脚本运行慢,也指出了是哪一行执行慢 

[09-Jan-2018 19:39:54]  [pool www] pid 81864
script_filename = /data/wwwroot/test.com/sleep.php
[0x00007f5987a07290] sleep() /data/wwwroot/test.com/sleep.php:3
[root@gary-tao php-fpm.d]# cat /data/wwwroot/test.com/sleep.php 
<?php 
echo "test slow log";
sleep(2);       //这个脚本超过1秒
echo "done";
?>

定义open_basedir

open_basedir的目的就是安全,只要在对应的Nginx虚拟主机配置文件中调用对应的pool,就可以使用open_basedir来物理隔离多个站点,从而达到安全目的。

1. 配置虚拟主机文件

[root@gary-tao php-fpm.d]# vim /usr/local/php-fpm/etc/php-fpm.d/www.conf 

增加如下配置内容:

php_admin_value[open_basedir]=/data/wwwroot/test.com:/tmp/

2. 使用curl测试

[root@gary-tao php-fpm.d]# curl -x127.0.0.1:80 test.com/3.php -I  //正常访问
HTTP/1.1 200 OK
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 12:32:50 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

3. 配置错误日志路径测试

  • 增加错误路径
[root@gary-tao php-fpm.d]# vim /usr/local/php-fpm/etc/php.ini //增加错误日志路径及定义日志级别,如下图

未分类

未分类

  • 进入到www.conf配置文件里面把test.com改为aming.com,再次测试,
    查看错误日志

  • 查看错误日志

[root@gary-tao php-fpm.d]# grep error_log /usr/local/php-fpm/etc/php.ini  //查看日志路径
; server-specific log, STDERR, or a location specified by the error_log
; Set maximum length of log_errors. In error_log information about the source is
;error_log = php_errors.log
;error_log = syslog
error_log = /usr/local/php-fpm/var/log/php_errors.log
; OPcache error_log file name. Empty string assumes "stderr".
;opcache.error_log=
[root@gary-tao php-fpm.d]# ls /usr/local/php-fpm/var/log/
php-errors.log  php-fpm.log  www-slow.log

[root@gary-tao php-fpm.d]# ls /usr/local/php-fpm/var/log/ //查看日志路径是否存在
php-fpm.log  www-slow.log
[root@gary-tao php-fpm.d]# touch /usr/local/php-fpm/var/log/php_errors.log  //手动建立一个日志文件
[root@gary-tao php-fpm.d]# chmod 777 /usr/local/php-fpm/var/log/php_errors.log  //更改成所有权限,防止不能写入日志
[root@gary-tao php-fpm.d]# !curl
curl -x127.0.0.1:80 test.com/3.php -I
HTTP/1.1 404 Not Found
Server: nginx/1.12.1
Date: Tue, 09 Jan 2018 13:05:05 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.6.30

[root@gary-tao php-fpm.d]# cat /usr/local/php-fpm/var/log/php_errors.log  //因为open_basedir限制的地址写错了,所有就会报错,访问出现404
[09-Jan-2018 13:05:05 UTC] PHP Warning:  Unknown: open_basedir restriction in effect. File(/data/wwwroot/test.com/3.php) is not within the allowed path(s): (/data/wwwroot/aming.com:/tmp/) in Unknown on line 0
[09-Jan-2018 13:05:05 UTC] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on lin

php-fpm进程管理

未分类

  1. pm = dynamic //定义php-fpm的子进程启动模式,dynamic为动态进程管理,一开始只启动少量的子进程,根据实际需求,动态地增加或者减少子进程,最多不会超过pm.max_children定义的数值。另外一种模式是static,这种模式下子进程数量由pm.max_children决定,一次性启动这么多,不会减少也不会增加。

  2. pm.max_children = 50 //最大子进程数,ps aux可以查看

  3. pm.start_servers = 20 //针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程服务时产生的子进程数量。

  4. pm.min_spare_servers = 5 //针对dynamic模式,定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。

  5. pm.max_spare_servers = 35 //针对dynamic模式,定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。

  6. pm.max_requests = 500 //针对dynamic模式,定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。

CentOS Linux 6 / 7 离线编译安装 PHP 7

安装

1、先去官网下载最新版的 PHP:

http://php.net

未分类

目前 PHP 7.2 只是第一个版本( PHP 7.2.0 ),我们目前安装的是 PHP 7.1.12 这个较为稳定的版本。如下图所示,复制 PHP 的 tar.gz 包的下载链接:

未分类

2、进入你的 CentOS ,先使用 yum 安装 wget(如果已经安装过,可忽略这步):

[root@host ~]# yum -y install wget

3、Ricky 个人是喜欢把一些临时文件放到 /tmp 目录下,所以进入 /tmp 目录,使用 wget 命令把 PHP 的 tar.gz 包下载到这里,然后解压:

[root@host ~]# cd /tmp
[root@host tmp]# wget http://cn.php.net/distributions/php-7.1.12.tar.gz
[root@host tmp]# tar -zxvf php-7.1.12.tar.gz

4、在进行编译安装之前,还要先安装有关于 PHP 的依赖包:

[root@host tmp]# yum install -y libxml2-devel libtool* curl-devel libjpeg-devel libpng-devel freetype-devel

5、还要再编译安装一个名为 libmcrypt 的包:

[root@host tmp]# wget https://svwh.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz
[root@host tmp]# tar -zxvf libmcrypt-2.5.8.tar.gz 
[root@host tmp]# cd libmcrypt-2.5.8
[root@host libmcrypt-2.5.8]# ./configure && make && make install

6、进入第 3 步解压出来的 php-7.1.12 文件夹,在这里执行编译安装操作:

[root@host libmcrypt-2.5.8]# cd ../php-7.1.12
[root@host php-7.1.12]# ./configure --prefix=/usr/local/php-7.1.12 --enable-fpm --enable-opcache --with-config-file-path=/usr/local/php-7.1.12/etc --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-static --enable-sockets --enable-wddx --enable-zip --enable-calendar --enable-bcmath --enable-soap --with-zlib --with-iconv --with-freetype-dir --with-gd --with-jpeg-dir --with-xmlrpc --enable-mbstring --with-sqlite3 --with-curl --enable-ftp --with-mcrypt --with-openssl --disable-safe-mode --with-gettext
[root@host php-7.1.12]# make && make install

7、设置一个软链接:

[root@host php-7.1.12]# cd /usr/local/
[root@host local]# ln -s php-7.1.12/ php

8、添加 PHP 命令到环境变量:

[root@host local]# vi /etc/profile

键入大写字母 G 定位到最后一行,再键入小写字母 o 进入编辑模式,将以下配置复制粘贴进最后一行:

export PATH=$PATH:/usr/local/php/bin

按一次 ESC 键退出编辑模式,然后键入 “ :wq ” 保存并退出。要使改动立即生效,请执行以下命令:

[root@host local]# ./etc/profile

[root@host local]# source /etc/profile

如需查看环境变量,请执行以下命令:

[root@host local]# echo $PATH

如需查看 PHP 版本,请执行以下命令:

[root@host local]# php -v
PHP 7.1.12 (cli) (built: Dec 14 2017 15:45:28) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

9、复制配置文件和 PHP 的启动脚本,再把 PHP 的启动脚本添加到开机自启动(还要给 php-fpm 和 rc.local 文件添加可执行权限),最后执行 PHP 的启动脚本即可:

(1)复制配置文件和 PHP 的启动脚本:
[root@host local]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
[root@host local]# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
[root@host local]# cp /tmp/php-7.1.12/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm

(2)给 php-fpm 和 rc.local 文件添加可执行权限:
[root@host local]# chmod +x /etc/init.d/php-fpm
[root@host local]# chmod +x /etc/rc.d/rc.local
[root@host local]# chmod +x /etc/rc.local

(3)把 PHP 的启动脚本添加到开机自启动:
[root@host local]# echo "/etc/init.d/php-fpm start" >> /etc/rc.local

(4)执行 PHP 的启动脚本:
[root@host local]# /etc/init.d/php-fpm start

10、现在 php-7.1.12 和 libmcrypt-2.5.8 这两个文件夹可以删除了:

[root@host local]# cd /tmp
[root@host tmp]# rm -rf php-7.1.12/
[root@host tmp]# rm -rf libmcrypt-2.5.8/

至此,安装完成。

疑问及如何升级到更新版本的 PHP

为什么要设置这个软链接?主要是为了方便升级和记录当前 PHP 的版本号。具体请参见该篇文章 https://ccie.lol/knowledge-base/linux-centos-install-tomcat/ 的 “ 疑问及如何升级到更新版本的 Tomcat ” 部分。

测试

在代码根目录新建一个 index.php 的文本文件,文件内容为:

<?php
phpinfo();
?>

若 PHP 配置成功,浏览器打开该页面将会显示以下内容:

未分类

使用 Docker 搭建 Gitlab + Jenkins + SonarQube 的 PHP 持续集成环境

对于开源 PHP 项目,现在比较成熟的一套持续集成方案是使用 Github + TravisCI + StyleCI + Scrutinizer + coveralls,不过这套方案如果想要用于私有项目的话就抓狂了,个个要买套餐,其中很多还不便宜。而且对于公司内使用的项目来说,内部搭建的 Gitlab 方案更为常见,对于这种情况,我们可以使用 Gitlab + Jenkins + SonarQube 来进行代替。

安装 SonarQube

$ docker pull postgres

$ docker run --name db -e POSTGRES_USER=sonar -e POSTGRES_PASSWORD=sonar -d postgres

$ docker pull sonarqube

$ docker run --name sq --link db -e SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar -p 9000:9000 -d sonarqube

执行完毕上面的命令后通过浏览器进入 SonarQube,默认用户名和密码都是 admin,进去后会有一段引导,里面会让你生成一个 access token,这个后面的配置 Jenkins 时会用到。

如果没有记下来的话,可以点右上角的用户头像里面的 My Account > Security 标签中可以生成一个新的。

配置 Jenkins

Jenkins 需要在全局的 系统设置 里面添加 SonarQube Server,填下对应的访问地址和上一步获取的 access token 即可。服务器地址填写 localhost 可能会有问题,填 ip 会比较好些。

然后需要在 系统管理 的 Global Tool Configuration 菜单中配置 SonarQube Scanner 安装,这个直接选择自动安装就好了,十分方便。

这两步配好之后就到对应的项目配置中添加构建步骤,下拉选择 Execute SonarQube Scanner,然后对于 2.1 版本以上的 SonarQube Scanner 就只需要配置 Analysis properties 这一项就可以了,比较常用的参数包括 sonar.projectKey (用来确定 该项目在 SonarQube 中叫什么名字) 和 sonar.sources=(用来指定需要扫描的目录)。

配完之后选择构建即可,可以去当前构建的 Console Output 里面查看有没有报错,正常执行完成的话,在 SonarQube 项目面板中就可以看到一个新增的命名为配置的 sonar.projectKey 的 项目了。

注意点

  • SonarPHP 自定义检查规则需要用 java 来写扩展,比较新的版本内置了 psr2 的规则基本够用,内置的 Quality Profiles 是可以复制一个出来进行自定义的
  • Sonar 嗅探出的一些问题可能实际上并没有什么影响,比如变量名中含有 ‘pwd’ 等,如果原本使用方式确实合理则可适当忽略

PHP实现git部署

背景

小公司上班,原先的系统还在使用传统的ftp上传部署,部署太麻烦,也不好管控线上的代码.在网上找了下git部署的教程.一路跟着下来,碰到了不少坑.现在把整个过程发出来,希望可以帮助到大家.

账号相关

useradd -m git    //新增git账号

ssh-keygen        //密钥生成,如果已经有了可略过

su git       //切换至git账号

cd ~   //切换到git账号根目录

mkdir .ssh    //创建.ssh目录

cat /密钥存放目录/xxx.pub >> ~/.ssh/authorized_keys     //设置公钥

此处一定要注意权限问题,否则密钥登入无法生效,各文件夹对应的权限如下

.ssh文件夹权限   700
id_rsa   600
id_rsa.pub   644
authorized_keys  600

文件权限设置

将git与站点运行nginx或者apache的用户放同一用户组,如www
vim /etc/passwd 找到git账号与www账号,将git账号的组标识变更为与www组标识一致
站点所属者设置为git,用户组设置为 www //假设nginx与git 都归属于www用户组
目录权限设置775 ,文件权限设置为664

仓库代码

服务器端

cd 站点目录
git init   //初始化目录

git配置

git config receive.denyCurrentBranch ignore     //设置仓库接受代码提交

设置sudo免密

vim /etc/sudoers

# Defaults        secure_path 中若没有你要的命令,要注意添加
# php的命令默认需要在 secure_path最后面添加    :/usr/local/php/bin"
在  root ALL=(ALL) ALL 下面一行添加
git ALL=(ALL) NOPASSWD:ALL     
# 保存退出   ,这样针对laravel 要重启队列命令就可以使用了.
# sudo php artisan queue:restart

钩子设置

cd .git/hooks    //切换至站点钩子目录
touch post-receive    //创建接收提交时钩子
// 钩子文件内容如下:

#!/bin/sh
# 设置账号创建文件的默认权限
umask 002   
unset GIT_DIR
cd ..
git checkout -f
# 执行PHP钩子逻辑
/usr/bin/curl http(s)://域名/钩子文字位置/hook.php

# 如果有使用laravel队列则需要重启队列进程,让新代码生效
# sudo php artisan queue:restart
exit 0

hook.php内容

<?php
/**
 * git上传执行钩子
 */
//TODO 安全限制
//TODO 其他钩子行为
// 清除opcache
if (version_compare(PHP_VERSION, '5.5.0', '>=')) {
    opcache_reset();
}

增加钩子可执行权限

chmod a+x .git/hooks/post-receive

本地代码

git remote add 远程仓库名称 ssh://git@IP地址:/站点目录    //添加远程仓库
git push 远程仓库名称  master 

特别注意

用户上传的图片目录一定要做好文件忽视动作,否则有可能在清除未追踪文件时将此部分文件删除,造成灾难性结果。

docker搭建nginx+php-fpm开发环境

一、创建目录

mkdir -p /data1/www/app;
mkdir -p /data1/www/logs;
mkdir -p /data1/www/php;
mkdir -p /data1/www/nginx;
mkdir -p /data1/www/php/fpm.d;
mkdir -p /data1/www/nginx/vhost;
chmod 777 -R /data1/www;

添加项目:

vim /data1/www/app/www.mydemo.com/index.php
<?php
    echo 22;
    phpinfo();

二、启动容器

docker run -it --name=web_container --net=host -v /data1:/data1 centos /bin/bash;
yum -y install wget;
yum -y install initscripts;

三、安装nginx

依赖说明:

  • zlib: Nginx提供gzip模块,需要zlib库支持。
  • openssl: Nginx提供SSL功能
  • pcre: 支持地址重写rewrite功能

依赖安装:

yum -y install zlib zlib-devel openssl openssl-devel pcre-devel;

依赖检测:

rpm -qa  zlib;
rpm -qa  openssl;
rmp -qa  pcre;

nginx安装

wget http://nginx.org/download/nginx-1.10.3.tar.gz
tar -zxvf nginx-1.10.3.tar.gz;
cd nginx-1.10.3;
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_flv_module;
make && make install;

创建用户

groupadd  www
useradd -r -g www  www

在宿主机上修改添加配置文件: vim /data1/www/nginx/mime.types

types {
    text/html                             html htm shtml;
    text/css                              css;
    text/xml                              xml;
    image/gif                             gif;
    image/jpeg                            jpeg jpg;
    application/javascript                js;
    application/atom+xml                  atom;
    application/rss+xml                   rss;

    text/mathml                           mml;
    text/plain                            txt;
    text/vnd.sun.j2me.app-descriptor      jad;
    text/vnd.wap.wml                      wml;
    text/x-component                      htc;

    image/png                             png;
    image/tiff                            tif tiff;
    image/vnd.wap.wbmp                    wbmp;
    image/x-icon                          ico;
    image/x-jng                           jng;
    image/x-ms-bmp                        bmp;
    image/svg+xml                         svg svgz;
    image/webp                            webp;

    application/font-woff                 woff;
    application/java-archive              jar war ear;
    application/json                      json;
    application/mac-binhex40              hqx;
    application/msword                    doc;
    application/pdf                       pdf;
    application/postscript                ps eps ai;
    application/rtf                       rtf;
    application/vnd.apple.mpegurl         m3u8;
    application/vnd.ms-excel              xls;
    application/vnd.ms-fontobject         eot;
    application/vnd.ms-powerpoint         ppt;
    application/vnd.wap.wmlc              wmlc;
    application/vnd.google-earth.kml+xml  kml;
    application/vnd.google-earth.kmz      kmz;
    application/x-7z-compressed           7z;
    application/x-cocoa                   cco;
    application/x-java-archive-diff       jardiff;
    application/x-java-jnlp-file          jnlp;
    application/x-makeself                run;
    application/x-perl                    pl pm;
    application/x-pilot                   prc pdb;
    application/x-rar-compressed          rar;
    application/x-redhat-package-manager  rpm;
    application/x-sea                     sea;
    application/x-shockwave-flash         swf;
    application/x-stuffit                 sit;
    application/x-tcl                     tcl tk;
    application/x-x509-ca-cert            der pem crt;
    application/x-xpinstall               xpi;
    application/xhtml+xml                 xhtml;
    application/xspf+xml                  xspf;
    application/zip                       zip;

    application/octet-stream              bin exe dll;
    application/octet-stream              deb;
    application/octet-stream              dmg;
    application/octet-stream              iso img;
    application/octet-stream              msi msp msm;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document    docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet          xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation  pptx;

    audio/midi                            mid midi kar;
    audio/mpeg                            mp3;
    audio/ogg                             ogg;
    audio/x-m4a                           m4a;
    audio/x-realaudio                     ra;

    video/3gpp                            3gpp 3gp;
    video/mp2t                            ts;
    video/mp4                             mp4;
    video/mpeg                            mpeg mpg;
    video/quicktime                       mov;
    video/webm                            webm;
    video/x-flv                           flv;
    video/x-m4v                           m4v;
    video/x-mng                           mng;
    video/x-ms-asf                        asx asf;
    video/x-ms-wmv                        wmv;
    video/x-msvideo                       avi;
}

新增fast_cig: vim /data1/www/nginx/fastcgi_params

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

vim /data1/www/nginx/nginx.conf

user  www;
worker_processes  5;

error_log  logs/nginx-error.log;
pid        nginx/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    client_body_temp_path /tmp/client_body_temp_path;
    fastcgi_temp_path /tmp/fastcgi_temp_path;
    proxy_temp_path /tmp/proxy_temp_path;
    scgi_temp_path /tmp/scgi_temp;
    uwsgi_temp_path /tmp/uwsgi_temp_path;

    sendfile        on;
    keepalive_timeout  65;
    gzip  on;
    include vhost/*.conf;
}

配置文件检测

/usr/local/nginx/sbin/nginx -c /data1/www/nginx/nginx.conf -p /data1/www -t

新增项目配置: vim /data1/www/nginx/vhost/mydemo.com.conf

server {
         listen       80 ;
         root /data1/www/app/www.mydemo.com/;
         server_name  www.mydemo.com mydemo.com;

         access_log   logs/nginx_www.mydemo.com-access_log  main;
         error_log    logs/nginx_www.mydemo.com-error_log;
         rewrite  "^/(.*)" /index.php/$1 last;

         location  / {
                   proxy_ignore_client_abort on;
                   fastcgi_pass 127.0.0.1:9023;
                   fastcgi_index index.php;
                   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                   #fastcgi_param  SCRIPT_URL         $script_uri;
                   #fastcgi_param  REQUEST_ID           $request_uid;
                   include fastcgi_params;
         }
}

启动nginx:

/usr/local/nginx/sbin/nginx -c /data1/www/nginx/nginx.conf -p /data1/www

平滑重启

Kill -HUP  ${nginx_pid}

四、安装php-fpm

yum -y install gd-devel zlib-devel libjpeg-devel libpng-devel libiconv-devel freetype-devel libxml2 libxml2-devel openssl openssl-devel curl-devel libxslt-devel libmcrypt-devel mhash mcrypt
wget http://am1.php.net/get/php-7.2.0.tar.bz2/from/this/mirror ;
tar -jxvf mirror;
cd php-7.2.0;
./configure  --prefix=/usr/local/php --enable-fpm --enable-cli --enable-pcntl --with-curl;
make && make install; 

新增配置文件: vim /data1/www/php/php-fpm.conf

[global]
pid = php/php-fpm.pid
error_log = logs/php-fpm.log
emergency_restart_threshold = 20
emergency_restart_interval = 60s
process_control_timeout = 0
process.max = 2048
daemonize = yes
rlimit_files = 65535
rlimit_core = 67108864
events.mechanism = epoll

; auto include phpfpm configure
include = php/fpm.d/*.conf

vim /data1/www/php/php.ini

[PHP]
engine = On
short_open_tag = Off
precision = 14
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = -1
disable_functions =
disable_classes =
zend.enable_gc = On
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting = E_ALL
display_errors = On
display_startup_errors = On
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
max_file_uploads = 20
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
[CLI Server]
cli_server.color = On
[Date]
[filter]
[iconv]
[intl]
[sqlite3]
[Pcre]
[Pdo]
[Pdo_mysql]
pdo_mysql.cache_size = 2000
pdo_mysql.default_socket=
[Phar]
[mail function]
SMTP = localhost
smtp_port = 25
mail.add_x_header = On
[ODBC]
odbc.allow_persistent = On
odbc.check_persistent = On
odbc.max_persistent = -1
odbc.max_links = -1
odbc.defaultlrl = 4096
odbc.defaultbinmode = 1
[Interbase]
ibase.allow_persistent = 1
ibase.max_persistent = -1
ibase.max_links = -1
ibase.timestampformat = "%Y-%m-%d %H:%M:%S"
ibase.dateformat = "%Y-%m-%d"
ibase.timeformat = "%H:%M:%S"
[MySQLi]
mysqli.max_persistent = -1
mysqli.allow_persistent = On
mysqli.max_links = -1
mysqli.cache_size = 2000
mysqli.default_port = 3306
mysqli.default_socket =
mysqli.default_host =
mysqli.default_user =
mysqli.default_pw =
mysqli.reconnect = Off
[mysqlnd]
mysqlnd.collect_statistics = On
mysqlnd.collect_memory_statistics = On
[OCI8]
[PostgreSQL]
pgsql.allow_persistent = On
pgsql.auto_reset_persistent = Off
pgsql.max_persistent = -1
pgsql.max_links = -1
pgsql.ignore_notice = 0
pgsql.log_notice = 0
[bcmath]
bcmath.scale = 0
[browscap]
[Session]
session.save_handler = files
session.use_strict_mode = 0
session.use_cookies = 1
session.use_only_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 1440
session.referer_check =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.sid_length = 26
session.trans_sid_tags = "a=href,area=href,frame=src,form="
session.sid_bits_per_character = 5
[Assertion]
zend.assertions = 1
[COM]
[mbstring]
[gd]
[exif]
[Tidy]
tidy.clean_output = Off
[soap]
soap.wsdl_cache_enabled=1
soap.wsdl_cache_dir="/tmp"
soap.wsdl_cache_ttl=86400
soap.wsdl_cache_limit = 5
[sysvshm]
[ldap]
ldap.max_links = -1
[dba]
[opcache]
[curl]
[openssl]

新增项目配置:

vim /data1/www/php/fpm.d/mydemo.com.conf

 [mydemo.com]
user = www
group = www
listen = 127.0.0.1:9023
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 512
pm.start_servers = 5
pm.min_spare_servers = 4
pm.max_spare_servers = 64
pm.max_requests = 1500

;pm.status_path = /dpool_monitor


slowlog = logs/$pool-slow_log
request_slowlog_timeout = 2

request_terminate_timeout = 30
catch_workers_output = no
security.limit_extensions = ""

access.log=logs/php-fpm_$pool.access.log
access.format = "%R - %u %t "%m %r%Q%q" %s %f %{mili}d %{kilo}M %C%%"

启动命令:

/usr/local/php/sbin/php-fpm -c /data1/www/php/php.ini  -y /data1/www/php/php-fpm.conf  -p /data1/www

平滑重启:

kill -USR2  fpm-pid