在CentOS 7.2上安装SuPHP的详细方法
CentOS 7上PHP默认是以apache或者nobody的身份运行的,这种方式下由于PHP运行需要的权限比较大,会有安全隐患,还可能会受到服务器其他用户影响。
SuPHP是一个apache模块,允许PHP在与Apache用户不同的Linux用户之下。 这可以提高托管网站的安全性,因为您可以在其他用户下运行每个网站的PHP脚本。 本教程介绍了从源代码安装的CentOS 7.2上的SuPHP,因为CentOS 7.2没有可用的SuPHP软件包。
先决条件
您将安装CentOS 7.2或更高版本的服务器,我将使用本教程作为我的设置的基础。 在第一章中,我将安装Apache Web服务器。 如果您已经安装了apache,请立即从第2章开始。
我的服务器将使用hostname server1.example.com和IP地址192.168.1.100。 在以下教程中将这些值替换为服务器的主机名和IP地址。
为安全起见,建议安装防火墙,如果您还没有安装防火墙,可以使用以下命令进行安装:
yum -y install firewalld
启动防火墙并使其在启动时启动。
systemctl start firewalld.service systemctl enable firewalld.service
接下来,打开您的SSH端口,以确保您能够通过SSH连接到服务器。
firewall-cmd –permanent –zone=public –add-service=ssh firewall-cmd –reload
1、安装Apache 2.4和PHP 5
Apache和PHP在CentOS基础存储库中可用,因此我们可以使用yum安装这两个软件包。
安装Apache和Aapache开发包,其中包含以后的SuPHP编译所需的文件。
yum -y install httpd httpd-devel
PHP安装(我添加了一些常用的PHP模块):
yum -y install php php-mysql php-gd php-pear php-xml php-xmlrpc php-mbstring curl
我们必须使Apache能够在引导时启动并启动服务。
systemctl start httpd.service systemctl enable httpd.service
我们必须打开HTTP(80)和HTTPS(443)端口,使得Web服务器可以从其他计算机访问。 执行以下命令配置防火墙。
firewall-cmd –permanent –zone=public –add-service=http firewall-cmd –permanent –zone=public –add-service=https firewall-cmd –reload
2、安装SuPHP
在此步骤中,我们将从源代码编译SuPHP。 安装开发工具来设置所需的构建链。
yum -y groupinstall ‘Development Tools’
并且wget可以下载源文件和nano编辑器。
yum -y install wget nano
下载SuPHP源tar.gz存档并解压缩它。
cd /usr/local/src wget http://suphp.org/download/suphp-0.7.2.tar.gz tar zxvf suphp-0.7.2.tar.gz
CentOS 7使用Apache 2.4,所以我们必须补丁suphp,然后我们可以编译它aganst Apache。 补丁应用如下:
wget -O suphp.patch https://lists.marsching.com/pipermail/suphp/attachments/20130520/74f3ac02/attachment.patch patch -Np1 -d suphp-0.7.2 < suphp.patch cd suphp-0.7.2 autoreconf -if
[root @ server1 suphp-0.7.2]#autoreconf -if libtoolize:将辅助文件放在AC_CONFIG_AUX_DIR,`config’中。 libtoolize:复制文件`config / ltmain.sh’ libtoolize:考虑将`AC_CONFIG_MACRO_DIR([m4])’添加到configure.ac和 libtoolize:重新运行libtoolize,以保持正确的libtool宏in-tree。 libtoolize:考虑在Makefile.am中的ACLOCAL_AMFLAGS中添加`-I m4’。 configure.ac:9:warning:AM_INIT_AUTOMAKE:不支持双参数和三参数形式。 有关更多信息,请参阅: configure.ac:9:http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation configure.ac:24:安装’config / config.guess’ configure.ac:24:安装’config / config.sub’ configure.ac:9:安装’config / install-sh’ configure.ac:9:安装’config / missing’ src / Makefile.am:安装’config / depcomp’ [root @ server1 suphp-0.7.2]#
autoreconf命令应用补丁,现在我们可以如下配置新的源。 注意: configure命令是一行!
./configure –prefix=/usr/ –sysconfdir=/etc/ –with-apr=/usr/bin/apr-1-config –with-apache-user=apache –with-setid-mode=owner –with-logfile=/var/log/httpd/suphp_log
然后编译并安装SuPHP。
make make install
然后通过添加一个新的suphp.conf文件将suPHP模块添加到Apache配置中。
nano /etc/httpd/conf.d/suphp.conf
具有以下内容。
LoadModule suphp_module modules/mod_suphp.so
…并创建文件/etc/suphp.conf如下:
nano /etc/suphp.conf
[global] ;Path to logfile logfile=/var/log/httpd/suphp.log ;Loglevel loglevel=info ;User Apache is running as webserver_user=apache ;Path all scripts have to be in docroot=/ ;Path to chroot() to before executing script ;chroot=/mychroot ; Security options allow_file_group_writeable=true allow_file_others_writeable=false allow_directory_group_writeable=true allow_directory_others_writeable=false ;Check wheter script is within DOCUMENT_ROOT check_vhost_docroot=true ;Send minor error messages to browser errors_to_browser=false ;PATH environment variable env_path=/bin:/usr/bin ;Umask to set, specify in octal notation umask=0077 ; Minimum UID min_uid=100 ; Minimum GID min_gid=100 [handlers] ;Handler for php-scripts x-httpd-suphp=”php:/usr/bin/php-cgi” ;Handler for CGI-scripts x-suphp-cgi=”execute:!self”
最后,我们重新启动Apache:
systemctl restart httpd.service
3、使用SuPHP配置Apache Vhost
在本章中,我将介绍如何在单独的用户下运行PHP的apache中添加虚拟主机。 我将使用域名www.example.com作为网站,PHP将作为用户和组“ web1 ”运行,网站的文档根目录是/var/www/example.com
首先,添加一个新的用户和组“web1”。
useradd web1
添加网站根目录。
mkdir /var/www/example.com chown web1:web1 /var/www/example.com
现在在apache conf.d目录中添加虚拟主机配置文件。
nano /etc/httpd/conf.d/example.com.conf
为此内容:
<VirtualHost *>
DocumentRoot /var/www/example.com
ServerName example.com
ServerAdmin webmaster@example.com
<FilesMatch ".+.ph(p[345]?|t|tml)$">
SetHandler None
</FilesMatch>
<IfModule mod_suphp.c>
suPHP_Engine on
<FilesMatch ".php[345]?$">
SetHandler x-httpd-suphp
</FilesMatch>
suPHP_AddHandler x-httpd-suphp
</IfModule>
</VirtualHost>
在ServerName和ServerAdmin行中用自己的域替换域名。
然后重新启动apache来应用配置更改。
systemctl restart httpd.service
4、测试SuPHP设置
在本章中,我将向您展示在本网站测试PHP的几种方法。 首先,我将创建一个使用phpinfo()函数来显示PHP是否正常工作的文件,并且现在是否以CGI模式运行。
用nano创建一个info.php文件:
nano /var/www/example.com/info.php
并将以下行添加到新文件中:
<?php phpinfo();
然后将文件的所有者更改为web1用户和组。
chown web1:web1 /var/www/example.com/info.php
在网络浏览器中打开文件http://example.com/info.php的URL,它将显示以下页面。
重要的是显示CGI / FastCGI的ServerAPI行。 这表明PHP是通过SuPHP而不是mod_php运行的。
现在我将测试PHP是否运行在正确的用户(web1)下。 SuPHP如何知道使用哪个用户? SuPHP将PHP切换到拥有PHP脚本的用户,因此我们的Web根文件夹/var/www/example.com中的所有PHP文件都由web1用户和组拥有非常重要。
那么,如何测试PHP是否使用正确的用户? 一种方法是执行返回用户名的“whoami”命令。
我将在网站root中创建一个新脚本testuser.php:
nano /var/www/example.com/testuser.php
与此内容:
<?php system(‘whoami’);
然后将文件的所有者更改为web1用户和组。
chown web1:web1 /var/www/example.com/testuser.php
在web浏览器中打开http://example.com/testuser.php,结果应该是: web1
SuPHP被配置并作为本网站的用户执行PHP文件。 从网站目录中删除测试文件,并开始添加您的网站脚本。
5、将此CentOS 7.2服务器下载为虚拟机
此设置可用于以ova / ovf格式(与VMWare和Virtualbox兼容)的虚拟机下载,以了解用户的身份。
VM的登录详细信息
root密码是:howtoing “管理员”用户的密码是:howtoing 请在第一次登录时更改两个密码。
虚拟机的IP地址为192.168.1.100
6、链接
CentOS
Apache Web服务器
SuPHP
- 数字图像相关技术DIC分析介绍
- 3种提升云可扩展性的方法
- 用一个命令使用 Docker Compose 安装Mesos
- C语言/C加加新手入门学习经验资料分享,基础知识大汇总!
- 云数据服务蜂拥而至...好难选呀
- ASP.NET MVC的Razor引擎:View编译原理
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
- 自动驾驶车辆在2017年的七大光辉历史时刻
- 简单的实现Javascript的MVC
- 谷歌再出黑科技!人工智能模拟的人声和真人几乎难以分辨
- 【Scikit-Learn 中文文档】高斯混合模型 - 无监督学习 - 用户指南 | ApacheCN
- “E+单拼”组合域名eqi.com小六位结拍
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python爬虫入门:爬取pixiv
- Linux PID 一网打尽
- 使用libimobiledevice&ifuse提取iOS沙盒文件
- 你不知道的LinkedList(二):LinkedList的增删操作真的会比ArrayList快吗
- jupyter notebook中的魔法命令%run和%timeit
- js 常用正则
- 非常实用的 Python 技巧
- JavaScript中arguments
- js通过class name获得元素
- 基于JavaScript的rce反弹shell漏洞
- 《剑指offer》第11天:矩形覆盖
- 《剑指offer》第12天:旋转数组的最小数字
- 不同版本的Google Analytics做跨站跟踪
- 记一次 base64 图片存储引发后端查询接口性能断崖式下降问题全程解析
- JDBC+MySQL实战