PHP 部署
官方文档
https://www.php.net/manual/zh/index.php
repo 源安装
#前期准备
#单独安装在一台服务器 php01 172.16.1.41
#统一用户
groupadd -g666 www
useradd -g666 -u666 -Ms /sbin/nologin www
#建立目录并授权
mkdir /data/code
chown -R www.www /data
#站点目录要和nginx服务器那边统一
1、#配置第三方源
vim /etc/yum.repos.d/php.repo
[php-webtatic]
name = PHP Repository
baseurl = http://us-east.repo.webtatic.com/yum/el7/x86_64/
gpgcheck = 0
2、#卸载已安装低版本的php
yum remove php-mysql-5.4 php php-fpm php-common
3、#安装PHP 7.1版本【安装会出一些问题,记住没有安装的包,重新单独安装,保存好所有安装包利于下次使用】
yum -y install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-gd php71w-mcrypt php71w-mbstring php71w-pdo php71w-xml php71w-fpm php71w-mysqlnd php71w-opcache php71w-pecl-memcached php71w-pecl-redis php71w-pecl-mongodb
------------介绍------------
php71w # PHP
php71w-cli # PHP客户端
php71w-common # 依赖-
php71w-devel # 依赖-
php71w-embedded # 依赖-
php71w-gd # 依赖-
php71w-mcrypt # 依赖-加密
php71w-mbstring # 依赖-
php71w-pdo # 依赖-
php71w-xml # 依赖-翻译 xml
php71w-fpm # 管理进程
php71w-mysqlnd # 连接数据库
php71w-opcache # 缓存工具提速用的【7版本才有的】
php71w-pecl-memcached # 连接 Memcache
php71w-pecl-redis # 连接 Redis
php71w-pecl-mongodb # 连接 MongoDB
------------介绍------------
#上传准备好的安装包后用yum统一安装
yum -y localinstall *.rpm
#简单配置
1、配置php主配置文件
vim /etc/php.ini
upload_max_filesize = 200M # 799行 修改上传文件大小
post_max_size = 200M # 656行 修改请求限制大小,2个配一样
date.timezone = Asia/Shanghai # 877行 多数这样设置表示中国时区
#date.timezone = PRC # 877行 如果时区不对就修改,此行默认是注释掉的
2、配置修改用户
vim /etc/php-fpm.d/www.conf
user = www
group = www
listen = 172.16.1.41:9000 #监听地址+端口,供Nginx服务器访问
listen.allowed_clients = 172.16.1.31 #用来返回数据Nginx服务器的ip地址
#启动
systemctl enable php-fpm
systemctl start php-fpm
systemctl status php-fpm
# PHP 的 systemd启动文件
[root@php01 ~]# cat /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=notify
PIDFile=/var/run/php-fpm/php-fpm.pid
EnvironmentFile=/etc/sysconfig/php-fpm
ExecStart=/usr/sbin/php-fpm --nodaemonize --fpm-config /etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
源码安装
PHP 8 【未完成】
# 参考 https://blog.csdn.net/weixin_46115601/article/details/120986923
# 下载
wget https://www.php.net/distributions/php-8.0.13.tar.gz
#解压
tar xf php-8.0.13.tar.gz
#安装依赖【这是7的依赖,8使用不一样会报错,需要一步步实验出来】
yum -y install autoconf automake bison boost-devel bzip2 bzip2-devel cmake curl curl-devel e2fsprogs e2fsprogs-devel freetype freetype-devel gcc gcc-c++ gd gd-devel glib2 glib2-devel glibc glibc-devel gmp gmp-devel jemalloc-devel krb5 krb5-devel libcurl libcurl-devel libicu-devel libidn libidn-devel libjpeg libjpeg-devel libmcrypt libmcrypt-devel libpng libpng-devel libtool libxml2 libxml2-devel libxslt libxslt-devel mcrypt mhash make ncurses ncurses-devel nss_ldap openldap openldap-devel openldap-clients openldap-devel openldap-servers openssl openssl-devel pcre pcre-devel re2c readline readline-devel sqlite-devel zlib zlib-devel
wget http://mirror.centos.org/centos/7/cloud/x86_64/openstack-queens/Packages/o/oniguruma-6.7.0-1.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/cloud/x86_64/openstack-queens/Packages/o/oniguruma-devel-6.7.0-1.el7.x86_64.rpm
yum -y install oniguruma*
#准备预编译库文件
cp -frp /usr/lib64/libldap* /usr/lib/
#预编译
[root@php01 php-8.0.13]# ./configure --prefix=/usr/local/php-8.0.13 --with-fpm-group=www --with-fpm-user=www --with-config-file-path=/usr/local/php/etc --enable-bcmath --enable-fpm --enable-ftp --enable-intl --enable-mbregex --enable-mbstring --enable-mysqlnd --enable-mysqlnd-compression-support --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-xml --with-curl --with-gettext --with-ldap=shared --with-mhash --with-mysqli=mysqlnd --with-openssl --without-gdbm --with-pdo-mysql=mysqlnd --with-pear --with-zlib
#编译
make && make install
#配置软链接及准备配置文件
ln -s /usr/local/php-8.0.13 /usr/local/php
#复制配置文件
cp /root/php-8.0.13/php.ini-development /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
PHP 7
#前期准备
#单独安装在一台服务器 php01 172.16.1.41
1.统一用户
groupadd -g666 www
useradd -g666 -u666 -Ms /sbin/nologin www
2.建立目录并授权
mkdir /data/code
chown -R www.www /data
3.站点目录要和nginx服务器那边统一
#源码安装
------------------- PHP 7 -------------------
#下载,建议用下载工具下载会快一些
wget https://www.php.net/distributions/php-7.2.8.tar.gz
#解压
tar xf php-7.2.8.tar.gz
#安装依赖
yum -y install autoconf automake bison boost-devel bzip2 bzip2-devel cmake curl curl-devel e2fsprogs e2fsprogs-devel freetype freetype-devel gcc gcc-c++ gd gd-devel glib2 glib2-devel glibc glibc-devel gmp gmp-devel jemalloc-devel krb5 krb5-devel libcurl libcurl-devel libicu-devel libidn libidn-devel libjpeg libjpeg-devel libmcrypt libmcrypt-devel libpng libpng-devel libtool libxml2 libxml2-devel libxslt libxslt-devel mcrypt mhash make ncurses ncurses-devel nss_ldap openldap openldap-devel openldap-clients openldap-devel openldap-servers openssl openssl-devel pcre pcre-devel re2c readline readline-devel sqlite-devel zlib zlib-devel
#准备预编译库文件
cp -frp /usr/lib64/libldap* /usr/lib/
#预编译
./configure --prefix=/usr/local/php-7.2.8 \
--with-fpm-group=www \
--with-fpm-user=www \
--with-config-file-path=/usr/local/php/etc \
--enable-bcmath \
--enable-fpm \
--enable-ftp \
--enable-inline-optimization \
--enable-intl \
--enable-maintainer-zts \
--enable-mbregex \
--enable-mbstring \
--enable-mysqlnd \
--enable-mysqlnd-compression-support \
--enable-opcache \
--enable-pcntl \
--enable-shmop \
--enable-soap \
--enable-sockets \
--enable-sysvsem \
--enable-xml \
--enable-zip \
--with-curl \
--with-freetype-dir \
--with-gd \
--with-gettext \
--with-iconv-dir \
--with-jpeg-dir \
--with-ldap=shared \
--with-libmbfl \
--with-libxml-dir \
--with-mhash \
--with-mysqli=mysqlnd \
--with-openssl \
--without-gdbm \
--with-pdo-mysql=mysqlnd \
--with-pear \
--with-png-dir \
--with-xmlrpc \
--with-zlib
#编译
make && make install
#配置软链接及准备配置文件
ln -s /usr/local/php-7.2.8 /usr/local/php
#复制配置文件
cp /root/php-7.2.8/php.ini-development /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
------------------- PHP 7 -------------------
#编辑 systemd 配置文件
vim /usr/lib/systemd/system/php-fpm.service
[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target
[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
#设置 PHP 启动及开机自启
systemctl enable php-fpm.service
systemctl restart php-fpm.service
systemctl status php-fpm
php 优化
/etc/php.ini
php程序配置管理文件,主要调整日志、文件上传、禁止危险函数、关闭版本号显示等,PHP启动之后打开程序管理用的。
/etc/php-fpm.conf
进程管理配置文件,负责管理PHP启动、关闭
/etc/php-fpm.d/www.conf
用户配置文件,配置用户,连接nginx,调整php-fpm进程数量,配置慢日志
# php优化总结
1.php.ini
打开日志、禁止函数(研发沟通)
2.php-fpm.conf
打开日志、日志级别
3.php-fpm.d/www.conf
进程管理,日志查询
4.php慢日志
用来查看PHP跑什么程序的时候慢了,可以针对性的调优,一定要开启,很重要
5.php状态页面,在web主机配置文件
开启状态页面,可以用来监控php状态
1.php.ini 优化配置
#设置配置文件 php.ini
vim /usr/local/php/etc/php.ini
expose_php = Off # 369行 网页响应头中不显示PHP版本信息
short_open_tag = On # 192行 允许短标签 <? ?>
# 192行 开启这个才可以使用 <?= 以代替 <? echo
max_execution_time = 300 # 378行 php-fpm进程最长执行时间,超出后将强行终止
max_input_time = 300 # 388行 对通过POST、GET以及PUT方式接收数据时间进行限制
memory_limit = 128M # 399行 内存大小,根据需要调整,默认128M
upload_max_filesize = 200M # 818行 修改上传文件大小
post_max_size = 200M # 665行 上传文件大小限制,根据需要调整,默认8M
date.timezone = Asia/Shanghai # 932行 时区,默认被注释了
#;;;;;;;;;;;;;;;;;
# Error logging ; #错误日志设置
#;;;;;;;;;;;;;;;;;
display_error = Off # 屏幕不显示错误日志
error_reporting = E_ALL # 记录PHP的每个错误
log_errors = On # 默认开启错误日志
error_log = /var/log/php_error.log # PHP程序出错的错误日志写入的位置
date.timezone = Asia/Shanghai # 调整时区,默认PRC
#;;;;;;;;;;;;;;;
# File Uploads ; #文件上传设置
#;;;;;;;;;;;;;;;
file_uploads = On # 允许文件上传
upload_max_filesize = 300M # 允许上传文件的最大大小
post_max_size = 300M # 允许客户端单个POST请求发送的最大数据
max_file_uploads = 20 # 允许同时上传的文件的最大数量
memory_limit = 128M # 限制 PHP 进程最大使用内存,下面网页里说明的很好
# https://blog.csdn.net/lxw1844912514/article/details/106596352
#会话共享
[Session]
session.save_handler = redis # 使用redis做session共享
session.save_path = "tcp://172.16.1.61:6379" # redis IP与端口
#参考
原文链接:https://blog.csdn.net/loophome/article/details/78604986
request_terminate_timeout 适用于,当max_execution_time由于某种原因无法终止脚本的时候,会把这个php-fpm请求干掉
web请求php执行时间受到2方面控制,
一个是php.ini的max_execution_time(要注意的是sleep,http请求等待响应的时间是不算的,这里算的是真正的执行时间)
一个是php-fpm request_terminate_timeout 设置,这个算的是请求开始n秒
我的理解就是 PHP 处理用户请求的进程会受到
/usr/local/php/etc/php.ini 中的 max_execution_time
/usr/local/php/etc/php-fpm.d/www.conf 中的 request_terminate_timeout
2个设置的限制,谁的限制时间短,谁先终止进程
2.php.ini 禁止函数
phpinfo()
功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。
危险等级:中
passthru()
功能描述:允许执行一个外部程序并回显输出,类似于 exec()。
危险等级:高
exec()
功能描述:允许执行一个外部程序(如 UNIX Shell 或 CMD 命令等)。
危险等级:高
system()
功能描述:允许执行一个外部程序并回显输出,类似于 passthru()。
危险等级:高
chroot()
功能描述:可改变当前 PHP 进程的工作根目录,仅当系统支持 CLI 模式
PHP 时才能工作,且该函数不适用于 Windows 系统。
危险等级:高
scandir()
功能描述:列出指定路径中的文件和目录。
危险等级:中
chgrp()
功能描述:改变文件或目录所属的用户组。
危险等级:高
chown()
功能描述:改变文件或目录的所有者。
危险等级:高
shell_exec()
功能描述:通过 Shell 执行命令,并将执行结果作为字符串返回。
危险等级:高
proc_open()
功能描述:执行一个命令并打开文件指针用于读取以及写入。
危险等级:高
proc_get_status()
功能描述:获取使用 proc_open() 所打开进程的信息。
危险等级:高
error_log()
功能描述:将错误信息发送到指定位置(文件)。
安全备注:在某些版本的 PHP 中,可使用 error_log() 绕过 PHP safe mode,
执行任意命令。
危险等级:低
ini_alter()
功能描述:是 ini_set() 函数的一个别名函数,功能与 ini_set() 相同。
具体参见 ini_set()。
危险等级:高
ini_set()
功能描述:可用于修改、设置 PHP 环境配置参数。
危险等级:高
ini_restore()
功能描述:可用于恢复 PHP 环境配置参数到其初始值。
危险等级:高
dl()
功能描述:在 PHP 进行运行过程当中(而非启动时)加载一个 PHP 外部模块。
危险等级:高
pfsockopen()
功能描述:建立一个 Internet 或 UNIX 域的 socket 持久连接。
危险等级:高
syslog()
功能描述:可调用 UNIX 系统的系统层 syslog() 函数。
危险等级:中
readlink()
功能描述:返回符号连接指向的目标文件内容。
危险等级:中
symlink()
功能描述:在 UNIX 系统中建立一个符号链接。
危险等级:高
popen()
功能描述:可通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。
危险等级:高
stream_socket_server()
功能描述:建立一个 Internet 或 UNIX 服务器连接。
危险等级:中
putenv()
功能描述:用于在 PHP 运行时改变系统字符集环境。在低于 5.2.6 版本的 PHP 中,可利用该函数
修改系统字符集环境后,利用 sendmail 指令发送特殊参数执行系统 SHELL 命令。
危险等级:高
禁用方法如下:
打开/etc/php.ini文件,
# 309行 php禁止危险函数执行(取决于实际情况,需要和开发沟通【pfsockopen是持续连接,而fsockopen不是】如果开发要用就不能添加)
disable_functions = chown,chmod,pfsockopen,phpinfo
# 查找到 disable_functions = ,添加需禁用的函数名
disable_functions = phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen
disable_functions = passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,escapeshellcmd,dll,popen,disk_free_space,checkdnsrr,checkdnsrr,getservbyname,getservbyport,disk_total_space,posix_ctermid,posix_get_last_error,posix_getcwd, posix_getegid,posix_geteuid,posix_getgid, posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid, posix_getppid,posix_getpwnam,posix_getpwuid, posix_getrlimit, posix_getsid,posix_getuid,posix_isatty, posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid, posix_setpgid,posix_setsid,posix_setuid,posix_strerror,posix_times,posix_ttyname,posix_uname
#通配
disable_functions = passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru
3.php-fpm.conf 优化配置
# 进程管理配置文件 /etc/php-fpm.conf 负责管理PHP启动、关闭
vim /usr/local/php/etc/php-fpm.conf
# fpm配置
include=/usr/local/php/etc/php-fpm.d/*.conf
# 全局配置(php-fpm.conf)
[global]
pid = /var/log/php-fpm/php-fpm.pid #pid文件存放的位置
error_log = /var/log/php-fpm/php-fpm.log #PHP启动报错的错误日志存放的位置
log_level = warning #默认日志级别notice,
# alert【警报】, error【错误】, warning【警告】, notice【通知】, debug【调试】
rlimit_files = 65535 #php-fpm进程能打开的文件数
events.mechanism = epoll #使用epoll事件模型处理请求
4.www.conf 优化配置
# 用户配置文件
vim /usr/local/php/etc/php-fpm.d/www.conf
user = www
group = www
listen = 172.16.1.41:9000 # 36 行 监听地址+端口供Nginx服务器访问
listen.allowed_clients = 172.16.1.31 # 62 行 Nginx服务器的ip地址 允许访问FastCGI进程的IP,any不限制
;listen = 0.0.0.0:9000 #监听所有来访tcp的9000端口
#以下根据需要调整
pm = dynamic # 102行 static(静态)或者 dynamic(动态)调节php-fpm的进程数
pm.max_children = 180 # 113行 静态方式下开启的php-fpm进程数量
pm.start_servers = 50 # 118行 动态方式下的起始php-fpm进程数量
pm.min_spare_servers = 50 # 123行 动态方式下的最小php-fpm进程数量
pm.max_spare_servers = 180 # 128行 动态方式下的最大php-fpm进程数量
pm.max_requests = 1500 # 每一个进程能响应的请求数
pm.process_idle_timeout = 15s; # 超时没有请求就释放进程
pm.status_path = /phpfpm_status # 开启php的状态页面
# 日志相关
php_flag[display_errors] = off #是否在屏幕显示日志信息
php_admin_value[error_log] = /var/log/phpfpm_error.log #错误日志路径
php_admin_flag[log_errors] = on #是否开启错误日志
# 慢日志【用来查看PHP跑什么程序的时候慢了,可以针对性的调优,一定要开启,很重要】
;request_terminate_timeout = 120 # 340行 默认被注释了
slowlog = var/log/php_slow.log # 323行 慢日志路径
;request_slowlog_timeout = 50 # 329行 0 表示关闭慢日志输出,50 表示大于50秒会被记入慢日志
request_slowlog_timeout = 5s # php脚本执行超过5秒的文件
#慢日志示例
[21-Nov-2013 14:30:38] [pool www] pid 11877
script_filename = /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php
[0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2
#解释:fyzb.php执行的时候超过了时间,该进程的PID是 11877
# 实战 4核16G、4核32G
[root@nginx ~]# cat /etc/php-fpm.conf
[global]
pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log
log_level = warning
rlimit_files = 655350
events.mechanism = epoll
[root@nginx ~]# cat /etc/php-fpm.d/www.conf
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 512
pm.start_servers = 32
pm.min_spare_servers = 32
pm.max_spare_servers = 64
pm.process_idle_timeout = 15s;
pm.max_requests = 2048
pm.status_path = /phpfpm_status
#php-fpm模块错误日志
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/php/php-www.log
php_admin_flag[log_errors] = on
#php慢查询日志
request_slowlog_timeout = 5s
slowlog = /var/log/php-slow.log
配置nginx开启php-fpm监控模块
#修改php-fpm配置【phpfpm_status】这个名字随便写
[root@web01 ~]# vim /etc/php-fpm.d/www.conf
pm.status_path = /phpfpm_status
#修改nginx配置
server {
listen 80;
server_name php.drz.com;
root /code;
location / {
index index.php index.html;
}
location /phpfpm_status {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
loca ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# Windows 解析
C:\Windows\System32\drivers\etc\hosts
10.0.0.31 php.drz.com
#访问页面
php.drz.com/phpfpm_status
#状态页面分析
[root@nginx ~]# curl http://www.drz.com/phpfpm_status
pool: www #fpm池名称,大多数为www,自己设置的
process manager: dynamic #动态管理phpfpm进程
start time: 20/Jan/2018:00:00:09 +0800 #启动时间,如果重启会发生变化
start since: 409 #php-fpm运行时间
accepted conn: 22 #当前池接受的连接数
listen queue: 0 #请求等待队列,如果这个值不为0,那么需要增加FPM的进程数量
max listen queue: 0 #请求等待队列最高的数量
listen queue len: 128 #请求等待队列的长度
idle processes: 4 #php-fpm空闲的进程数量
active processes: 1 #php-fpm活跃的进程数量
total processes: 5 #php-fpm总的进程数量
max active processes: 2 #php-fpm最大活跃的进程数量(FPM启动开始计算)
max children reached: 0 #进程最大数量限制的次数,如果数量不为0,则说明phpfpm最大进程数量过小,可以适当调整。