02架构 08 PHP 配置

本文详细指导如何在服务器上通过yum和源码安装PHP 7.1和7.2版本,包括配置第三方源、卸载旧版本、安装关键组件,以及php.ini和php-fpm配置优化,涉及内存限制、错误处理、安全设置和性能提升。
摘要由CSDN通过智能技术生成

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最大进程数量过小,可以适当调整。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值