分类 "服务器" 下的文章

在 php.ini 中找到
disable_functions =

这一行,在其后面添加需要禁止的危险函数名,以英文逗号分隔
给个例子:
disable_functions = passthru,exec,system,popen,chroot,scandir,chgrp,chown,escapesh,ellcmd,escapeshellarg,shell_exec

建议在主机上禁用的函数:
disable_functions = phpinfo,set_time_limit,system,exec,shell_exec,passthru,proc_open,proc_close,proc_get_status,checkdnsrr,getmxrr,getservbyname,getservbyport,syslog,popen,show_source,highlight_file,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,socket_listen,socket_create,socket_bind,socket_accept,socket_connect,stream_socket_server,stream_socket_accept,stream_socket_client,ftp_connect,ftp_login,ftp_pasv,ftp_get,zlib.compress,gzopen,gzpassthru,gzcompress,chroot,scandir,chgrp,chown,ini_alter,ini_restore,openlog,readlink,symlink,popepassthu,stream_socket_srver,error_log,ini_set,dl,putenv,popepassthru,fsocket,fsockopen,pfsockopen

一些需要禁用的PHP危险函数

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 命令。
危险等级:高

最近服务器的phpmyadmin一直不正常,原以为配置错误,结果发现是前段时间修改disable_function引起的,

逐步比较disable_function的参数发现,原来是因为opendir,readdir,dir,chdir这4个参数引起的

禁用opendir报错如下:
phpmyadmin就会出现如下错误
phpMyAdmin-ERROR: cannot open themes folder: ./themes
Default theme pmahomme not found!
Theme original not found!
Theme not found!

但是phpspy就不能列出其他虚拟主机的目录
官方解释:http://cn.php.net/manual/zh/function.opendir.php
opendir:打开目录句柄

加上readdir
phpmyadmin首页能打开,但是不能登陆,502 Bad Gateway

phpspy此时不能列出其他虚拟主机目录

官方解释:http://cn.php.net/manual/zh/function.readdir.php
readdir — 从目录句柄中读取条目,返回目录中下一个文件的文件名

最后总结出比较安全的php.ini的disable_functions如下(服务器没用到采集):

disable_functions = exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert,chroot,getcwd,scandir,unlink,delete,rmdir,rename,chgrp,chmod,chown,fopen,copy,mkdir,file,file_get_contents,fputs,fwrite,dir

禁用这些函数,网站和phpmyadmin都正常,而且不能上传文件
利用webshell也不能查看服务器上的文件,不能删除或者修改
唯一的缺点:能够查看其他虚拟主机的目录,但是仅仅只能看看,做不了什么事情

如果服务器用到了采集,需要启用unlink和fopen,列表如下:

disable_functions = exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert,chroot,getcwd,scandir,delete,rmdir,rename,chgrp,chmod,chown,copy,mkdir,file,file_get_contents,fputs,fwrite,dir

unlink官方解释为:http://cn.php.net/manual/zh/function.unlink.php
fopen官方解释为:http://cn.php.net/manual/zh/function.fopen.php
如果需要用到采集,需要启用这几个函数:

file_get_contents,fputs,fwrite,dir

禁用的函数列表为:

disable_functions = exec,passthru,popen,proc_open,shell_exec,system,phpinfo,assert,chroot,getcwd,scandir,delete,rmdir,rename,chgrp,chmod,chown,copy,mkdir,file

如果那位有更完美的解决办法,欢迎和我联系,可以在博文结尾一起讨论!

PHP勿庸置疑是非常强大的服务器端脚本语言,但是强大的功能总是伴随着重大的危险,在这章里,你将学习到使用PHP的安全模式来阻止一些PHP潜在的危险因素。
【 安全模式 】
PHP的安全模式提供一个基本安全的共享环境,在一个有多个用户帐户存在的PHP开放的Web服务器上。当一个Web服务器上运行的PHP打开了安全模式,那么一些函数将被完全的禁止,并且会限制一些可用的功能。

[ 使用安全模式来强制限制 ]
在安全模式下,一些尝试访问文件系统的函数功能将被限制。运行Web服务器用户ID,如果想要操作某个文件,则必须拥有该文件读取或者写入的访问权限,实现这个限制功能对于PHP来说是没有问题的。
在 安全模式开启的时候,尝试读取或者写入一个本地文件的时候,PHP将检查当前访问用户是否是该目标文件的所有者。如果不是所有者,则该操作会被禁止。(写 入权限:在较低级别的文件访问权限下,可能会允许读取或者写入系统操作系统的文件,通过PHP的安全模式实现了防止你操作另外一个用户文件的操作。当然, 一个Web服务器可能能够访问一个具有全局写入权限的任意文件。)
当安全模式打开的时候,以下函数列表的功能将会受到限制:
chdir , move_uploaded_file, chgrp, parse_ini_file, chown, rmdir, copy, rename, fopen, require, highlight_file, show_source, include, symlink, link, touch, mkdir, unlink
同样的,一些PHP扩展中的函数也将会受到影响。(加载模块:在安全模式下dl函数将被禁止,如果要加载扩展的话,只能修改php.ini中的扩展选项,在PHP启动的时候加载)
在PHP安全模式打开的时候,需要执行操作系统程序的时候,必须是在safe_mode_exec_dir选项指定目录的程序,否则执行将失败。即使允许执行,那么也会自动的传递给escapeshellcmd函数进行过滤。
以下执行命令的函数列表将会受到影响:
exec, shell_exec, passthru, system, popen
另外,背部标记操作符(`)也将被关闭。
当运行在安全模式下,虽然不会引起错误,但是 putenv 函数将无效。同样的,其他一些尝试改变PHP环境变量的函数set_time_limit, set_include_path 也将被忽略。

[ 打开安全模式 ]
打开或者关闭PHP的安全模式是利用php.ini中的safe_mode选项。如果要激活安全模式给当前所有共享Web服务器的用户,只要设置配置选项为:
safe_mode = On
当函数在访问文件系统的时候将进行文件所有者的检查。缺省情况下,会检查该文件所有者的用户ID,当你能够修改文件所有者的组ID(GID)为 safe_mode_gid 选项所指定的。
如 果你有一个共享库文件在你的系统上,当你碰到需要include或require的时候,那么你可以使用 safe_mode_include_dir 选项来设置你的路径,保证你的代码正常工作。(包含路径: 如果你想要使用 safe_mode_include_dir 选项包含更多的包含路径,那么你可以象 include_path 选项一样,在Unix/Linux系统下使用冒号进行分割,在Windows下使用分号进行分割)
比如你想要在安全模式下包含 /usr/local/include/php 下的文件,那么你可以设置选项为:

safe_mode_include_dir = /usr/local/include/php

如果你的包含的文件是需要执行的,那么你可以设置 safe_mode_exec_dir 选项。比如你需要 /usr/local/php-bin 路径下的文件是可以执行的,那么可以设置选项为:

safe_mode_exec_dir = /usr/local/php-bin

(可执行:如果你执行的程序在 /usr/bin 目录下,那么你可以把这些的二进制文件,连接到你指定选项下能够执行的路径)
如果你想设置某些环境变量,那么可以使用 safe_mode_allowed_env_vars 选项。这个选项的值是一个环境变量的前缀,缺省是允许 PHP_ 开头的环境变量,如果你想要改变,可以设置该选项的值,多个环境变量前缀之间使用逗号进行分割。
比如下面允许时区的环境变量 TZ ,那么修改该选项的值为:

safe_mode_allowed_env_vars = PHP_,TZ

【 其他的安全特征 】
除了安全模式以外,PHP还提供了许多其他许多特征来保证PHP的安全。

[ 隐藏PHP ]
你能够在php.ini里使用 expose_php 选项来防止Web服务器泄露PHP的报告信息。如下:

expose_php = On

利用整个设置,你能够阻碍一些来自自动脚本针对Web服务器的攻击。通常情况下,HTTP的头信息里面包含了如下信息:

Server: Apache/1.3.33 (Unix) PHP/5.0.3 mod_ssl/2.8.16
OpenSSL/0.9.7c

在 expose_php 选项打开以后,PHP的版本信息将不包含在上面的头信息里。
当然,用户访问网站的时候同样能够看到 .php 的文件扩展名。如果你想整个的使用不同的文件扩展名,你需要在 httpd.conf 中找到如下这行:

AddType application/x-httpd .php

你就可以修改 .php 为任何你喜欢的文件扩展名。你能够指定任意多个的文件扩展名,中间使用空格进行分割。如果你想在服务器端使用PHP来解析 .html 和 .htm 文件的时候,那么你设置选项如下:

AddType application/x-httpd .html .htm

(解析HTML:配置你的Web服务器使用PHP去解析所有的HTML文件,但是如果非服务器端代码也需要PHP去解析,会影响服务器的性能。静态页面你可以使用不同的扩展名,这样能够消除对PHP脚本引擎的依赖,增强性能。)

[ 文件系统安全 ]
安全模式限制了脚本所有者只能访问属于自己的文件,但是你可以使用 open_basedir 选现来指定一个你必须访问的目录。如果你指定了一个目录,PHP将拒绝访问除了该目录和该目录子目录的其他目录。open_basedir 选项能够工作在安全模式之外。
限制文件系统只能访问 /tmp 目录,那么设置选项为:

open_basedir = /tmp

[ 函数访问控制 ]
你能够在 disable_functions 选项中使用逗号分割来设定函数名,那么这些函数将在PHP脚本中被关闭。这个设置能够工作在安全模式之外。

disable_functions = dl

当然,同样的你能够使用 disable_classes 选项来关闭对一些类的访问。

[ 数据库安全 ]
假设你的PHP脚本中包含一个基于表单值来执行的Mysql查询:

$sql = “UPDATE mytable SET col1 = ” . $_POST["value"] . ”
WHERE col2 = ’somevalue’”;
$res = mysql_query($sql, $db);

你希望 $_POST["value"] 包含一个整数值来更新你的列 col1。可是,一个恶意用户能够输入一个分号在表单字段里,接着,是一段他/她想被任意执行的SQL语句。

举例,假设下面是 $_POST["value"] 提交的值:

0; INSERT INTO admin_users (username, password)
VALUES (’me’, ‘mypassword’);

那么当这个查询发送给Mysql查询的时候,那么就变成了下面这条SQL:

UPDATE mytable SET col1 = 0;
INSERT INTO admin_users (username, password)
VALUES (’me’, ‘mypassword’);
WHERE col2 = ’somevalue’;

这明显是一个有害的查询!首先这个查询会在 mytable 表里更新 col1。这个并没有什么麻烦的,但是第二个表达式,它将执行 INSERT 表达式来插入一个能登陆的新管理员。第三个表达式就废弃了,但同时SQL解析器将抛出一个错误,这个有害的查询才完成。这个攻击就是大家常说的 SQL injection(注:SQL注入)。
当然,SQL injection 存在一个问题,对方必须了解你的数据库结构。在这个例子中,攻击者是知道你有一个表 admin_users,并且知道包含 username 和 password字段,同时,存储的密码是没有加密的。
除了你自己,一般的网站访问者是不知道这些关于数据库的信息。可是,如果你使用了一个开发源代码的在线电子商务程序,或者使用一个自由的讨论版程序,这些数据表的定义都是已知的,或者有一些用户能够访问到你的数据库。
此外,你的脚本输出会提示一个查询错误,这些信息里包含了很多关于数据库结构的重要信息。在一个正常工作的网站上,你应该考虑设置 display_errors 选项为 off,并且使用 log_errors 来代替 display_errors ,把警告和错误信息插入到文件中。
(数据库权限:它是一个非常重要的东西,你只有正确的权限,才能通过脚本正确的连接数据库。你应该不要在 脚本中使用管理员去连接数据库。如果你这么做,那么一个攻击者将可能获取全部的数据库权限,并且包括其他相同服务器的权限。攻击者将可能运行 GRANT 或 CREATE USER 命令来获取更多的访问权限。 )
如果你要防止 SQL injection 攻击,你必须保证用户表单里提交的内容不是一个能够执行的SQL表达式。
前一个例子中,我们使用一个整型值来进行更新。如果在单引号后面跟上一个字符串,这个攻击者在分号之前必须提交一个闭合的引用在整个SQL表达式中。可是,当 magic_quotes_gpc 选项是开启的时候,在Web表单中提交的引号将自动被转义。
为 了防止被恶意的攻击者进行 SQL injection攻击,你应该总是确认提交的数据是合法的。如果你需要的是一个整数值,那么你可以使用 is_numeric 函数来测试这个表达值,或者使用 settype 函数来转换为一个数字,清除任何一个傻傻的SQL语句。
如果你开发的程序需要几个提交的值在一个SQL表达式里,你能够使用 sprintf 函数来构建一个SQL字符串,使用格式化字符来指示数据类型的每个值。看下面的例子:

$sql = sprintf(”UPDATE mytable SET col1 = %d
WHERE col2 = ‘%s’”,
$_POST["number"],
mysql_escape_string($_POST["string"]));

在上一个例子中,整个Mysql的数据已经被使用,所以这个字符串已经通过 mysql_escape_string 函数进行过滤。对于其他数据库,你可以使用 addslashes 函数进行转义,或者使用其他方法。

LNMP有一个缺点就是目录权限设置上不如Apache,有时候网站程序存在上传漏洞或类似pathinfo的漏洞从而导致被上传了php木马,而给网站和服务器带来比较大危险。
建议将网站目录的PHP权限去掉,当访问上传目录下的php文件时就会返回403错误。下面详细介绍如何把lnmp环境下去掉指定目录的PHP执行权限。
那么在nginx里面同样可以实现这种方法,那就是location的优先匹配
首先要编辑nginx的虚拟主机配置,在fastcgi的location语句的前面按下面的内容添加:
1、单个目录去掉PHP执行权限

location ~ /attachments/.*.(php|php5)?$
{
deny all;
}

2、多个目录去掉PHP执行权限取消多个目录的php执行访问权限和模版目录文件的访问!
#取消多个目录的php执行访问权限和模版目录文件的访问!

location ~ /(uploadfile|piaoyun/templates|piaoyun)/.*\.(php|php5|html)?$
{
deny all;
}

注意这段secion一定要放在指定执行php section的前面才可以生效

添加完执行:

/usr/local/nginx/sbin/nginx -t

测试配置文件

执行:

/usr/local/nginx/sbin/nginx -s reload

载入配置文件使其生效

至于为什么设置上传目录无权限这个我就不累赘了,现在比较流行的web服务有iis,apache,nginx,使用操作系统无非是windows和linux

我们来看俩段通常对上传目录设置无权限的列子,配置如下:
代码如下:

<Directory "/var/www/upload">
<FilesMatch ".php">
Order Allow,Deny
Deny from all
</FilesMatch>
</Directory>

这些配置表面上看起来是没什么问题的,确实在windows下可以这么说。
但是linux就不同了,大家都是知道的linux操作系统是区分大小写的,这里如果换成大写后缀名*.phP一类就pass了

这里我说下我个人的解决方法,代码如下:

<Directory "要去掉PHP执行权限的目录路径,例如:D:/piaoyun.cc/upload">
ErrorDocument 404 /404/404.html
ErrorDocument 403 /404/403.html
<FilesMatch "\.(?i:php|php3|php4)$"> // ?是尽可能多的匹配.php的字符串,i是不区分大小写,然后冒号后面跟上正则表达式,也可以写成:<FilesMatch "\.(php|php3)$">
Order allow,deny
Deny from all
</FilesMatch>
</Directory>

上面的意思就是说,<Directory "要去掉PHP执行权限的目录路径,例如:D:/piaoyun.cc/upload"> 内目录路径下所有php文件不区分大小写,通过order,allow,deny原则判断拒绝执行php文件,对nginx同样也是可应用的

另外一种方法,是设置在htaccess里面的,这个方法比较灵活一点,针对那些没有apapche安全操作权限的网站管理员:
Apache环境规则内容如下:Apache执行php脚本限制 把这些规则添加到.htaccess文件中
代码如下:

RewriteEngine on RewriteCond % !^$
RewriteRule uploads/(.*).(php)$ – [F]
RewriteRule data/(.*).(php)$ – [F]
RewriteRule templets/(.*).(php)$ –[F]

另外一种方法,代码如下:

<Directory "/var/www/upload">
php_admin_flag engine off
</Directory>

此方法我在win系统下面测试失败了,重新启动apapche出现下面的错误信息:
The Apache service named reported the following error:
>>> Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration.

这里我就不具体说明这个解决办法了,因为禁止php执行的方法,大家看自己的需求去设置就可以了!

【apache配置禁止访问】
1. 禁止访问某些文件/目录
增加Files选项来控制,比如要不允许访问 .inc 扩展名的文件,保护php类库:

<Files ~ "\.inc$">
Order allow,deny
Deny from all
</Files>

禁止访问某些指定的目录:(可以用 <DirectoryMatch> 来进行正则匹配)

<Directory ~ "^/var/www/(.+/)*[0-9]{3}">
Order allow,deny
Deny from all
</Directory>

通过文件匹配来进行禁止,比如禁止所有针对图片的访问:

<FilesMatch \.(?i:gif|jpe?g|png)$>
Order allow,deny
Deny from all
</FilesMatch>

针对URL相对路径的禁止访问:

<Location /dir/>
Order allow,deny
Deny from all
</Location>

针对代理方式禁止对某些目标的访问(<ProxyMatch> 可以用来正则匹配),比如拒绝通过代理访问cnn.com:

<Proxy http://piaoyun.cc/*>
Order allow,deny
Deny from all
</Proxy>

2. 禁止某些IP访问/只允许某些IP访问
如果要控制禁止某些非法IP访问,在Directory选项控制:

<Directory "/var/www/web/">
Order allow,deny
Allow from all
Deny from 10.0.0.1 #阻止一个IP
Deny from 192.168.0.0/24 #阻止一个IP段
</Directory>

只允许某些IP访问,适合比如就允许内部或者合作公司访问:

<Directory "/var/www/web/">
Order deny,allow
Deny from all
All from example.com #允许某个域名
All from 10.0.0.1 #允许一个iP
All from 10.0.0.1 10.0.0.2 #允许多个iP
Allow from 10.1.0.0/255.255.0.0 #允许一个IP段,掩码对
All from 10.0.1 192.168 #允许一个IP段,后面不填写
All from 192.168.0.0/24 #允许一个IP段,网络号
</Directory>

Apache:解决办法;

<Directory "/home/domain/public_html">
Options -Indexes FollowSymLinks
AllowOverride All
<Files ~ ".txt">
Order allow,deny
Deny from all
</Files>
</Directory>

一般情况下,软件的漏洞信息和特定版本是相关的,因此,软件的版本号对攻击者来说是很有价值的。
在默认情况下,系统会把Apache版本模块都显示出来(http返回头信息)。如果列举目录的话,会显示域名信息(文件列表正文),如:

[root@localhost tmp]# curl -I 192.168.80.128:88
HTTP/1.1 403 Forbidden
Date: Wed, 21 Jul 2010 13:09:33 GMT
Server: Apache/2.2.15 (CentOS)
Accept-Ranges: bytes
Content-Length: 5043
Connection: close
Content-Type: text/html; charset=UTF-8

隐藏方法:

1、隐藏Apache版本号的方法是修改Apache的配置文件,如RedHat系的Linux默认是:

vim /etc/httpd/conf/httpd.conf

分别搜索关键字ServerTokens和ServerSignature,修改:

ServerTokens OS 修改为 ServerTokens ProductOnly
ServerSignature On 修改为 ServerSignature Off

修改好的如下:

ServerTokens ProductOnly
ServerSignature Off

2、重启或重新加载Apache就可以了。

测试一下,如下:

[root@localhost tmp]# curl -I 192.168.80.128:88
HTTP/1.1 403 Forbidden
Date: Wed, 21 Jul 2010 13:23:22 GMT
Server: Apache
Accept-Ranges: bytes
Content-Length: 5043
Connection: close
Content-Type: text/html; charset=UTF-8

版本号与操作系统信息已经隐藏了。
下面的方法只适合于用源码编译安装的Apache版本,里面版本的信息可以自定义修改。
目的: 对Apache源码文件进行简单修改,以诱骗普通攻击者,或者自娱自乐!
方法:修改Apache的几个源代码文件,然后自己编译安装。

一、文件操作
1、修改文件:srcdir/include/ap_release.h

#define AP_SERVER_BASEVENDOR “这里填写开发组织名,例如:Microsoft Corp.”
#define AP_SERVER_BASEPRODUCT “这里填写服务器软件名,例如:Microsoft-IIS”
#define AP_SERVER_MAJORVERSION “主版本,例如:6″
#define AP_SERVER_MINORVERSION “次版本,例如:0″
#define AP_SERVER_PATCHLEVEL “修正版本,例如:0″

2、修改文件:srcdir/include/os.h

#define PLATFORM “这里填写操作系统的名称,例如:Win32″

3、修改文件:srcdir/os/PLATFORM/os.h

#define PLATFORM “这里填写操作系统的名称,例如:Win32″

4、修改文件:srcdir/modules/generators/mod_info.c

Search “Apache Server Information” replace with “这里填写在查看server-info现实的页面标题,例如:Microsoft-IIS Information”

5、修改文件:srcdir/modules/generators/mod_status.c

Search “Apache Server Status” replace with “这里填写在查看server-status现实的页面标题,例如:Microsoft-IIS Status”

说明:
1、path/to/filename 表示要对这个文件进行操作
2、Search “A” replace with “B” 表示在文件之中搜索A,然后使用B替换

二、编译操作
按照一般正常步骤编译安装
结果:
/server-info:

Microsoft-IIS Information

Server Version: Microsoft-IIS/6.0/7.0 (Win32)

/server-status:

Apache Server Status for 127.0.0.1
Server Version: Microsoft-IIS/6.0/7.0 (Win32)
Server Built: July 26 2010 15:20:36

页面底部显示:(例如在以上两个测试和indexes情况之下)

Microsoft-IIS/6.0/7.0 (Win32) Server at 127.0.0.1 Port 80

PHP隐藏版本号的修改方法如下:

php屏蔽浏览器头信 X-Powered-By
将php.ini中

expose_php = On

改为:

expose_php = Off

如果没有找到上面的代码,就新添加一个!

众所周知,在windows下当Apache第一次被安装为服务后,它会以用户“System”(本地系统账号)运行。如果web服务器的所有资源都在本地系统上,这样做会问题比较少,但是将会具有很大的安全权限来影响本地机器,因此千万不能开启System帐号的网络权限。

于是要创建一个新的帐户来替代这个帐号启动apache并设置相应的权限:
1、在计算机管理里的本地用户和组里面创建一个帐户,例如:apache,密码设置为:apacheuser,加入guests组(如果出现问题,可以赋予user权限);
2、打开开始->管理工具->本地安全策略,在用户权限分配中选择“作为服务登陆”,添加apache用户;
3、计算机管理里面选择服务,找到apache2.2,先停止服务,右击->属性,选择登陆,把单选框从本地系统帐户切换到此帐户,然后查找选择apache,输入密码apacheuser,然后点确定(这个时候apache还不能正常启动,一般情况肯定会报错:Apache2.2 服务因 1 (0x1) 服务性错误而停止。);
4、赋予apache安装目录(比如:D:/apache2.2)以及web目录(比如D:/wwwroot)apache帐号的可读写权限,去除各磁盘根目录除administror与system以外的所有权限,赋予apache安装目录所在的磁盘根目录apache帐户的可读取列目录权限(我开始觉得没必要,但后来发现:这是导致上面出错的关键。错误信息:Apache2.2 服务因 1 (0x1) 服务性错误而停止)
5、启动apache,一切OK了。
6、php.ini中指定的PHP临时上传目录和session保存目录,并给予目录apache完 全控制权限,例如:

upload_tmp_dir = "E:/PHP/uploadtmp/"
session.save_path = "E:/PHP/sessiontmp/"

7、给予D:/php目录读取与运行的权限;
8、给予zend安装目录读取与运行的权限;
9.限制读取访问的目录,修改apache安装目录下conf文件夹下的 httpd.conf,加上:

php_admin_value open_basedir "D:/wwwroot"
php_admin_value safe_mode On

httpd.conf配置(假如将PHP读写权限限制在E:\smis目录下)
Apache2.0配置示例代码如下:

<VirtualHost *:80>
ServerName www.piaoyun.cc
DocumentRoot "E:/piaoyun"
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/piaoyun/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</VirtualHost>

Apache2.2配置示例代码如下:

<VirtualHost *:80>
ServerName www.piaoyun.cc
DocumentRoot "E:/piaoyun"
</VirtualHost>
<Directory "E:/smis">
Options FollowSymLinks IncludesNOEXEC Indexes
DirectoryIndex index.html index.htm default.htm index.php default.php
AllowOverride None
Order Deny,Allow
Allow from all
php_admin_value open_basedir "E:/piaoyun/;E:/APMServ5.2.0/PHP/uploadtemp/;E:/APMServ5.2.0/PHP/sessiondata/"
php_admin_value safe_mode On
</Directory>

PS:需要赋予apache所在目录的独立帐号权限,还有apache所在的磁盘独立帐号权限!

PHP目录结构以及NTFS格式下安全的目录权限设置:
当前目录结构为:

D:\php
|
+———————+————————+—————————+—————————+
php4(php5)           temp                     MySQL                           Zend                     phpMyAdmin

以下的是针对IIS设置的:
D:\php设置为管理员和SYSTEM完全权限即可,其他用户均无权限(users 组读取和运行权限。 )
对于其下的二级目录
php4(或者php5)、 tmp 给EVERYONE完全权限,SYSTEM权限未确定
MySQL 、Zend 管理员和SYSTEM完全权限
phpMyAdmin 在继承上级 PHP 目录权限的基础上,增加一个 Internet 来宾帐户读取和运行的权限。

以下的是针对Apache设置的:
目前暂时给予D:\php目录管理员和apapche独立帐号所有权限,对于其的目录读写权限,后期在进行单独的测试设置!

Nginx设置301重定向相对还是比较容易的,301永久重定向不仅能使页面实现自动跳转,而且对于搜索引擎来说,可以传递网站权重、收录以及PR值等。下面我们就详细说说Linux下Nginx设置301重定向的方法:

首先将多个域名指向同一web目录,代码如下:

server_name www.piaoyun.cc piaoyun.cc;

二、我们说下Nginx设置域名301重定向中常用的2种方法:

第一种方法是判断nginx核心变量host(老版本是http_host),适用于绑定多个域名,都相同用途的重定向:

server {
server_name www.piaoyun.cc piaoyun.cc;
if ($host != 'piaoyun.cc' ) {
rewrite ^/(.*)$ http://piaoyun.cc/$1 permanent;
}
...
}

第二种方法,适用于多个域名,但有域名有其他用途不需要重定向的情况:

server {
server_name www.piaoyun.cc piaoyun.cc download.piaoyun.cc;
if ($host = 'www.piaoyun.cc' ) {
rewrite ^/(.*)$ http://piaoyun.cc/$1 permanent;
}
...
}

上面的download.piaoyun.cc为频道域名,不需要重定向。

这两种方法中, permanent是关键,详细见下面nginx重定向规则说明。
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

三、测试是否定向成功
SSH中输入指令:

/usr/local/nginx/sbin/nginx -t

提示:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

测试成功后,重启nginx,输入下面指令:

/usr/local/nginx/sbin/nginx -s reload

重启之后测试一下~是否成功设定完成! 输入指令~

下面另外说下Nginx设置目录如何重定向到目录的方法

例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,$2对应第二个括号(.*)中对应的字符串:

location /download/ {
rewrite ^(/download/.*)/m/(.*)\..*$ $1/nginx-rewrite/$2.gz break;
}

nginx重定向的IF条件判断
在server和location两种情况下可以使用nginx的IF条件判断,条件可以为以下几种:

1、匹配判断:
~ 为区分大小写匹配; !~为区分大小写不匹配
~* 为不区分大小写匹配;!~为不区分大小写不匹配

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}

2、文件和目录判断
-f和!-f判断是否存在文件
-d和!-d判断是否存在目录
-e和!-e判断是否存在文件或目录
-x和!-x判断文件是否可执行

例如下面设定nginx在文件和目录不存在的时候重定向:

if (!-e $request_filename) {
proxy_pass http://127.0.0.1;
}
return

最近更换了lnmp环境,发现用自带的ecshop.conf的伪静态规则是无效的,不知道是我的设置有问题呢,还是其他问题,通过搜索找到了一个可以用的

正确的可以使用的规则如下:

location / {
    if (!-e $request_filename) {
        rewrite "^/index\.html" /index.php last;
        rewrite "^/category$" /index.php last;
        rewrite "^/feed-c([0-9]+)\.xml$" /feed.php?cat=$1 last;
        rewrite "^/feed-b([0-9]+)\.xml$" /feed.php?brand=$1 last;
        rewrite "^/feed\.xml$" /feed.php last;
        rewrite "^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8 last;
        rewrite "^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)(.*)\.html$" /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5 last;
        rewrite "^/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /category.php?id=$1&brand=$2&page=$3&sort=$4&order=$5 last;
        rewrite "^/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$" /category.php?id=$1&brand=$2&page=$3 last;
        rewrite "^/category-([0-9]+)-b([0-9]+)(.*)\.html$" /category.php?id=$1&brand=$2 last;
        rewrite "^/category-([0-9]+)(.*)\.html$" /category.php?id=$1 last;
        rewrite "^/goods-([0-9]+)(.*)\.html" /goods.php?id=$1 last;
        rewrite "^/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /article_cat.php?id=$1&page=$2&sort=$3&order=$4 last;
        rewrite "^/article_cat-([0-9]+)-([0-9]+)(.*)\.html$" /article_cat.php?id=$1&page=$2 last;
        rewrite "^/article_cat-([0-9]+)(.*)\.html$" /article_cat.php?id=$1 last;
        rewrite "^/article-([0-9]+)(.*)\.html$" /article.php?id=$1 last;
        rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html" /brand.php?id=$1&cat=$2&page=$3&sort=$4&order=$5 last;
        rewrite "^/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2&page=$3 last;
        rewrite "^/brand-([0-9]+)-c([0-9]+)(.*)\.html" /brand.php?id=$1&cat=$2 last;
        rewrite "^/brand-([0-9]+)(.*)\.html" /brand.php?id=$1 last;
        rewrite "^/tag-(.*)\.html" /search.php?keywords=$1 last;
        rewrite "^/snatch-([0-9]+)\.html$" /snatch.php?id=$1 last;
        rewrite "^/group_buy-([0-9]+)\.html$" /group_buy.php?act=view&id=$1 last;
        rewrite "^/auction-([0-9]+)\.html$" /auction.php?act=view&id=$1 last;
        rewrite "^/exchange-id([0-9]+)(.*)\.html$" /exchange.php?id=$1&act=view last;
        rewrite "^/exchange-([0-9]+)-min([0-9]+)-max([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /exchange.php?cat_id=$1&integral_min=$2&integral_max=$3&page=$4&sort=$5&order=$6 last;
        rewrite "^/exchange-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$" /exchange.php?cat_id=$1&page=$2&sort=$3&order=$4 last;
        rewrite "^/exchange-([0-9]+)-([0-9]+)(.*)\.html$" /exchange.php?cat_id=$1&page=$2 last;
        rewrite "^/exchange-([0-9]+)(.*)\.html$" /exchange.php?cat_id=$1 last;
    }

    if (!-e $request_filename) {
        return 404;
    }
}

lnmp自带的规则如下(我使用无效):

if (!-e $request_filename)
{
rewrite "^/index\.html" /index.php last;
rewrite "^/category$" /index.php last;
rewrite "^/feed-c([0-9]+)\.xml$” /feed.php?cat=$1 last;
rewrite “^/feed-b([0-9]+)\.xml$” /feed.php?brand=$1 last;
rewrite “^/feed\.xml$” /feed.php last;
rewrite “^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5&page=$6&sort=$7&order=$8 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-min([0-9]+)-max([0-9]+)-attr([^-]*)(.*)\.html$” /category.php?id=$1&brand=$2&price_min=$3&price_max=$4&filter_attr=$5 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /category.php?id=$1&brand=$2&page=$3&sort=$4&order=$5 last;
rewrite “^/category-([0-9]+)-b([0-9]+)-([0-9]+)(.*)\.html$” /category.php?id=$1&brand=$2&page=$3 last;
rewrite “^/category-([0-9]+)-b([0-9]+)(.*)\.html$” /category.php?id=$1&brand=$2 last;
rewrite “^/category-([0-9]+)(.*)\.html$” /category.php?id=$1 last;
rewrite “^/goods-([0-9]+)(.*)\.html” /goods.php?id=$1 last;
rewrite “^/article_cat-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /article_cat.php?id=$1&page=$2&sort=$3&order=$4 last;
rewrite “^/article_cat-([0-9]+)-([0-9]+)(.*)\.html$” /article_cat.php?id=$1&page=$2 last;
rewrite “^/article_cat-([0-9]+)(.*)\.html$” /article_cat.php?id=$1 last;
rewrite “^/article-([0-9]+)(.*)\.html$” /article.php?id=$1 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)\.html” /brand.php?id=$1&cat=$2&page=$3&sort=$4&order=$5 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)-([0-9]+)(.*)\.html” /brand.php?id=$1&cat=$2&page=$3 last;
rewrite “^/brand-([0-9]+)-c([0-9]+)(.*)\.html” /brand.php?id=$1&cat=$2 last;
rewrite “^/brand-([0-9]+)(.*)\.html” /brand.php?id=$1 last;
rewrite “^/tag-(.*)\.html” /search.php?keywords=$1 last;
rewrite “^/snatch-([0-9]+)\.html$” /snatch.php?id=$1 last;
rewrite “^/group_buy-([0-9]+)\.html$” /group_buy.php?act=view&id=$1 last;
rewrite “^/auction-([0-9]+)\.html$” /auction.php?act=view&id=$1 last;
rewrite “^/exchange-id([0-9]+)(.*)\.html$” /exchange.php?id=$1&act=view last;
rewrite “^/exchange-([0-9]+)-min([0-9]+)-max([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /exchange.php?cat_id=$1&integral_min=$2&integral_max=$3&page=$4&sort=$5&order=$6 last;
rewrite ^/exchange-([0-9]+)-([0-9]+)-(.+)-([a-zA-Z]+)(.*)\.html$” /exchange.php?cat_id=$1&page=$2&sort=$3&order=$4 last;
rewrite “^/exchange-([0-9]+)-([0-9]+)(.*)\.html$” /exchange.php?cat_id=$1&page=$2 last;
rewrite “^/exchange-([0-9]+)(.*)\.html$” /exchange.php?cat_id=$1 last;
}

什么是404页面
如果碰巧网站出了问题,或者用户试图访问一个并不存在的页面时,此时服务器会返回代码为404的错误信息,此时对应页面就是404页面。404页面的默认内容和具体的服务器有关。如果后台用的是NGINX服务器,那么404页面的内容则为:404 Not Found

为什么要自定义404页面
在访问时遇到上面这样的404错误页面,我想99%(未经调查,估计数据)的用户会把页面关掉,用户就这样悄悄的流失了。如果此时能有一个漂亮的页面能够引导用户去他想去的地方必然可以留住用户。因此,每一个网站都应该自定义自己的404页面。

nginx下如何自定义404页面
IIS和APACHE下自定义404页面的经验介绍文章已经非常多了,nginx的目前还比较少,为了解决自家的问题特地对此作了深入的研究。研究结果表明,NGINX下配置自定义的404页面是可行的,而且很简单,只需如下几步:

1.创建自己的404.html页面
2.更改nginx.conf在http定义区域加入:

fastcgi_intercept_errors on;

3.更改nginx.conf(或单独网站配置文件,例如在nginx -> sites-enabled下的站点配置文件 )中在server 区域加入:

error_page 404 /error/404.html;

或者

error_page 404 = http://piaoyun.cc/404.html;

4.更改后重启nginx,,测试nginx.conf正确性:

/usr/local/nginx/sbin/nginx –t

#502 等错误可以用同样的方法来配置。

error_page  500 502 503 504  /50x.html;

注意事项:
1.必须要添加:fastcgi_intercept_errors on; 如果这个选项没有设置,即使创建了404.html和配置了error_page也没有效果。fastcgi_intercept_errors 语法: fastcgi_intercept_errors on|off 默认: fastcgi_intercept_errors off 添加位置: http, server, location 默认情况下,nginx不支持自定义404错误页面,只有这个指令被设置为on,nginx才支持将404错误重定向。这里需要注意的是,并不是说设置了fastcgi_intercept_errors on,nginx就会将404错误重定向。在nginx中404错误重定向生效的前提是设置了fastcgi_intercept_errors on,并且正确的设置了error_page这个选项(包括语法和对应的404页面)
2.不要出于省事或者提高首页权重的目的将首页指定为404错误页面,也不要用其它方法跳转到首页。
3.自定义的404页面必须大于512字节,否则可能会出现IE默认的404页面。例如,假设自定义了404.html,大小只有11个字节(内容为:404错误)。

nginx可以为网站或目录甚至特定的文件设置密码认证。密码必须是crypt加密的。可以用apache的htpasswd来创建密码。

格式为:htpasswd -b -c site_pass username password

site_pass为密码文件。放在同nginx配置文件同一目录下,当然你也可以放在其它目录下,那在nginx的配置文件中就要写明绝对地址或相对当前目录的地址。
如果你输入htpasswd命令提示没有找到命令时,你需要安装httpd.如centos是yum install httpd
如果是为了给网站加上认证,可以直接将认证语句写在nginx的配置server段中。
如果是为了给目录加上认证,就需要写成目录形式了。同时,还要在目录中加上php的执行,否则php就会被下载而不执行了。

例如:基于整个网站的认证,auth_basic在php解释之前。

server {
listen       80;
server_name www.akii.org akii.org;
root  /www/akii;
index index.html index.htm index.php;

    auth_basic "input you user name and  password";
    auth_basic_user_file /usr/local/nginx/conf/vhost/nginx_passwd;

location ~ .php$ {
fastcgi_pass  127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.ht {
deny  all;
}
access_log /logs/akii.org_access.log main;
}

针对目录的认证,在一个单独的location中,并且在该location中嵌套一个解释php的location,否则php文件不会执行并且会被下载。auth_basic在嵌套的location之后。

server {
listen       80;
server_name www.akii.org akii.org;
root  /www/akii;
index index.html index.htm index.php;

    location ~ ^/admin/.* {
        location ~ \.php$ {
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi_params;
        }
 
        auth_basic "auth";
        auth_basic_user_file /usr/local/nginx/conf/vhost/auth/admin.pass;
    }

location ~ .php$ {
fastcgi_pass  127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}

location ~ /\.ht {
deny  all;
}
access_log /logs/akii.org_access.log main;
}

这里有一个细节,就是location ~ ^/admin/.* {…} 保护admin目录下的所有文件。如果你只设了/admin/ 那么直接输入/admin/index.php还是可以访问并且运行的。 ^/admin/.* 意为保护该目录下所有文件。当然,只需要一次认证。并不会每次请求或每请求一个文件都要认证一下。

本文只介绍Nginx的配置文件信息,以及如何在虚拟站点中使用PHP。

这里假定Nginx被安装在 /usr/local/nginx 目录下,PHP安装在 /usr/local/php 目录下。

一、Nginx主配置文件及解析

Nginx配置文件主要分为4部分:main(全局设置)部分设置的指令将影响其他所有设置;server(主机设置)部分的指令主要用于指定主机和端口;upstream(负载均衡服务器设置)部分指令主要用于负载均衡,设置一系列的后端服务器;location(URL匹配特定位置的设置)部分用于匹配网页位置。四者之间的关系:server继承main,location继承server,upstream既不会继承其他设置,也不会被继承。

 # 指定Nginx Worker进程运行用户以及用户组,默认由nobody账号运行。如果编译Nginx的时候指定了用户和用户组,该选项可以关闭
 user  www www;
 # 指定Nginx需要开启的进程数,每个进程平均耗费10~12M内存。建议数量设置成与CPU内核的数量一致就可以了。
 # cpu的核心数可以使用 cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l 或 cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 命令进行查
 worker_processes  1;
 # 定义全局错误日志文件,后面可以设置输出级别:debug、info、notice、warn、error、crit
 error_log  logs/error.log;
 #error_log  logs/error.log  notice;
 #error_log  logs/error.log  info;
 # 用来指定进程id的存储文件位置
 pid        logs/nginx.pid;
 # 启用TCMalloc的设置,见上节相关的描述
 google_perftools_profiles /tmp/tcmalloc;
 # 用于绑定worker进程和CPU,该值必须和Linux内核打开文件数关联起来,如将该值设置为65535就必须在Linux命令行中执行 ulimit -HSn 65535
 worker_rlimit_nofile 65535;

 events {
     # 用来指定Nginx的工作模式,支持的模式有select、poll、kqueue、epool、rtsig和/dev/poll。其中select和poll都是标准的工作模式
     # kqueue和epoll是高效的工作模式,前者用在linux平台上,后者用于BSD系统。
     use epoll;
     # 定义每个进程的最大连接数,默认是1024,该参数的最大连接数受Linux系统进程的最大打开文件数限制,必须使用 ulimit命令
     # 另外,最大客户端连接数max_client=worker_processes*worker_connections,作为反向代理的话还需要除以4。
     worker_connections  65535;
 }

 http {
     # 引用外部文件,类似于Apache中的include
     include       mime.types;
     # 当出现无法解析的文件时,提示用户下载
     default_type  application/octet-stream;

     # 定义日志的格式,后面的main为格式的名称,可以在access_log指令中进行引用
     #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  logs/access.log  main;

     # 设定请求缓冲
     server_names_hash_bucket_size 128;
     client_header_buffer_size 32k;
     large_client_header_buffers 4 32k;
     # 设置客户端能够上传文件大小的限制
     client_max_body_size 600m;

     # 是否开启高效文件传输模式,将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞
     sendfile        on;
     tcp_nopush     on;
     tcp_nodelay  on;

     # 隐藏nginx的版本显示,增强安全性
     server_tokens off;

     # 用于设置客户端连接保持活动的超时时间,单位为秒,默认为75s
     #keepalive_timeout  0;
     keepalive_timeout  65;
     # 用于指定响应客户端的超时时间,这个超时仅限于两个连接活动之间的时间,默认为60s
     #send_timeout 60;

     # 下面是FastCGI的优化指令
     # 连接到后端FastCGI的超时时间
     fastcgi_connect_timeout 300;
     # 向FastCGI传送请求的超时时间
     fastcgi_send_timeout 300;
     # 接收FastCGI应答的超时时间
     fastcgi_read_timeout 300;
     # 指定读取FastCGI应答第一部分需要多大的缓冲区
     fastcgi_buffer_size 64k;
     fastcgi_buffers 4 64k;
     # 默认值是fastcgi_buffers的两倍
     fastcgi_busy_buffers_size 128k;
     # 表示在写入缓存文件时使用多大的数据块,默认为fastcgi_buffers的两倍
     fastcgi_temp_file_write_size 128k;
     # 为FastCGI缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间
     #fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
     # 开启FastCGI缓存并为其设定一个名称。开启缓存可以有效降低CPU的负载,并且防止502错误的发生。
     # 但是同时也会引起很多问题,要视具体情况而定
     #fastcgi_cache TEST;
     # 用来指定应答代码的缓存时间,下面三条指令表示将200和303应答缓存1小时,301应答缓存1天,其他应答缓存1分钟。
     #fastcgi_cache_valid 200 302 1h;
     #fastcgi_cache_valid 301 1d;
     #fastcgi_cache_valid any 1m;

     # 配置Nginx的HttpGzip模块,开通的前提是安装的时候启用了该模块,使用 /usr/local/nginx/sbin/nginx -V 来查看安装的信息(大写的V)
     # 是否开通gzip
     gzip  on;
     # 允许压缩的页面最小字节数
     gzip_min_length 1k;
     gzip_buffers 4 16k;
     gzip_http_version 1.1;
     # 压缩比,从1到9,越大压缩率越高但越占资源,默认为1
     gzip_comp_level 2;
     # 指定压缩的类型,text/html总是被压缩
     gzip_types text/plain application/x-javascript text/css application/xml;
     # 是否让浏览器缓存压缩过的数据,默认为off
     gzip_vary on;

     # server 用于对虚拟主机的设置,建议每个站点的设置放到外部配置文件中,然后使用include进行引用
     # 这里设置一个默认的主机,当默认访问的时候返回403错误
     server {
         listen       80 default;
         server_name _;
         # 也可以修改成404或者500,根据自身情况进行设置
         return 403;
     }

     # 可以使用include将每个站点的配置引用进来,这样方便对站点进行管理
     include vhosts/piaoyun.cc.conf;
     include vhosts/abc.com.conf;
 }

二、Nginx设置虚拟主机及对PHP的支持

在conf目录下面创建vhosts目录,并创建站点的配置文件,这里以piaoyun.cc.conf为例。

[root@localhost ~]# cd /usr/local/nginx/
[root@localhost nginx]# mkdir -p conf/vhosts
[root@localhost nginx]# vim conf/vhosts/piaoyun.cc.conf

创建的piaoyun.cc.conf配置文件如下:

     # 虚拟主机以server进行定义
     server {
         # 监听的端口,多个端口之间使用空格进行间隔
         listen       80;
         # 用来定义访问的ip地址或者域名,多个域名之间使用空格分开
         server_name  examples.com www.examples.com;
         # 用于指定站点网页的默认编码格式
         charset utf-8;

         # 用来指定此站点的访问日志存放路径,后面的main用于设定日志的格式
         #access_log  logs/examples.com.access.log  main;

         # 用于指定站点的网页根目录,可以是相对路径(相对于nginx安装目录),也可以是绝对路径
         #root /www/examples.com
         # 用于指定访问的默认首页地址
         #index index.html index.php

         # 用来指定站点默认访问的设置,里面的root和index用法和效果与上面是一样的
         # 两种方式使用任何一种都是可以的,这里采用 location / {} 的方式
         location / {
             root   /www/examples.com;
             index  index.html index.php;
         }

         # 使用error_page指令设置各种错误信息的返回页面
         # 错误信息的返回页面大小如果低于512k则会被ie浏览器替换为ie默认的错误页面
         #error_page  404              /404.html;
         error_page   500 502 503 504 /50x.html;
         location = /50x.html {
             root   html;
         }

         # nginx的location指令用于设置url地址匹配,支持正则表达式匹配,也支持条件判断匹配。
         # 可以通过location指令实现nginx对动态、静态网页的过滤处理。
         # 下面是对所有的图片设置缓存30天
         location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
             expires 30d;
         }
         # 对js和css文件缓存1小时
         location ~ .*\.(js|css)$ {
             expires 1h;
         }

         # 下面是列出了两种解析php的方式:
         # 第一种是简单的将所有以php结尾的请求都交给本机的8080端口进行处理
         #location ~ \.php$ {
         #    proxy_pass   http://127.0.0.1:8080;
         #}
         # 第二种是将php的请求交给FastCGI进程监听的ip地址及端口,这里转发给PHP_FPM
         location ~ \.php$ {
             # 设定用于解析php的根目录,通常为网站根目录
             root          /www/examples.com;
             # 地址和端口与php_fpm中设置的一致
             fastcgi_pass   127.0.0.1:9000;
             # 默认首页
             fastcgi_index  index.php;
             # 指定防止php动态程序的主目录,也就是$fastcgi_script_name前面指定的路径,建议与网站根目录一致或直接使用$document_root
             fastcgi_param  SCRIPT_FILENAME   $document_root$fastcgi_script_name;
             include        fastcgi_params;
         }

         # 防止直接访问 .htaccess 文件,建议开启
         location ~ /\.ht {
             deny  all;
         }
     }

最后创建网站的根目录并设置目录权限:

[root@localhost ~]# mkdir -p /www/examples.com
# 写入权限
[root@localhost ~]# chmod +w /www/examples.com
[root@localhost ~]# chown -R www:www /www/examples.com
# 创建一个测试的php文件
[root@localhost ~]# echo "<? phpinfo(); ?>" >> /www/examples.com/phpinfo.php

这个时候启动php-fpm和nginx之后,应该可以直接访问http://www.piaoyun.cc/phpinfo.php了。

三、优化php-fpm和fastcgi_params配置信息

PHP-FPM的配置文件在/usr/local/php/etc/php-fpm.conf中,下面对常用的配置项进行说明:

<!-- 用来配置FastCGI进程监听的IP地址以及端口,默认为127.0.0.1:9000 -->
 <value name="listen_address">127.0.0.1:9000</value>
 <!-- 用来配置是否显示PHP错误信息,默认是0不显示,设置为1显示信息 -->
 <value name="display_errors">0</value>
 <!-- 用来设置运行FastCGI进程的用户和用户组。这里指定的用户和用户组必须和Nginx配置文件中指定的一致。 -->
 <value name="user">www</value><value name="group">www</value>
 <!-- 用于设置FastCGI的进程数。根据官方建议,小于2G内存的服务器可以只开启64个进程,4GB以上内存服务器可以开始256个进程。 -->
 <value name="max_children">128</value>
 <!-- 执行脚本的时间,默认为0表示无限执行下去。 -->
 <value name="request_terminate_timeout">0s</value>
 <!-- 设置PHP-FPM对打开文件描述符的限制,默认为1024。该值必须和Linux内核打开文件数关联起来,
      如将该值设置为65535就必须在Linux命令行中执行 ulimit -HSn 65535。 -->
 <value name="rlimit_files">65535</value>
 <!-- 设定每个children最多处理多少个请求后便会自动关闭,默认设置为500。 -->
 <value name="max_requests">1024</value>
 <!-- 设置允许访问FastCGI进程解析器的IP地址,如果不在这里指定IP地址,将无法接受Nginx转发过来的PHP解析请求。 -->
 <value name="allowed_clients">127.0.0.1</value>

fastcgi_param配置文件在 /usr/local/nginx/conf/fastcgi_params中,将其中的fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;中$nginx_version去掉,隐藏nginx的版本。

#fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  SERVER_SOFTWARE    nginx;

四、常见错误及解决方法

首先说明一下,如果nginx启动之后,无法访问网站或者访问有错误,这个时候应该第一时间查看nginx(默认在nginx安装目录的logs文件夹下)或php-fpm(默认在php根目录的logs/php-fpm.log文件中)的日志文件,里面有详细的错误信息。

1. 当访问php文件的时候页面出现“No input file specified”提示,而静态文件则正常。
这个是因为在站点设置中对php扩展的解析里面,fastcgi_param SCRIPT_FILENAME 后面的路径出现错误,使得php-fpm无法找到php文件,解决的方法是将$fastcgi_script_name前面的路径设置成网站根目录的绝对路径即可,注意路径最后没有斜杠/,即:

fastcgi_param SCRIPT_FILENAME /www/piaoyun.cc$fastcgi_script_name;

看到有的网站上面还提到需要将php.ini文件中的cgi.fix_pathinfo项设置为1,但是我没有进行设置也是好的,估计是nginx的版本不同。

2. [ERROR] fpm_unix_conf_wp(), line 124: please specify user and group other than root, pool 'default'
上面的错误是在php-fpm.log日志文件中出现的,原因是没有设置php-fpm的用户和用户组,或者没有将php-fpm的用户或用户组修改成与nginx的一样。解决方法是修改php-fpm.conf配置文件中user和group,默认情况下这两项配置是被注释的。

<value name="user">www</value>
<value name="group">www</value>

3. [error] 19075#0: *4 connect() failed (110: Connection timed out) while connecting to upstream, ......
这个错误提示是告诉我们nginx转发到php-fpm的时候连接超时了,所以如果访问量太大的话可以将超时的时间设置长一些。但如果网站访问量不大或者刚开始配置之后就出现这个错误的话,往往是iptables设置的问题。验证的方法是:如果将iptables停止(/etc/init.d/iptables stop)之后访问正常则说明是防火墙配置的问题,在防火墙中增加如下规则即可:

iptables -I INPUT 2 -i lo -p all -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables start

4. 启动nginx的时候出现 [emerg]: getpwnam("www") failed 错误
这个错误中getpwnam中间的www可能是其他的名称,主要原因是编译nginx和nginx配置文件(nginx.conf)中设置的用户和用户组不存在,所以只要创建对应的用户和用户组即可。

5. [emerg] 30558#0: setuid(500) failed (11: Resource temporarily unavailable)
错误信息中的setuid中间的数字肯是其他数字,比如501、502等等。这个错误需要一步一步的进行排查,相对有点复杂,解决的方法如下:
首先根据setuid中间的数字查看对应数字的用户是否存在,如果不存在则创建用户:

more /etc/passwd | grep 500
# 如果没有任何信息显示则查看nginx配置文件中指定的用户名称,然后使用useradd创建该用户并指定用户组

如果用户存在的话,则使用 ulimit -n 命令查看服务器文件描述符是多少,默认是1024,然后使用 ps -U www | wc -l 命令查看www用户所启用的进程数量(注意将www用户换成你自己的),如果显示的数量超过了服务器文件描述符的数量,则需要提升该参数,具体的做法是:将nginx.conf中的worker_rlimit_nofile、worker_connections和php-fpm.conf文件中的rlimit_files配置项设置大一些,也可以直接设置成65535(最大值)。然后还需要加大服务器文件描述符的大小。有两种设置方法:

# 一种是修改/etc/security/limits.conf文件,然后重启服务器
echo '* - nofile 65535' >> /etc/security/limits.conf
# 另外一种是使用 ulimit -HSn 65535 命令,将该命令添加到开机启动并放在php-fpm和nginx启动前
ulimit -HSn 65535
cat >> /etc/rc.local <<EOF
/etc/init.d/mysql start
ulimit -SHn 65535
/usr/local/php/sbin/php-fpm start
/usr/local/nginx/sbin/nginx
EOF

一定要确认“ulimit -HSn ”后面的数字需要和nginx.conf中的worker_rlimit_nofile、worker_connections和php-fpm.conf文件中的rlimit_files配置项设置成相同的数字。

如果安装上面的设置修改之后还有错误的话,恭喜你,你的人品大大的提升了,这种情况是比较少见的,先确认一下你是否进行了重启,如果重启过了还可以将 “ulimit -SHn 65535” 命令添加到/etc/profile 中:

echo "ulimit -SHn 65535" >> /etc/profile

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

你也可以将这个服务在系统启动的时候自动启动:

在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start

现在Cron这个服务已经在进程里面了,我们就可以用这个服务了,Cron服务提供以下几种接口供大家使用:

1.直接用crontab命令编辑
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务

比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

任务调度的crond常驻命令
crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

1、linux任务调度的工作主要分为以下两类:
*系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
*个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。

2.crontab命令选项:
-u 指定一个用户
-l 列出某个用户的任务计划
-r 删除某个用户的任务
-e 编辑某个用户的任务

3.cron文件语法:
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)

4.记住几个特殊符号的含义:
"*"代表取值范围内的数字
"/"代表"每"
"-"代表从某个数字到某个数字
","分开几个离散的数字

一、任务调度设置文件的写法
可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件

具体格式如下:
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令

每个字段代表的含义如下:
Minute 每个小时的第几分钟执行该任务
Hour 每天的第几个小时执行该任务
Day 每月的第几天执行该任务
Month 每年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务
Command 指定要执行的程序

在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。

举例如下:
5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]

每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]

二、新增调度任务
新增调度任务可用两种方法:
1、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。

三、查看调度任务
crontab -l //列出当前的所有调度任务
crontab -l -u jp //列出用户jp的所有调度任务

四、删除任务调度工作
crontab -r //删除所有任务调度工作

五、任务调度执行结果的转向
例1:每天5:30执行ls命令,并把结果输出到/jp/test文件中
30 5 * * * ls >/jp/test 2>&1

注:2>&1 表示执行结果及错误信息。

编辑/etc/crontab 文件配置cron

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用 cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本

大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了
例如:
1、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务
11 2 21 10 * rm -rf /mnt/fb

注:每次服务在停止之前会自动将现有的规则保存注: 此为 Ubuntu / Debian Linux 的存放位置.
User Crontab 储存后的文件存放位置:
目录:/var/spool/cron/crontabs
user1:/var/spool/cron/crontabs/user1
user2:/var/spool/cron/crontabs/user2

注: 此为 freebsd 的存放位置.
freebsd:/var/cron/tabs

最近遇到LNMPA一键安装包的Apache无法启动的问题,Apache提示以下信息:
(98)Address already in use: make_sock: could not bind to address 127.0.0.1:88
no listening sockets available, shutting down
Unable to open logs

英文的主要意思是apache需要的端口被占用(可能是异常启动),导致apache无法使用需要的的端口(这里演示为88,自行安装的apache为80)。

一、检查端口被哪个进程占用
netstat -lnp|grep 88 #88请换为你的apache需要的端口,如:80

SSH执行以上命令,可以查看到88端口正在被哪个进程使用。如下图,进程号为 。

二、查看进程的详细信息
ps 1777

SSH执行以上命令。查看相应进程号的程序详细路径。

三、杀掉进程,重新启动apache
kill -9 1777 #杀掉编号为1777的进程(请根据实际情况输入)
service httpd start #启动apache

SSH执行以上命令,如果没有问题,apache将可以正常启动。

Options
指令控制了在特定目录中将使用哪些服务器特性。
可选项能设置为:
None:在这种情况下,将不启用任何额外特性。或设置为以下选项中的一个或多个:
All:除MultiViews之外的所有特性。这是默认设置。
ExecCGI:允许执行CGI脚本.
FollowSymLinks :服务器会在此目录中使用符号连接。

注意:即便服务器会使用符号连接,但它不会改变用于匹配<Directory>配置段的路径名。
注意:如果此配置位于<Location>配置段中,则此设置会被忽略。

Includes 允许服务器端包含。
IncludesNOEXEC 允许服务器端包含,但禁用#exec命令和#exec CGI。但仍可以从ScriptAliase目录使用#include 虚拟CGI脚本。
Indexes 如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回一个格式化后的目录列表。
MultiViews 允许内容协商的多重视图。
SymLinksIfOwnerMatch 服务器仅在符号连接与其目的目录或文件拥有者具有同样的用户id时才使用它。

注意:如果此配置出现在<Location>配置段中,此选项将被忽略。

一般来说,如果一个目录被多次设置了

Options,则最特殊的一个会被完全接受,而各个可选项的设定彼此并不融合。然而,如果所有施用于Options指令的可选项前都加有+或-符号,此 可选项将被合并。所有前面加有+号的可选项将强制覆盖当前可选项设置,而所有前面有-号的可选项将强制从当前可选项设置中去除。

比如说,没有任何+和-符号:

<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options Includes
</Directory>

则只有Includes设置到/web/docs/spec目录上。然而如果第二个Options指令使用了+和-符号:

<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>

那么就会有FollowSymLinks和Includes设置到/web/docs/spec目录上。

一、nginx的几个命令参数
Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的。 Nginx 的参数包括有如下几个:

可以这样使用:

/usr/local/nginx/sbin/nginx -参数

-c <path_to_config>:使用指定的配置文件而不是 conf 目录下的 nginx.conf 。
-t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。
-v:显示 nginx 版本号。
-V:显示 nginx 的版本号以及编译环境信息以及编译时的参数。

二、检测新的conf文件

测试当请目录下nginx.conf文件是否正确,使用命令:

nginx -t -c nginx.conf

2009/01/01 22:17:57 [info] 54240#0: the configuration file nginx.conf syntax is ok
2009/01/01 22:17:57 [info] 54240#0: the configuration file nginx.conf was tested successfully

得到如此结果,说明新conf文件没有错误。

如果有错,他会提示你在哪行出了错,在修改错误就可以了。

一、什么是.htaccess文件

.htaccess文件是Apache服务器上的一个设置文件。它是一个文本文件,可以使用任何文本编辑器进行编写。.htaccess文件提供了针对目录改变配置的方法,即通过在一个特定的文档目录中放置一个包含一个或多个指令的文件(.htaccess文件),以作用于此目录及其所有子目录。.htaccess的功能包括设置网页密码、设置发生错误时出现的文件、改变首页的文件名(如index.html)、禁止读取文件名、重新导向文件、加上MIME类别、禁止列目录下的文件等。

在需要针对目录改变服务器的配置,而对服务器系统没有root权限时,应该使用.htaccess文件。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是ISP在一台机器上提供多个用户站点,而又希望用户可以自己改变配置的情况下,一般会开放部分.htaccess的功能给使用者自行设置。
注意:.htaccess是一个完整的文件名,不是***.htaccess或其它格式(当然也有管理员把其设置成其它名字,但一般都是使用.htaccess)。另外,上传.htaccess文件时,必须使用ASCII模式,并使用chmod命令改变权限为:644(RW_R__R__)。每一个放置.htaccess的目录和其子目录都会被.htaccess影响。例如,在/abc/目录下放置了一个.htaccess文件,那么/abc/和 /abc/def/内所有的文件都会被它影响,但/index.html不会被它影响,这一点是很重要的。

二、使用.htaccess配置文件

在配置Apache时,除了可以在主配置文件(http.conf)中配置访问控制之外,还可以使用.htaccess 文件配置对指定目录的访问控制。使用.htaccess文件可以改变主配置文件中的配置,但是它只能设置对指定目录的访问控制,这个目录就是.htaccess文件存放的目录。在一个目录下设置了.htaccess文件之后,当用户使用浏览器访问此目录时,Apache会读取该文件的配置来覆盖主配置文件(http.conf)的配置。
注意:
1.修改.htaccess文件无需重新启动Apache服务器,而是立即生效。
2.在可能的情况下应该尽量避免使用.htaccess文件,因为使用.htaccess文件会降低服务器的运行性能。

何时使用.htaccess文件:
有如下两种情况需要使用.htaccess文件:
*在多个用户之间分割配置
*想在不重新启动服务器的情况下改变服务器配置
使用.htaccess文件必须经过两个配置步骤:
*首先在主配置文件中的启用并控制对.htaccess文件的使用
*然后在需要覆盖主配置文件的目录下生成.htaccess文件
在主配置文件中的启用并控制对.htaccess文件的使用
1.设置文件名称
必须保证在主配置文件中包含如下的配置语句:

AccessFileName .htaccess
<Files ~ “^.htaccess”>
Order allow,deny
Deny from all
</Files>

2.控制在.htaccess文件中可以使用的指令组
要控制在.htaccess文件中可以使用的指令组,需要在主配置文件中使用AllowOverride指令。下面列出了可以在AllowOverride指令所使用的指令组。
指令组 可用指令 说明
============================
AuthConfig
AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require
进行认证、授权以及安全的相关指令
=============================
FileInfo
DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter
控制文件处理方式的相关指令
=============================
Indexes
AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName
控制目录列表方式的相关指令
==============================
Limit
Allow,Deny,Order
进行目录访问控制的相关指令
==============================
Options
Options, XBitHack
启用不能在主配置文件中使用的各种选项
=============================
All
全部指令组
可以使用以上所有指令
=============================
None
禁止使用所有指令
禁止处理.htaccess文件
==============================
3、生成.htaccess文件
当在主配置文件中配置了对.htaccess文件的启用和控制之后,接下来就可以在需要覆盖主配置文件的目录下生成.htaccess文件。.htaccess文件中可以使用的配置指令取决于主配置文件中AllowOverride指令的设置。

4、使用.htaccess文件举例
下面举一个简单的例子说明.htaccess文件的使用。
首先在文档根目录下生成一个private目录,并创建测试文件

# cd /var/www/html
# mkdir private
# cd private
# touch test

修改配置前,在客户浏览器查看结果。
修改主配置文件

# vi /etc/httpd/conf/httpd.conf

添加如下配置语句

<Directory “/var/www/html/private”>
AllowOverride Options
</Directory>

重新启动httpd

# service httpd restart

在/var/www/html/private目录下生成.htaccess文件

# vi /var/www/html/private/.htaccess

添加如下配置语句

Options –Indexes

在客户浏览器中查看结果。

即对private目录的访问不生成文件列表

三、.htaccess文件的配置说明

Apache可以使用分布在整个网页结构中的特殊文件来进行配置,这些特殊文件通常叫.htaccess,也可以用AccessFileName指令来改变。.htaccess 文件中的指令的作用域是存放它的那个目录及其所有子目录。.htaccess 文件的语法与主配置文件相同。由于对每次请求都会读取.htaccess 文件,所以对这些文件的改变会立即生效。
可以查阅Context了解可以放在.htaccess文件中的指令;服务器管理员可以通过AllowOverride指令,来决定.htaccess 文件中可以生效的指令。
.htaccess 文件(或者”分布式配置文件”)提供了针对目录改变配置的方法,即在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令。
- .htaccess必须以ASCII模式上传,最好将其权限设置为644。

1、错误文档的定位
常用的客户端请求错误返回代码:
401 Authorization Required
403 Forbidden
404 Not Found
405 Method Not Allowed
408 Request Timed Out
411 Content Length Required
412 Precondition Failed
413 Request Entity Too Long
414 Request URI Too Long
415 Unsupported Media Type
常见的服务器错误返回代码:
500 Internal Server Error
用户可以利用.htaccess指定自己事先制作好的错误提醒页面。一般情况下,人们可以专门设立一个目录,例如errors放置这些页面。然后再.htaccess中,加入如下的指令:
ErrorDocument 404 /errors/notfound.html
ErrorDocument 500 /errors/internalerror.html
一条指令一行。上述第一条指令的意思是对于404,也就是没有找到所需要的文档的时候得显示页面为/errors目录下的notfound.html页面。不难看出语法格式为:
ErrorDocument 错误代码 /目录名/文件名.扩展名
如果所需要提示的信息很少的话,不必专门制作页面,直接在指令中使用HTML号了,例如下面这个例子:
ErrorDocument 401 “你没有权限访问该页面,请放弃!”

2、文档访问的密码保护
要利用.htaccess对某个目录下的文档设定访问用户和对应的密码,首先要做的是生成一个.htpasswd的文本文档,例如:
martin:123456
这里密码经过加密,用户可以自己找些工具将密码加密成.htaccess支持的编码。该文档最好不要放在www目录下,建议放在www根目录文档之外,这样更为安全些。
有了授权用户文档,可以在.htaccess中加入如下指令了:
AuthUserFile .htpasswd的服务器目录
AuthGroupFile /dev/null (需要授权访问的目录)
AuthName EnterPassword
AuthType Basic (授权类型)
require user wsabstract (允许访问的用户,如果希望表中所有用户都允许,可以使用 require valid-user)

3、拒绝来自某个IP的访问
如果我不想某个政府部门访问到我的站点的内容,那可以通过.htaccess中加入该部门的IP而将它们拒绝在外。

例如:
order allow,deny
deny from 210.10.56.32
deny from 219.5.45.
allow from all

第二行拒绝某个IP,第三行拒绝某个IP段,也就是219.5.45.0~219.2.45.255。想要拒绝所有人?用deny from all好了。不止用IP,也可以用域名来设定。

4、保护.htaccess文档
在使用.htaccess来设置目录的密码保护时,它包含了密码文件的路径。从安全考虑,有必要把.htaccess也保护起来,不让别人看到其中的内容。虽然可以用其他方式做到这点,比如文档的权限。不过,.htaccess本身也能做到,只需加入如下的指令:
order allow,deny
deny from all

5、URL转向
我们可能对网站进行重新规划,将文档进行了迁移,或者更改了目录。这时候,来自搜索引擎或者其他网站链接过来的访问就可能出错。这种情况下,可以通过如下指令来完成旧的URL自动转向到新的地址:
Redirect /旧目录/旧文档名 新文档的地址
或者整个目录的转向:
Redirect 旧目录 新目录

6、改变缺省的首页文件
一般情况下缺省的首页文件名有default、index等。不过,有些时候目录中没有缺省文件,而是某个特定的文件名,比如在pmwiki中是pmwiki.php。这种情况下,要用户记住文件名来访问很麻烦。在.htaccess中可以轻易的设置新的缺省文件名:
DirectoryIndex 新的缺省文件名
也可以列出多个,顺序表明它们之间的优先级别,例如:
DirectoryIndex filename.html index.cgi index.pl default.htm

7使用.htaccess 访止盗链。如果你网站上的一个图片被别的N多的网站引用了,那么,这很有可能会导致你服务器的性能下降,使用下面的代码可以保护某些热门的链接不被过多的引用。

Options +FollowSymlinks
# Protect Hotlinking
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?domainname.com/ [nc]
RewriteRule .*.(gif|jpg|png)$ http://domainname.com/img/hotlink_f_o.png [nc]

8、设置网站的时区
SetEnv TZ America/Houston

9、阻止IP列表
有些时候,你需要以IP地址的方式阻止一些访问。无论是对于一个IP地址还是一个网段,这都是一件非常简单的事情,如下所示:
allow from all
deny from 145.186.14.122
deny from 124.15

Apache对于被拒绝的IP会返回403错误。

10、 把一些老的链接转到新的链接上——搜索引擎优化SEO
Redirect 301 /d/file.html http://www.htaccesselite.com/r/file.html

11、为服务器管理员设置电子邮件
ServerSignature EMail
SetEnv SERVER_ADMIN default@domain.com

12、阻止 User Agent 的所有请求

## .htaccess Code :: BEGIN
## Block Bad Bots by user-Agent
SetEnvIfNoCase user-Agent ^FrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Java.* [NC,OR]
SetEnvIfNoCase user-Agent ^Microsoft.URL [NC,OR]
SetEnvIfNoCase user-Agent ^MSFrontPage [NC,OR]
SetEnvIfNoCase user-Agent ^Offline.Explorer [NC,OR]
SetEnvIfNoCase user-Agent ^[Ww]eb[Bb]andit [NC,OR]
SetEnvIfNoCase user-Agent ^Zeus [NC]
Order Allow,Deny
Allow from all
Deny from env=bad_bot
## .htaccess Code :: END

13、把某些特殊的IP地址的请求重定向到别的站点

ErrorDocument 403 http://www.piaoyun.cc
Order deny,allow
Deny from all
Allow from ip
Allow from ip

14、直接找开文件而不是下载 – 通常,我们打开网上文件的时候总是会出现一个对话框问我们是下载还是直接打开,使用下面的设置就不会出现这个问题了,直接打开。

AddType application/octet-stream .pdf
AddType application/octet-stream .zip
AddType application/octet-stream .mov

15、修改文件类型 – 下面的示例可以让任何的文件都成为PHP那么被服务器解释。比如:myphp, cgi,phtml等。

ForceType application/x-httpd-php
SetHandler application/x-httpd-php

16、阻止存取.htaccess 文件

# secure htaccess file
order allow,deny
deny from all
#下面的代码保护.htaccess不被下载
<Files ~ “^.htaccess”>
Order allow,deny
Deny from all
</Files>

17、保护服务器上的文件被存取

# prevent access of a certain file order allow,deny
deny from all

18、阻止目录浏览

# disable directory browsing
Options All -Indexes

19、口令认证 – 你可以创建一个文件用于认证。下面是一个示例:

# to protect a file
AuthType Basic
AuthName “Prompt”
AuthUserFile /home/path/.htpasswd
Require valid-user
# password-protect a directory
residesAuthType basic
AuthName “This directory is protected”
AuthUserFile /home/path/.htpasswd
AuthGroupFile /dev/null
Require valid-user

详细见官方:httpd://apache.org/docs/1.3/howto/htaccess.html

在nginx/conf/vhost/站点名称.conf 里的server段里面,添加如下的代码:(红色部分)

server
{
listen 80;
server_name www.piaoyun.cc piaoyun.cc;
if ($host != 'www.piaoyun.cc')
{
rewrite ^/(.*)$ http://www.piaoyun.cc/$1 permanent;
}

意思是:如果访问的域名来路不是www.piaoyun.cc就全部301跳转到带有www.piaoyun.cc的域名下面!

然后service nginx restart

第一种情况:访问A站定向到B站

server {
server_name A.com ;
rewrite ^(.*) http://www.A.com$1 permanent;
}

目前是使用此方法,第一部分的server取消上面的域名绑定!这个放在配置文件的最后!

第二种情况:不是访问A站的全部重定向到指定页面

server {
server_name www.A.com;
if ($host != ‘A.com’ ) {
rewrite ^/(.*)$ http://www.B.com/$1 permanent;
}
}

如果写在第一个server段
使用IP访问时也将被重定向

很多朋友问我,为什么他已经在apache规则里面加了禁止别人直接下载.htaccess文件,为什么还是可以下载!
其实这个很简单,因为.htaccess在lnmpa当它作为文件被访问的时候其实是由Nginx来处理的,所以我们需要在Nginx里来添加规则.

而且这个规则,在Nginx默认的里面是存在的。

# deny access to .htaccess files, if Apache’s document root
# concurs with nginx’s one
location ~ /\.ht {
deny all;
}

复制到你的nginx/conf/vhost/站点名称.conf 里,然后service nginx restart

nginx禁止访问所有.开头的隐藏文件设置

location ~* /\.* {
deny all;
}

nginx禁止访问目录,例如:禁止访问path目录

location ^~ /path {
deny all;
}

可以把path换成实际需要的目录,目录path后是否带有"/",带"/"只禁止访问目录,不带"/"禁止访问目录中的文件
注意这段禁止php权限的secion一定要放在 指定的php section的前面才可以生效的.
禁止多个目录的php执行访问权限和html文件的访问!

location ~ /(upload|cache/templates)/.*\.(php|php5|html)?$
{
deny all;
}

1新建文件夹
mkdir 文件名

新建一个名为test的文件夹在home下
view source1 mkdir /home/test

2新建文本
在home下新建一个test.sh脚本
vi /home/test.sh

3删除文件或文件夹
1)、删除home目录下的test目录
rm /home/test

2)、这种不带参数的删除方法经常会提示无法删除,因为权限不够。
rm -r /home/test

3)、-r是递归的删除参数表中的目录及其子目录。 目录将被清空并且删除。 当删除目录包含的具有写保护的文件时用户通常是被提示的。
rm -rf /home/test

4)、f是不提示用户,删除目录下的所有文件。请注意检查路径,输成别的目录就悲剧了。
rm -ir /home/test

5)、-i是交互模式。使用这个选项,rm命令在删除任何文件前提示用户确认。

4移动文件或文件夹
mv [options] 源文件或目录 目标文件或目录

示例:
1)、移动hscripts文件夹/目录下的所有文件,目录和子目录到tmp目录mv hscripts tmp
分析:在上述命令中,如果tmp目录已经存在,mv命令将移动hscripts文件夹/目录下的所有文件,目录和子目录到tmp目录。 如果没有tmp目录,它将重命名 hscripts目录为tmp目录。
mv /旧目录路径/* /新目录路径

2)、移动多个文件/更多问价到另一目录
mv file1.txt tmp/file2.txt newdir
这个命令移动当前目录的file1.txt文件和tmp文件夹/目录的file2.txt文件到newdir目录。

参数:
-i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答”y”或”n”,这样可以避免误覆盖文件。
-f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。

5复制文件或文件夹
cp [options] 来源档(source) 目的檔(destination)

参数:
-a :相当于 -pdr 的意思;
-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p :连同档案的属性一起复制过去,而非使用预设属性;
-r :递归持续复制,用于目录的复制行为;
-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;
-u :若 destination 比 source 旧才更新 destination !
最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!

示例:
1)、复制两个文件:
cp file1 file2
上述cp命令复制文件file1.php 的内容到文件file2.php中。

2)、备份拷贝的文件:
cp -b file1.php file2.php
创建文件file1.php的带着符号 ‘~’的备份文件file2.php~。

3)、复制文件夹和子文件夹:
cp -R scripts scripts1
上面的 cp 命令从 scripts 复制文件夹和子文件夹到 scripts1。

6、创建目录
mkdir 文件名
mkdir /var/www/test

vnStat是一个应用于Linux或BSD平台,对网卡流量做监控。 因为并非是基于网络包嗅探的方式而是基于/proc的分析。现在vnStat已经有出vnstat PHP frontend 扩展了,可以以PHP脚本的形式直接调用vnStat监测的数据,如下图:
20131031133303_01

20131031133303_02
官网:http://humdi.net/vnstat/

1、安装vnstat

cd /tmp
wget http://humdi.net/vnstat/vnstat-1.11.tar.gz
tar -zxvf vnstat-1.11.tar.gz
cd vnstat-1.11
make
make install

PS:如果装了web服务器可以用make all来编译。包含图片输出支持,用example目录下的vnstat.cgi在web服务器上输出图片。

常用选项:

-q, --query :query database
-h, --hours :show hours
-d, --days :show days
-m, --months :show months
-w, --weeks :show weeks
-t, --top10 :show top10
-s, --short :use short output
-u, --update :update database
-i, --iface :select interface (default: eth0)
-?, --help :short help
-v, --version :show version
-tr, --traffic :calculate traffic
-ru, --rateunit :swap configured rate unit
-l, --live :show transfer rate in real time

这样vnstat 就安装好了。下面讲vnstat的工作运行配置。
下载最新版vnstat PHP frontend,
地址:http://soft.vpser.net/status/vnstat/vnstat_php_frontend-1.5.1.tar.gz

解压文件,改名为vnstat,然后上传到某个网站根目录下,这样就可以以http://piaoyun.cc/vnstat 来访问到,就出来页面了,但此时没有数据,因为还要使系统生成数据。

2、通过ifconfig查看网卡名称,生成数据库
vnstat -u -i eth0

方法二:使用vnstat守护进程
执行:
vnstatd -d

官网提供vnstatd的自启动脚本:
http://humdi.net/vnstat/init.d/redhat/vnstat

放到/etc/init.d目录下。

cd /etc/init.d
wget http://humdi.net/vnstat/init.d/redhat/vnstat
chmod +x vnstat
chkconfig --add vnstat
chkconfig vnstat on
service vnstat restart

实际上在安装vnstat时,已经在系统里安装好了vnstat的cron,crontab内容在/etc/cron.d/vnstat,如果没有使用命令touch /etc/cron.d/vnstat 创建。
内容为:
0-55/5 * * * * root vnstat -u -i eth0
0-55/5 * * * * root vnstat --dumpdb -i eth0 >/var/lib/vnstat/vnstat_dump_eth0
第一行为安装时自动指定的.
第二行是为了更新eth0的数据后,dump出来一个文件,给 php访问接口访问.
这里dump出来的vnstat_dump_eth0 文件名是有规定的。

# 注意:有时候采用上面的收集办法,无法采集到数据,可以采用下面的办法

cat > /var/lib/vnstat/vnstat.sh<<EOF
vnstat -u -i eth0
vnstat --dumpdb -i eth0 >/var/lib/vnstat/vnstat_dump_eth0
EOF

3、更新数据库
方法一:通过cron定时更新数据库

vim /etc/cron.d/vnstat

输入:

*/5 * * * * sh /var/lib/vnstat/vnstat.sh

设置为5分钟更新一次数据库。
vnstat.sh 内容如下:

vnstat -u -i eth0
vnstat --dumpdb -i eth0 >/var/lib/vnstat/vnstat_dump_eth0

在vnstat_php_frontend-1.5.1.tar.gz 包里的config.php 里有说明。

最后,编辑 vnstat/config.php 这个文件,将数据目录改为 /var/lib/vnstat/,如果不存在此目录,需要使用mkdir -p /var/lib/vnstat/ 创建此目录。
即:

$data_dir = '/var/lib/vnstat/';

指定显示标题

$iface_title['eth0'] = 'VPSer-Linode';

下面设置以什么图片格式显示,可以是svg或png,一般选择png就可以,svg在IE下需要安装插件,Firefox不需要;如果用png在IE、Firefox下均能直接显示。

$graph_format='png';

指定vnstat的安装目录,如果是安装上述方法安装,直接按下面填写即可。

$vnstat_bin = '/usr/bin/vnstat';

将要监控的网卡指定为1个:

// list of network interfaces monitored by vnStat
//$iface_list = array(’eth0′, ‘eth1′, ’sixxs’);
$iface_list = array(’eth0′,);

// will be displayed instead
//
$iface_title['eth0'] = ‘Internal’;
//$iface_title['eth1'] = ‘Internet’;
//$iface_title['sixxs'] = ‘SixXS IPv6′;

修改语言为英语:$language = 'nl'; 将nl替换为en 保存。

这一切都搞好后,现在用 www.mydomain.com/vnstat/访问,就会发现有流量统计了,统计的数据更新是5分钟刷新一次.

4、使用
1)直接使用vnstat相关命令查看流量统计
vnstat
vnstat -h
vnstat -d
vnstat -m
vnstat -w
vnstat -t

2)查看实时流量
vnstat -l -i eth0 -ru

注:-ru表示将显示单位在bytes和bits之间切换。如果要直接单位显示bytes,可以编辑/etc/vnstat.conf将RateUnit值设为0。

3)计算一段时间内的流量平均值

vnstat -tr 10 -ru

注:-tr后跟时间,默认值是5秒。