php-fpm搭建及加固
php-fpm安装
nginx本身不能处理PHP,它只是个web服务器,当接收到请求后,如果是php请求,则发给php解释器处理,并把结果返回给客户端。 nginx一般是把请求发fastcgi管理进程处理,fascgi管理进程选择cgi子进程处理结果并返回被nginx。
那什么又是cgi呢?
CGI(Common Gateway Interface)。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的规程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
简单的说,就是:cgi就是专门用来和web 服务器打交道的。web服务器收到用户请求,就会把请求提交给cgi程序(php的fastcgi),cgi程序根据请求提交的参数作应处理(解析php),然后输出标准的html语句返回给web服服务器,再返回给客户端,这就是普通cgi的工作原理。
安装
yum安装
yum install php php-mysql php-fpm
安装成功。
php-fpm配置文件路径:/etc/php-fpm.d/www.conf
php配置文件路径:/etc/php.ini
说明:
php-mysql,这个是后续链接mysql需要的
修改php配置
php.ini
将 ;cgi.fix_pathinfo=1 改为 cgi.fix_pathinfo=1 只要把前面的分号去掉就可以了;
fix_pathinfo是用来干嘛的呢?
为CGI提供真正的PATH_INFO / PATH_TRANSLATED支持,不打开,nginx是解析不了路径的。
www.conf
将 user = apache group = apache
改为 user = nginx group = nginx
nginx配置php-fpm解析php请求
/etc/nginx/conf.d目录下新增php-fpm.conf,内容配置如下
server {
listen ;
server_name 192.168.189.134;
location ~ .php$ {
try_files $uri =;
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
这个配置的意思是 在浏览器中访问的.php文件,实际读取的是 $document_root(网站根目录)下的.php文件 -- 也就是说当访问127.0.0.1/index.php的时候,需要读取网站根目录下面的index.php文件,如果没有配置这一配置项时,nginx不回去网站根目录下访问.php文件,所以返回空白
SCRIPT_FILENAME这个参数在fastcgi_params也有,默认是$fastcgi_script_name,可以看出只是添加了网站根目录
启动php-fpm
开启自启动
sudo systemctl enable php-fpm
测试是否设置成功
/usr/share/nginx/html目录下新建phpinfo.php文件,内容如下:
<?php
echo 6666666666;
phpinfo();
?>
重启nginx
sudo systemctl restart nginx
访问http://192.168.189.134/phpinfo.php

可以访问,已经成功安装了。
加固
php-fpm降权
修改/etc/php-fpm.d/www.conf
将 user = apache group = apache
改为 user = nobody group = nobody
php启动安全模式
PHP 环境提供的安全模式是一个非常重要的内嵌安全机制,PHP 安全模式能有效控制一些 PHP 环境中的函数(例如system()函数,官网有个列表),对大部分的文件操作函数进行权限控制,同时不允许对某些关键文件进行修改(例如 /etc/passwd)。默认的 php.ini 配置文件并没有启用安全模式
php5.4以前的版本修改/etc/php.ini
safe_mode = on
php5.4就移除安全模式了,下面是官网的说明

下面是安全模式下的功能
用户组安全
当您启用安全模式后,如果safe_mode_gid选项被关闭,PHP 脚本能够对文件进行访问,且相同用户组的用户也能够对该文件进行访问。
因此,建议您将该选项设置为关闭状态:
safe_mode_gid = off
安全模式下执行程序主目录
如果启用了安全模式后,想要执行某些程序的时候,可以指定需要执行程序的主目录,例如:
safe_mode_exec_dir = /usr/bin
一般情况下,如果不需要执行什么程序,建议您不要指定执行系统程序的目录。您可以指定一个目录,然后把需要执行的程序拷贝到这个目录即可,例如:
safe_mode_exec_dir = /temp/cmd
但是,更推荐您不要执行任何程序。这种情况下,只需要将执行目录指向网页目录即可:
safe_mode_exec_dir = /usr/www
安全模式下包含文件
如果您需要在安全模式下包含某些公共文件,您只需要修改以下选项即可:
safe_mode_include_dir = /usr/www/include/
一般情况下,PHP 脚本中包含的文件都是在程序已经写好的,可以根据您的具体需要进行设置。
设置 doc_root
修改/etc/php.ini
doc_root = /usr/share/nginx/hml/

上图是修改后的,访问的phpinfo.php不在这个目录下,所以不被解析并访问
查看日志,现在不能打开这个php,起到限制php的执行目录,doc_root目录以外的php无法被解析

修改为正确的路径
doc_root = /usr/share/nginx/html/
重启pgp-fpm

可以被解析并访问
控制 PHP 脚本能访问的目录
修改/etc/php.ini
open_basedir = /usr/share/nginx/htm/
访问的phpinfo.php不在上面的目录下,则禁止访问

修改为正确路径则访问成功

关闭危险函数
如果您启用了安全模式,那么可以不需要设置函数禁止,但为了安全考虑,还是建议您进行相关设置。例如,您不希望执行包括system()等在内的执行命令的 PHP 函数,以及能够查看 PHP 信息的phpinfo()等函数,那么您可以通过以下设置禁止这些函数:
disable_functions=phpinfo
上面做测试禁用了phpinfo,重启php-fpm
phpinfo.php里面使用了这个函数,我们看下是否能执行

没有php的信息,函数被禁用了。
关闭 PHP 版本信息在 HTTP 头中的泄露
暴露给黑客的信息越少,攻击成功就会越高,php版本也是一样的,不知道版本就不能针对具体版本进行研究入侵了。
修改/etc/php.ini文件如下
expose_php=off
重启php-fpm

我们验证是否设置成功了,图片可看出生效了,没有了php版本信息
错误信息控制
display_errors = Off
error_reporting = E_WARNING & E_ERROR
错误日志
一般 PHP 环境在没有连接到数据库或者其他情况下会有错误提示信息,错误信息中可能包含 PHP 脚本当前的路径信息或者查询的 SQL 语句等信息,这类信息如果暴露给黑客是不安全的,因此建议您禁止该错误提示:
修改/etc/php.ini
display_errors = Off
#如果您确实要显示错误信息,一定要设置显示错误信息的级别。例如,只显示警告以上的错误信息:
error_reporting = E_WARNING & E_ERROR
打开错误信息提示

关闭错误信息提示

对比上面的错误信息,打开状态直接暴露了phpinfo.php的路径了,给黑客很好的信息了。
关闭注册全局变量
在 PHP 环境中提交的变量,包括使用 POST 或者 GET 命令提交的变量,都将自动注册为全局变量,能够被直接访问。这对您的服务器是非常不安全的,因此建议您将注册全局变量的选项关闭,禁止将所提交的变量注册为全局变量。
register_globals = off
注意: 该选项参数在 PHP 5.3 以后的版本中已被移
防护SQL注入攻击
php5.4以前的版本,有一个自动将进入 PHP 脚本的数据进行转义的过程。
当打开时,所有的 '(单引号),"(双引号),*\*(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 作用完全相同。最好在编码时不要转义而在运行时根据需要而转义,被称为魔术引号(Magic Quote),不过php5.4开始就被移除了.
php5.4以前的版本修改配置/etc/php.ini
magic_quotes_gpc = On
参考资料
https://help.aliyun.com/knowledge_detail/50218.html
https://www.php.net/manual/zh/security.php
http://www.ttlsa.com/safe/php-environment-security-reinforcement-configuration/
https://cloud.tencent.com/developer/article/1042833
php-fpm搭建及加固的更多相关文章
- nginx搭建及加固
系统使用的是centos7 Nginx安装及配置 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务 安装 我是用的环境是ce ...
- LNMP搭建(CentOS 6.3+Nginx 1.2.0+PHP 5.3.15(fpm)+ MySQL 5.5.35)
Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 ...
- lamp环境搭建之配置apache与fpm方式的php
配置apache-2.4.9与fpm方式的php-5.4.26 一.apache.MySQL的安装参考<编译安装lamp环境> http://blog.csdn.net/reblue520 ...
- Ubuntu系统下lnmp环境搭建和Nginx多站点配置
最近需要使用Ubuntu作为服务器搭建Lnmp环境,顺便将操作过程写下来,与大家分享.如有不足之处,欢迎大家提出不同意见.(本文默认读者已经熟悉相关linux命令的使用,比如创建文件和文件夹,编辑文件 ...
- 利用Bootstrap快速搭建个人响应式主页(附演示+源码)
1.前言 我们每个程序员都渴望搭建自己的技术博客平台与他人进行交流分享,但使用别人的博客模板没有创意.做网站后台的开发人员可能了解前端,可是自己写一个不错的前端还是很费事的.幸好我们有Bootstra ...
- Nginx搭建https服务器
HTTPS简介 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单来讲就是HTTP的安全版.即H ...
- 基于ubuntu 14搭建nginx+php+mysql环境
基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境, 以下全部命令行操作: 1 由于需要大量的权限操作,方便起见临时提升权限,使用root账号 sudo su ...
- 在阿里云ECS上搭建LEMP环境
在阿里云买ECS的时候选择自己习惯的镜像系统,我一般都是使用Linux Ubuntu,所以,以下的配置都是在Ubuntu 14.04稳定支持版的环境中搭建Linux+Nginx+Mysql+PHP环境 ...
- 搭建LNAMP环境(四)- 源码安装PHP7
上一篇:搭建LNAMP环境(三)- 源码安装Apache2.4 一.安装PHP7 1.yum安装编译php需要的包 yum -y install libxml2 libxml2-devel curl- ...
随机推荐
- 使用 joblib 对 Pandas 数据进行并行处理
使用 joblib 对 Pandas 数据进行并行处理 如果需要对一个很大的数据集进行操作,而基于一列数据生成新的一列数据可能都需要耗费很长时间. 于是可以使用 joblib 进行并行处理. 假设我们 ...
- Linux进程信号
信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能终止 17 STOP 无条件停止运行,但不终止 1 ...
- 手写k-means算法
作为聚类的代表算法,k-means本属于NP难问题,通过迭代优化的方式,可以求解出近似解. 伪代码如下: 1,算法部分 距离采用欧氏距离.参数默认值随意选的. import numpy as np d ...
- AS将一个项目导入到另一个项目中
需求:有项目A,B.需要将B集成到A中,作为A的一个模块. 方法: 1.将B工程的app下面的build.gradle文字中 apply plugin: 'com.android.applicati ...
- 生成一个水平+垂直居中的div
这是前端布局经常用到的布局方式,水平垂直居中:面试也经常会问到. 一. 绝对定位实现居中 注意:使用绝对定位布局的时候,外层元素必须也设置有position属性,具体设置为什么值看具体情况.只要不是s ...
- xshell设置
登录脚本: #定义rz,sz自动下载路径 #保持窗口活动状态, 空闲时每120秒发送一个回车
- aws和ufile挂载数据盘EBS
aws的话挂载的ebs需要格式化,参考:https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/ebs-using-volumes.html ...
- Linux 目录与路径
树形目录结构 Linux 是以树形目录结构的形式来构建整个系统的. 从逻辑上来说Linux的磁盘是挂载在目录上的,每一个目录能使用本地磁盘分区或网络上的文件系统,比如利用网络文件系统(Network ...
- (转)C++ bitset用法
今天做题发现要用到bitset,找到一篇介绍的巨好的文章. 转载自:https://www.cnblogs.com/magisk/p/8809922.html C++的 bitset 在 bitset ...
- POJ - 1815 Friendship (最小点割集)
(点击此处查看原题) 题目分析 题意:有n个人,编号记为1~n,n个人之间可能有人可以互相联系,如果A能和B联系,那么至少满足这两种情况之一:(1)A知道B的电话(2)A可以和C联系,并且C可以和B联 ...