注:本文环境均为CentOS6。
一、Apache部分配置
Apache配置文件路径:/etc/httpd/conf/httpd.conf
Apache默认虚拟主机配置文件(WIN):/etc/httpd/conf/extra/httpd-vhosts.conf
Apache指定运行账户:
在Apache配置文件 httpd.conf
中设置User和Group。
#
# If you wish httpd to run as a different user or group, you must run
# httpd as root initially and it will switch.
#
# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User www //运行账户
Group www //账户所属组
Apache2.2虚拟主机配置模板:
NameVirtualHost *:80 //httpd.conf中配置或包含在站点配置文件中
<VirtualHost *:80> //站点域名/主机:端口
<Directory "D:/vhosts/www.test.com"> //站点根目录
Options -Indexes FollowSymLinks //不允许列出目录,详情见附文1
</Directory>
ServerAdmin admin@www.test.com //管理员邮箱
DocumentRoot "D:/vhosts/www.test.com" //站点根目录
ServerName www.test.com //站点域名
ServerAlias test12355.com www123.com //站点别名
ErrorLog logs/www.test.com-error_log //错误日志
# php_admin_value open_basedir "/www/www.test.com;/tmp;" //目录隔离,详情见附文2
</VirtualHost>
Apache2.4虚拟主机配置模板:
<VirtualHost *:80> //站点域名/主机:端口
ServerName www.test.com //站点域名
ServerAlias test12355.com www123.com //站点别名
DocumentRoot "/www/aaa/" //虚拟主机站点根目录
DirectoryIndex index.html index.php //默认首页文档
<Directory "/www/aaa/">
Options FollowSymLinks //不允许列出目录
# Options Indexes FollowSymLinks //允许列出目录
AllowOverride All
Require all granted //注意2.4和先前版本区别
</Directory>
ErrorLog logs/www.test.com-error_log //错误日志
# php_admin_value open_basedir "/www/www.test.com;/tmp;" //目录隔离,详情见附文2
</VirtualHost>
二、Nginx部分配置
Nginx配置文件路径:/etc/nginx/nginx.conf
Nginx默认站点配置文件:/etc/nginx/conf.d/default.conf
Nginx默认虚拟主机配置文件:/etc/nginx/conf.d/virtual.conf
配置Nginx运行账户及文件上传(nginx.conf):
#用户名 用户组
user www www;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
#nginx文件上传大小
client_max_body_size 50m;
#nginx文件缓存目录
client_body_temp_path /tmp/nginx_temp;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
}
Nginx虚拟主机简单配置模板:
server {
listen 80; //监听端口
server_name test.com; //绑定域名
location / {
root /www/test.com/; //站点根目录
index index.html index.htm index.php; //默认首页文件
}
}
server_name可同时指定多个,如:server_name test.com www.test.com *.test.com;
Nginx配置PHP(请先自行安装PHP):
- 配置php-fpm:
运行vi /etc/php-fpm.d/www.conf
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = nginx //配置php-fpm运行账户为nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx //配置php-fpm账户组为nginx
设置php自启动: chkconfig php-fpm on
设置nginx自启动: chkconfig php-fpm on
重新启动nginx: service nginx restart
启动php-fpm: php-fpm service php-fpm start
Nginx虚拟主机PHP配置模板:
server
{
listen 80;
#listen [::]:80;
server_name aaa.com www.aaa.com;
index index.html index.htm index.php default.html default.htm default.php;
root /www/test.com;
#error_page 404 /404.html;
location ~ [^/]\.php(/|$) {
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
#php
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#目录隔离
fastcgi_param PHP_ADMIN_VALUE "open_basedir=/wwwroot/aaa/:/tmp/:/proc/";
include fastcgi_params;
#include pathinfo.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 12h;
}
access_log /wwwroot/wwwlogs/aaa.log main;
}
附:PHP—FPM运行账户配置:
配置文件/etc/php-fpm.d/www.conf
Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache Choosed to be able to access some dir as httpd
user = www
; RPM: Keep a group allowed to write in log dir.
group = www
三、附文
附文1:Apache Options指令详解
Options指令是Apache配置文件中一个比较常见也比较重要的指令,Options指令可以在Apache服务器核心配置(server config)、虚拟主机配置(virtualhost)、特定目录配置(directory)以及.htaccess文件中使用。Options指令的主要作用是控制特定目录将启用哪些服务器特性。
- Options指令常见的配置示例代码如下:
<Directory />
#指定根目录"/"启用Indexes、FollowSymLinks两种特性
Options Indexes FollowSymLinks
AllowOverride all
Order allow,deny
Allow from all
</Directory>
Options指令的完整语法为:Options [+|-]option [[+|-]option]...
简而言之,Options指令后可以附加指定多种服务器特性,特性选项之间以空格分隔。
下面我们来看看Options指令后可以附加的特性选项的具体作用及含义(Apache配置中的内容均不区分大小写):
All
表示除MultiViews之外的所有特性。这也是Options指令的默认设置。None
表示不启用任何的服务器特性。FollowSymLinks
服务器允许在此目录中使用符号连接。如果该配置选项位于<Location>配置段中,将会被忽略。-
Indexes
如果输入的网址对应服务器上的一个文件目录,而此目录中又没有DirectoryIndex指令(例如:DirectoryIndex index.html index.php),那么服务器会返回由mod_autoindex模块生成的一个格式化后的目录列表,并列出该目录下的所有文件(如下图)。
MultiViews
允许使用mod_negotiation模块提供内容协商的"多重视图"。简而言之,如果客户端请求的路径可能对应多种类型的文件,那么服务器将根据客户端请求的具体情况自动选择一个最匹配客户端要求的文件。例如,在服务器站点的file文件夹下中存在名为hello.jpg和hello.html的两个文件,此时用户输入Http://localhost/file/hello,如果在file文件夹下并没有hello子目录,那么服务器将会尝试在file文件夹下查找形如hello.*的文件,然后根据用户请求的具体情况返回最匹配要求的hello.jpg或者hello.html。SymLinksIfOwnerMatch
服务器仅在符号连接与目标文件或目录的所有者具有相同的用户ID时才使用它。简而言之,只有当符号连接和符号连接指向的目标文件或目录的所有者是同一用户时,才会使用符号连接。如果该配置选项位于<Location>配置段中,将会被忽略。ExecCGI
允许使用mod_cgi模块执行CGI脚本。Includes
允许使用mod_include模块提供的服务器端包含功能。IncludesNOEXEC
允许服务器端包含,但禁用"#exec cmd"和"#exec cgi"。但仍可以从ScriptAlias目录使用"#include virtual"虚拟CGI脚本。
此外,比较细心的读者应该注意到,Options指令语法允许在配置选项前加上符号"+"或者"-",那么这到底是什么意思呢?
实际上,Apache允许在一个目录配置中设置多个Options指令。不过,一般来说,如果一个目录被多次设置了Options,则指定特性数量最多的一个Options指令会被完全接受(其它的被忽略),而各个Options指令之间并不会合并。但是如果我们在可选配置项前加上了符号"+"或"-",那么表示该可选项将会被合并。所有前面加有"+"号的可选项将强制覆盖当前的可选项设置,而所有前面有"-"号的可选项将强制从当前可选项设置中去除。你可以参考下面的例子:
- 示例1:
<Directory /web/file>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/file/image>
Options Includes
</Directory>
#目录/web/file/image只会被设置Includes特性
- 示例2:
<Directory /web/file>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/file/image>
Options +Includes -Indexes
</Directory>
#目录/web/file/image将会被设置Includes、FollowSymLinks两种特性
备注1:混合使用前面带"+"/"-"和前面不带"+"/"-"的同一可选项,可能会导致出现意料之外的结果。
备注2:使用-IncludesNOEXEC或-Includes时,不论前面如何设置,都会完全禁用服务器端包含。
附文2:open_basedir限制目录详解
- open_basedir介绍
前言:前些日我用lnmp一键安装包出现了open_basedir的问题,因为我把项目目录变了,所以要在的fastcgi.conf下面加上open_basedir的目录
open_basedir 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。
本指令不受安全模式打开或关闭的影响。
- open_basedir设置方法
在php.ini 加入
open_basedir="指定目录"
在程序中使用
ini_set('open_basedir', '指定目录');
但不建议使用这种方法在apache的httpd.conf中的Directory配置:
php_admin_value open_basedir "指定目录"
httpd.conf中的VritualHost:
php_admin_value open_basedir "指定目录"
nginx fastcgi.conf配置
fastcgi_param PHP_VALUE "open_basedir=指定目录"
说明:用open_basedir指定的限制实际上是前缀,不是目录名。
也就是说open_basedir=/home/fdipzone
也会允许访问/home/fdipzone_abc
,
如果要将访问限制为目录,请使用斜线结束路径名:
例如:open_basedir=”/home/fdipzone/”
如果要设置多个目录,window使用;分隔目录,Linux使用:分隔目录。
- 使用open_basedir限制目录访问
首先创建一个VirtualHost,
设置open_basedir 为/home/fdipzone/sites/in.fdipzone.com/
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /home/fdipzone/sites/in.fdipzone.com
ServerName in.fdipzone.com
php_admin_value open_basedir "/home/fdipzone/sites/in.fdipzone.com/"
<Directory "/home/fdipzone/sites/in.fdipzone.com">
allow from all Options + Indexes
</Directory>
</VirtualHost>
在上一层目录 /home/fdipzone/sites/ 中创建一个test.txt文件,在in.fdipzone.com中创建php执行以下代码:
<?php
echo file_get_contents('../test.txt');
?>
因为test.txt不在限定的目录范围内,因此php提示警告:
Warning: file_get_contents(): open_basedir restriction in effect. File(../test.txt) is not within the allowed path(s): (/home/fdipzone/sites/in.fdipzone.com/) in /home/fdipzone/sites/in.fdipzone.com/index.php on line 3
- 设置open_basedir的性能分析
open_basedir开启后会影响I/O,因为每个调用的文件都需要判断是否在限制目录内。
测试程序,读取限制目录内同一文件10000次
<?php
// 记录开始时间
$starttime = getMicrotime();
// 读取10000次文件
for($i=0; $i<10000; $i++){
file_get_contents('test.txt');
}
// 记录结束时间
$endtime = getMicrotime();
printf("run time %f ms\r\n", ((float)($endtime)-(float)($starttime))*1000);
function getMicrotime(){
list($usec, $sec) = explode(' ', microtime());
return (float)$usec + (float)$sec;
}
?>
关闭open_basedir测试:run time 137.237072 ms
打开open_basedir测试:run time 404.207945 ms
开启open_basedir后,执行时间是关闭的3倍。
总结:使用open_basedir可以限制程序可操作的目录和文件,提高系统安全性。但会影响I/O性能导致系统执行变慢,因此需要根据具体需求,在安全与性能上做平衡。