分类 "服务器" 下的文章

博客目前用的独立ip,如果某些别有用心的人用未备案的域名解析我的ip到我博客,一会gfw发作,把我ip封了就欲哭无泪了。因此需要将没有绑定的域名制止访问或跳转到其他页面。可以用下面的方法实现。

看了很多Nginx的配置,好像都忽略了ip直接访问Web的问题,这样理论上不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问,具体怎么做呢,看下面。

官方文档中提供的方法:
If you do not want to process requests with undefined "Host" header lines, you may define a default server that just drops the requests:

server {
listen 80 default_server;
server_name _;
return 500;
}

后面的default参数表示这个是默认虚拟主机。Nginx 禁止IP访问这个设置非常有用。
说白了就是只要是访客用ip访问就直接500错误。但是这样好像又不太友好,如果能直接给跳转到该web server的网址就好了。配置如下:

server {
listen 80 default_server;
server_name _;
rewrite ^ http://www.piaoyun.cc$request_uri?;
}
server {          // 该段server主要就是防止别人恶意解析域名到我们的IP地址,这样直接跳转到我们自己的网站.
listen         80  default_server;
server_name _;
rewrite  ^/(.*) http://piaoyun.cc/$1 permanent;
}

这样还是有一点问题,某些特别的地址,我需要用ip访问,其他的都禁止,如何配置呢?比如说我想让监控宝直接用ip访问我的机器的nginx状态信息,其他的用ip访问的所有请求都跳转到域名上。

server {
listen 80 default_server;
server_name _;
location /xxxxx{
stub_status on;
access_log off;
}
location /{
rewrite ^ http://www.piaoyun.cc$request_uri?;
}
}

用 Nginx -t 来检测配置文件!

另外,在这里说一下server_name。server_name 是可以使用正则表达式的,这个功能因该说相当实用。

Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为:

1、准确的server_name匹配,例如:

server {
listen 80;
server_name domain.com www.domain.com;
...
}

2、以*通配符开始的字符串:

server {
listen 80;
server_name *.domain.com; ...
}

3、以*通配符结束的字符串:

server {
listen 80;
server_name www.*;
...
}

4、匹配正则表达式:

server {
listen 80;
server_name ~^(?.+)\.domain\.com$; ...
}

nginx将按照1,2,3,4的顺序对server name进行匹配,只有有一项匹配以后就会停止搜索,所以我们在使用这个指令的时候一定要分清楚它的匹配顺序(类似于location指令)。

server_name指令一项很实用的功能便是可以在使用正则表达式的捕获功能,这样可以尽量精简配置文件,毕竟太长的配置文件日常维护也很不方便。下面是2个具体的应用:
1、在一个server块中配置多个站点:

server
{
listen 80;
server_name ~^(www\.)?(.+)$;
index index.php index.html;
root /data/wwwsite/$2;
}

站点的主目录应该类似于这样的结构:
/data/wwwsite/domain.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com

这样就可以只使用一个server块来完成多个站点的配置。

2、在一个server块中为一个站点配置多个二级域名。
实际网站目录结构中我们通常会为站点的二级域名独立创建一个目录,同样我们可以使用正则的捕获来实现在一个server块中配置多个二级域名:

server
{
listen 80;
server_name ~^(.+)?\.domain\.com$; index index.html;
if ($host = domain.com){ rewrite ^ http://www.domain.com permanent; }
root /data/wwwsite/domain.com/$1/; }

站点的目录结构应该如下:

/data/wwwsite/domain.com/www//data/wwwsite/domain.com/nginx/
这样访问www.domain.com时root目录为/data/wwwsite/domain.com/www/,nginx.domain.com时为/data/wwwsite/domain.com/nginx/,以此类推。

后面if语句的作用是将domain.com的方位重定向到www.domain.com,这样既解决了网站的主目录访问,又可以增加seo中对www.domain.com的域名权重。

什么是SSI?
SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思。从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针。SSI具有强大的功能,只要使用一条简单的SSI命令就可以实现整个网站的内容更新,时间和日期的动态显示,以及执行shell和CGI脚本程序等复杂的功能。

include的是使用方法如下:红色部分是引用的文件路径!
<!--#include file="1.html" -->
<!--#include virtual="/piaoyun/html/1.html" -->

示例
<!--被包含文件与父文件存在于相同目录中。-->
<!--#include file="1.html" -->

<!--被包含文件位于脚本虚拟目录中。 -->
<!--#include virtual="/piaoyun/html/1.html" -->

include file 与include virtual的区别:
1.#include file 包含文件的相对路径,#include virtual包含文件的虚拟路径。

2. 在同一个虚拟目录内,<!--#include file="1.html"-->和<!--#include virtual="1.html"-->效果是相同的,但假设虚拟目录名为piaoyun,则<!--#include virtual="piaoyun/file.html"-->也可以通过调试,但我们知道<!--#include file="piaoyun/file.html"-->是绝对要报错的。

3.如果一个站点下有2个虚拟目录piaoyun1和 piaoyun2,piaoyun1下有文件file1.html,piaoyun2下有文件file2.html,如果file1.html要调用 file2.html,那么在file1.html中要这样写:<!--#include virtual="piaoyun2/file2.html"-->,在这种情况下用#include file是无法实现的,用<!--#include file="piaoyun2/file2.html"-->必然报错。相反,在piaoyun2的文件中包含piaoyun1中的文件也是一样。 如果该被包含文件在某个文件夹下面,只要在虚拟路径中加上该文件夹即可。

4.不论用#include file 还是 #include virtual,在路径中用“/”还是“/”或者二者交叉使用都不会影响编译效果,程序会顺利执行。

5. 以上情况不适用于2个站点文件的相互调用,而且在同一个站点内,<!--#include file="file.html"-->和<!--#include virtual="file.html"-->等效,但假设站点名为website,使用<!--#include virtual="website/file.html"-->是错误的。

nginx 内置了ssi模块,开启方法
修改 nginx 的配置文件

# vi /usr/local/nginx/conf/nginx.conf

在http{}中添加如下代码即可:
ssi on;
ssi_silent_errors on;
ssi_types text/shtml;
ssi_types text/htm;

ps.这里文件类型可以改成其他的,比如让htm也支持ssi,那么把text/shtml改成text/htm就行了,但是这样的话,由于服务器里htm的文件较多,也不一定全都用ssi引入其他页面,会给nginx造成一些不必要的消耗,所以不建议这么做。

在nginx.conf 的http里面加入如下四行(绿色部分的代码)
ssi on;
ssi_silent_errors on;
ssi_types text/shtml;
ssi_types text/htm;
server
{
listen 80;
server_name www.piaoyun.org;
index index.shtml;

apache下的配置方法:

如何使你的Apache服务器支持SSI?
1. 确认加载include.so模块,将注释去掉:
LoadModule include_module modules/mod_include.so

2. AddType部分去掉这两段注释:
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

3. Directory目录权限里面找到
Options Indexes FollowSymLinks
增加Includes修改为:
Options Indexes FollowSymLinks Includes ExecCGI MultiViews
PS:这里的ExecCGI是因为我本机的apache是以FastCGI方式加载的,所以要添加这个!

具体的安装配置方法如下:
Windows7 64位系统下面配置Apache2.2+PHP5.3+mod_fcgid运行高效的FastCGI模式安装方法
http://piaoyun.cc/windows7-apache-fastcgi-mod-fcgid.html
4. 重新启动Apache,测试:
<!--#include file=head.html”-->
Holle Word!,这是中间的内容
<!--#include file=foot.html”-->
方法一:
添加 SSI 页面的新句柄,缺省情况下,Apache 即使在需要时也不对 HTML 文件进行解析。假如将 .shtml 作为所有包含一个或多个 SSI 指令的 HTML 页面的 SSI 文件扩展名,需要告诉 Apache 将 .shtml 文件扩展名视为需要进行 SSI 解析的页面。如果因为某些原因,将 .html 和 .htm 用做 SSI 扩展名,该这样使用:
AddHandler server-parsed .html
AddType text/html .html
AddHandler server-parsed .htm
AddType text/html .htm

方法二:
添加如下信息:
AddType text/html .ssi
AddOutputFilterByType INCLUDES;DEFLATE text/html
然后保存httpd.conf,重启apache。
如果开启了虚拟主机配置文件的话,也要在相对应的虚拟主机配置文件添加如下内容:

虚拟主机配置方式:(红色部分的内容)

<VirtualHost *:60>
ServerAdmin webmaster@phpcms
DocumentRoot "D:/wwwroot/piaoyun.cc"
ServerName piaoyun.org
ErrorLog "logs/dummy-piaoyun.cc-error.log"
CustomLog "logs/dummy-piaoyun.cc-access.log" common
<Directory />
Options Indexes FollowSymLinks Includes ExecCGI MultiViews
AllowOverride All
Order deny,allow
allow from all
</Directory>
<IfModule mime_module>
AddHandler server-parsed .html
AddType text/html .html
AddHandler server-parsed .htm
AddType text/html .htm
AddHandler server-parsed .php
AddType text/html .php
</IfModule>
</VirtualHost>

如果让php也支持SSI语句,可以在虚拟机配置和httpd.conf里面都加上一行,AddOutputFilter Includes .php,如下:

<Directory />
Options Indexes FollowSymLinks Includes
AllowOverride None
AddOutputFilter Includes .php
</Directory>

保存后,重起apache即可。
PS:我在本地按照这个方法设置,PHP始终是不支持includes呢,求各位大神的解决办法!如果有好的解决办法,请在博文后给我留言!
写在最后的话:
如果你在windows下安装有mod_gzip.so模块的话,这个会和ssi与include起冲突,取消就可以了!

(20014)Internal error: Error retrieving pid file logs/httpd.pid

Remove it before continuing if it is corrupted.

其实这个错误就是因为Apache目录下的 logs 子目录下的 httpd.pid 文件内容是空的。这个文件是记录进程ID的文件。因为这个文件是空的,就无法启动,实在是超雷人。你随便写点数字进去,再启动Apache,就可以成功了:

[root@piaoyun ~]# more /usr/local/apache2/logs/httpd.pid

这个文件是空的,肯定是有问题的,增加一个数据试试!

[root@piaoyun ~]# echo "1234">>/usr/local/apache2/logs/httpd.pid

[root@piaoyun ~]# more /usr/local/apache2/logs/httpd.pid
1234

再次重启apache

[root@piaoyun ~]# service httpd start

这次ok了,继续查看/usr/local/apache2/logs/httpd.pid

[root@piaoyun ~]# more /usr/local/apache2/logs/httpd.pid
3092

可以看到,apache启动成功后,已经自动获得了一个pid值,看来apache启动的时候是会去读这个httpd.pid文件的,如果这个文件为空,就抛错了。

说明:
修改SSH的端口很大程度上能杜绝被黑客扫描,增加系统的安全系数,最近有客户修改完端口没有设置防火墙开启修改后的端口导致修改后链接不上VPS,下面教大家安全修改并在iptables里开启相应的端口:

实现:
1.修改SSH配置文件:/etc/ssh/sshd_config #找到Port 22,这里是标识默认使用22端口,修改为:
Port 22
Port 1234

/etc/init.d/sshd restart

#这样SSH端口将同时工作在22、1234上

2.添加防火墙规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 1234 -j ACCEPT

/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart

然后使用SSH工具测试你所设置的端口是否能正常使用
如果能正常使用返回到第一步,删除原来的22端口,以及修改防火墙配置文件
之所以先设置成两个端口,测试成功后再关闭一个端口,是为了方式在修改的过程中,万一出现掉线、断网、误操作等未知情况时候,还能通过另外一个端口连接上去调试以免发生连接不上的状况。

开启自动启动:chkconfig iptables on
开启不自动启动:chkconfig iptables off

附录:
设定预设规则,INPUT链默认拒绝,OUTPUT链默认接受,FORWARD链默认拒绝
iptables -F #清除预设表filter中的所有规则链的规则
iptables -X #清除预设表filter中使用者自定链中的规则
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

iptables -L -n --line #按行数显示防火墙规则
iptables -D INPUT 1 #删除INPUT表第一条

iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #来源、目的为127.0.0.1都接受,这条放最后就可以了

1、安装iptables防火墙
如果没有安装iptables需要先安装,CentOS执行:
yum install iptables

Debian/Ubuntu执行:
apt-get install iptables

2、清除已有iptables规则
iptables -F
iptables -X
iptables -Z

3、开放指定的端口
#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT

# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT (注意:如果22端口未加入允许规则,SSH链接会直接断开。)
iptables -A FORWARD -j REJECT

4、屏蔽IP
#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。

#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP

#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP

#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP

#封IP段即从123.45.6.1到123.45.6.254的命令是

iptables -I INPUT -s 123.45.6.0/24 -j DROP

5、查看已添加的iptables规则
iptables -L -n

v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M) vps侦探
n:只显示IP地址和端口号,不将ip解析为域名

6、删除已添加的iptables规则

将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8

7、iptables的开机启动及规则保存

CentOS上可能会存在安装好iptables后,iptables并不开机自启动,可以执行一下:

chkconfig --level 345 iptables on

开启自动启动:chkconfig iptables on
开启不自动启动:chkconfig iptables off

将其加入开机启动。

CentOS上可以执行:
service iptables save
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart

保存规则。

另外更需要注意的是Debian/Ubuntu上iptables是不会保存规则的。

需要按如下步骤进行,让网卡关闭是保存iptables规则,启动时加载iptables规则:

创建/etc/network/if-post-down.d/iptables 文件,添加如下内容:
#!/bin/bash
iptables-save > /etc/iptables.rules

执行:chmod +x /etc/network/if-post-down.d/iptables 添加执行权限。

创建/etc/network/if-pre-up.d/iptables 文件,添加如下内容:

#!/bin/bash
iptables-restore < /etc/iptables.rules

执行:chmod +x /etc/network/if-pre-up.d/iptables 添加执行权限。

关于更多的iptables的使用方法可以执行:iptables --help或网上搜索一下iptables参数的说明。

注:每次服务在停止之前会自动将现有的规则保存
在 /etc/sysconfig/iptables 这个文件中去.

CentOS安装好apache、mysql等服务器程序后,并没有设置成开机自动启动的,为避免重启后还要手动开启web等服务器,还是做下设置好,其实设置很简单,用chkconfig命令就行了。

例如,要开机后自动启动mysql、apache、vsftpd服务,用以下命令即可:
chkconfig mysqld on
chkconfig httpd on
chkconfig vsftpd on

要关闭自动启动的话,把on改为off就行了。
chkconfig mysqld off
chkconfig httpd off
chkconfig vsftpd off

不过要注意的是,如果某个服务尚未被添加到chkconfig列表中,则现需要使用--add参数将其添加进去:
chkconfig --add postfix

如果要查询当前所有自动启动的服务,可以输入:
chkconfig --list

但是这样显示东西太多了,看起来很晕。如果只想看指定的服务怎么办呢?这个时候只需要在“--list”之后加上服务名就好了,比如查看httpd服务是否为自动启动,就输入:
chkconfig --list httpd

这个时候输出的结果:
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off

此时0~6均为off,则说明httpd服务不会在系统启动的时候自动启动。我们输入chkconfig httpd on后,再次检查输出结果变为:
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

这个时候2~5都是on,就表明会自动启动了。

安装好了CentOS 6.4,我想让它作为一个服务器,可以让我的Windows 7电脑远程登录。
安装OpenSSH Server
首先,我们搜索一下CentOS的软件库里面有没有已经定义好的SSH服务器包:

$ yum search ssh
... ...
openssh.x86_64 : An open source implementation of SSH protocol versions 1 and 2
openssh-askpass.x86_64 : A passphrase dialog for OpenSSH and X
openssh-clients.x86_64 : An open source SSH client applications
openssh-ldap.x86_64 : A LDAP support for open source SSH server daemon
openssh-server.x86_64 : An open source SSH server daemon
... ...

OpenSSH是Secure Shell的一个开源实现。从上面的搜索结果可以看到,CentOS的软件库里面已经有了OpenSSH的服务器包(openssh-server)和客户端包(openssh-clients),用yum install可以直接安装。

$ yum install openssh-server

OpenSSH Server安装完成后在/etc/init.d目录下应该会增加一个名为sshd的服务。

$ chkconfig --list sshd
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

手动启动sshd服务,方便后面客户端的连接:
关闭: /etc/init.d/sshd stop
启动: /etc/init.d/sshd start
重启: /etc/init.d/sshd restart

1、重启后生效
开启:chkconfig sshd on
关闭:chkconfig sshd off

2、即时生效,重启后失效
开启:service sshd start
关闭:service sshd stop

今天改过服务器的php.ini文件后,发现所有的页面都不能访问,显示为:“No input file specified.”
由于要同时支持.NET,服务器采用的是IIS。我改用Apache就没有这个问题。
这个问题很让人头疼。google了一阵之后没有找到好的方法。大都是说因为CGI的安全认证问题,而使用ISAPI模块方式安装PHP则没有这个问题。可是我恰恰就是用ISAPI模块方式安装的,为什么还有这个问题?

于是把ISAPI删除,改成CGI模式安装PHP,然后修改PHP.ini文件中的cgi.force_redirect值为0,重启IIS。错误依旧。
到现在,我大致已经知道出现这个错误可能是因为没有找到PHP ISAPI模块的DLL文件,但是我配置的所有路径都正确呀!
接着试验。禁用IIS6中的php扩展,此时访问网站出现404错误。为什么会出现404错误?这是没有找到网页文件的错误呀!看来可能是配置问题了。

想起来刚才改过PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS,一切正常了。

; doc_root =

其实,在虚拟主机中配置php.ini中的doc_root,实际上没有什么意义,因为提供虚拟主机的IIS,一般都不会有实际的doc_root,而是每个虚拟主机一个root。我煞费苦心的跑去设置doc_root,实在是多此一举,浪费表情。

wget是一个命令行的下载工具。对于我们这些 Linux 用户来说,几乎每天都在使用它。下面为大家介绍几个有用的 wget 小技巧,可以让你更加高效而灵活的使用 wget。

这条命令可以下载 http://piaoyun.cc 网站上 packages 目录中的所有文件。其中,-np 的作用是不遍历父目录,-nd 表示不在本机重新创建目录结构。

$ wget -r -np -nd http://piaoyun.cc/packages/

与上一条命令相似,但多加了一个 --accept=iso 选项,这指示 wget 仅下载 i386 目录中所有扩展名为 iso 的文件。你也可以指定多个扩展名,只需用逗号分隔即可。

$ wget -r -np -nd --accept=iso http://piaoyun.cc/centos-5/i386/

此命令常用于批量下载的情形,把所有需要下载文件的地址放到 filename.txt 中,然后 wget 就会自动为你下载所有文件了。

$ wget -i filename.txt

这里所指定的 -c 选项的作用为断点续传。

$ wget -c http://piaoyun.cc/really-big-file.iso

该命令可用来镜像一个网站,wget 将对链接进行转换。如果网站中的图像是放在另外的站点,那么可以使用 -H 选项。

$ wget -m -k (-H) http://www.piaoyun.cc/

由于自己的笔记本安装的是windows7 64位的操作。所以在安装配置apache+php+mysql这个。就要安装想对应的64位版本(至于为什么要安装64位,这里不多做解释了)
FastCGI模式是经实践证明了比传统的模块模式运行效率高很多。记录如下:

一、mod_fcgid配置说明

1、首先下载 mod_fcgid-2.3.7-win64.zip,下载地址:http://www.apachelounge.com/download/win64/
将解压的相关文件复制到apache的“modules”目录下。

2、打开apache的配置文件“httpd.conf”,文件最后加入如下配置:

<IfModule fcgid_module>
FcgidInitialEnv PATH "D:/PHP/php5;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/WINDOWS/Temp"
FcgidInitialEnv TMP "C:/WINDOWS/Temp"
FcgidInitialEnv windir "C:/WINDOWS"

# 设置PHP_FCGI_MAX_REQUESTS大于或等于FcgidMaxRequestsPerProcess,防止php-cgi进程在处理完所有请求前退出
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000

#php-cgi每个进程的最大请求数
FcgidMaxRequestsPerProcess 1000

#php-cgi最大的进程数
FcgidMaxProcesses 5

#最大执行时间
FcgidIOTimeout 120
FcgidIdleTimeout 120

<Files ~ "\.php$>"
AddHandler fcgid-script .php
#php.ini的存放目录
SetEnv PHPRC "D:/PHP/php5"
#php-cgi的路径
FcgidWrapper "D:/PHP/php5/php-cgi.exe" .php
</Files>
</IfModule>

另外一个配置文件如下:来自:http://www.apachelounge.com/viewtopic.php?t=4800

<IfModule fcgid_module>
FcgidInitialEnv PATH "c:/php;C:/WINDOWS/system32;C:/WINDOWS;C:/WINDOWS/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/WINDOWS/Temp"
FcgidInitialEnv TMP "C:/WINDOWS/Temp"
FcgidInitialEnv windir "C:/WINDOWS"

FcgidIOTimeout 40
FcgidConnectTimeout 10
FcgidMaxProcesses 8
FcgidOutputBufferSize 64
ProcessLifeTime 240
FcgidMaxRequestsPerProcess 500
FcgidMinProcessesPerClass 0

<Files ~ "\.php$>"
AddHandler fcgid-script .php
#php.ini的存放目录
SetEnv PHPRC "D:/PHP/php5"
#php-cgi的路径
FcgidWrapper "D:/PHP/php5/php-cgi.exe" .php
</Files>
</IfModule>

3、告诉APACHE执行方式。修改你的配置如下:
在PHP执行目录里加上Options +ExecCGI,最好是在所有的<Directory > 里面都做修改,如果开启了vhost.conf文件,里面的配置也要做相对应的修改!

<Directory "E:/wwwroot">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>

4、重启apache。

5、如果配置没错的话,你运行phpinfo.php可以看到有如下的输出信息:
Apache/2.2.23 (Win64) mod_fcgid/2.3.7 mod_gzip/2.1.0
20131031093735_01

二、mod_fcgid概念说明以及mod_fastcgi和mod_fcgid的区别

mod_fcgid是一个跟mod_fastcgi二进制兼容的Apache module。
原来的mod_fastcgi因为实现方式的限制,所以可能会创建了很多不必要的进程,而实际上只需要更少的进程就能处理同样的请求。 mod_fastcgi的另外一个问题是每一个CGI的多个进程都共享同一个管道文件,所有到同一个fastcgi的通讯都通过这个同名的管道文件进行, 这样当出现通讯错误的时候,根本不知道正在通讯的是哪一个fastcgi,于是也没有办法将这个有问题的进程杀死。
mod_fcgid尝试使用共享内存来解决这个问题。共享内存里面有当前每个fastcgi进程的信息(包括进程号,进程使用的管道文件名等),当 每次尝试请求fastcgi工作的时候,Apache将会首先在共享内存里面查询,只有在共享内存里面发现确实没有足够的fastcgi进程了,才会创建 新的进程,这样可以保证当前创建的进程数量刚好能够处理客户的请求。另外,由于每一个fastcgi进程使用不同名称的管道文件,所以可以在通讯失败的时 候知道到底哪个fastcgi进程有问题,而能够尽早的将其剔除。

三、mod_fcgid程序实现的目标

1、跟mod_fastcgi二进制兼容
只要在Apache中用mod_fcgid替换了mod_fastcgi,就能工作。原来的fastcgi程序不用重新编译,立即可以工作。

2、更严格的控制进程的创建
Apache中每一个request handler都能通过共享内存知道当前系统fastcgi运行的情况,这样可以防止过度的创建fastcgi进程,无谓的消耗系统的资源。

3、简单清晰的进程创建速度控制策略
每一个fastcgi都会维护一个计数器,这个计数器在程序创建和程序结束的时候都会增加,而这个计数器每秒会减1,直到0。当计数器的值高于某个阀值的时候,程序就会停止创建,直到计数器的值回落。这样既可以保证在请求突然增多的时候能够快速反应(特别是Apache刚启动,需要大量创建程序的时 候),也能保证当fastcgi程序有问题,不断重起的时候,重起的速度不会过高而消耗过多的系统资源。

4、自动检测出有问题的进程
因为每个fastcgi使用自己特定的管道文件,所以在通讯错误的时候可以轻易知道哪一个程序出现问题,而尽早的将其剔除。

5、可移植性
遵照Apache2的习惯,所有可移植的代码都放到一起,所有不可移植的代码都在arch目录下分开存放。当前已经测试过的系统包括 Linux , FreeBSD(已经包含入FreeBSD4和FreeBSD5的port中), Solaris, Windows 2000.

6、支持FastCGI方式运行的PHP
可以直接支持以FastCGI方式运行的PHP。因为PHP现在还不能保证所有的扩展代码都是线程安全的,所以并不建议在Apache2的线程模式 下使用mod_php。而以FastCGI方式运行的PHP则是其中一个解决办法。另外,使用mod_fcgi还可以在不修改任何PHP代码的情况下,获得数据库连接池的功能,大大减少PHP进程到数据库的连接。

本文参考了http://fuzzytolerance.info/code/apache-mod_fcgid-and-php-on-windows/一文,套用原文作者的话,t’s tricky to set up the first time, but mod_fcgid is the best way to run PHP on Apache I’ve found。
最后记录一下64位版本的apache php的下载地址:
Apache:http://www.apachelounge.com/download/win64/ 本文所使用的64位Apache是在这个地址下载的
PHP:http://www.anindya.com/ 这个地址也有64位的Apache下载
MySQL:http://www.mysql.com 官方提供了64位的,使用在这里下载就可以了

eaccelerator.shm_size="32"
eAccelerator 可以使用的共享内存的数量 (以兆为单位) . "0" 是指操作系统的默认值. 默认值是 "0".可根据服务器的实际情况来调整,16,32,64,128都是可以的。

eaccelerator.cache_dir="/home/php/tmp"
这个目录是给磁盘缓存使用. eAccelerator 在这里储存预先编译好的代码, 进程数据, 内容以及用户的自定义内容. 同样的数据也能被储存在共享内存中 (这样可以提高访问速度). 默认的设置是 "/tmp/eaccelerator".

eaccelerator.enable="1"
开启或关闭 eAccelerator。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.optimizer="1"
启或关闭内部优化器,可以提升代码执行速度。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.check_mtime="1"
打开或者关闭 PHP 的文件修改检查. "1" 是指打开, "0" 是指关闭. 如果您在修改以后重新编译 PHP 的文件,那么您应当设置为 "1". 默认值是 "1".

eaccelerator.debug="0"
开启或关闭调试日志记录。"1" 为开启,"0" 为关闭。默认值为 "0"。会将缓存命中得记录写入日志。

eaccelerator.filter=""
判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 "*.php *.phtml"等)
如果参数以 "!" 开头,则匹配这些参数的文件被忽略缓存。默认值为 "",即,所有 PHP 文件都将被缓存。

eaccelerator.shm_max="0"
当使用 " eaccelerator_put() " 函数时禁止其向共享内存中存储过大的文件。该参数指定允许存储的最大值,单位:字节 (10240, 10K, 1M)。"0" 为不限制。默认值为 "0"。

eaccelerator.shm_ttl="0"
当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在最后 "shm_ttl" 秒内没有存取的脚本缓存。默认值为 "0",即:不从共享内春中删除任何缓存文件。

eaccelerator.shm_prune_period="0"
当 eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于"shm_prune_period" 秒的缓存脚本。默认值为 "0",即:不从共享内春中删除任何缓存文件。

eaccelerator.shm_only="0"
允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认值为 "0",即:使用磁盘和共享内存进行缓存。

eaccelerator.compress="1"
允许或禁止压缩内容缓存。默认值为 "1",即:允许压缩。

eaccelerator.compress_level="9"
指定内容缓存的压缩等级。默认值为 "9",为最高等级。

eaccelerator.keys = "disk_only"
eaccelerator.session = "disk_only"
eaccelerator.content = "disk_only"
设置内容缓存的存放的地方,可以设置为:
shm_and_disk 在共享缓存和硬盘(默认值)
shm 默认存在共享内存,如果共享内存已满或大小超过 "eaccelerator.shm_max" 的值,就存到硬盘
shm_only 只存放在共享内存
disk_only 只存放在硬盘
none 不缓存数据

eaccelerator.allowed_admin_path = "/var/www/html/piaoyun.cc/eaccelerator"
这是控制面板的地址
安装包里有个control.php,你把它复制到网站的任意目录,可以用它查看和管理,这个必须指定,否则查看缓存内容的时候会出错

最后,来看一下我的 eAccelerator 设置

; eaccelerator
[eaccelerator]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so"
eaccelerator.shm_size="128"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="3600"
eaccelerator.shm_prune_period="3600"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"
eaccelerator.keys = "disk_only"
eaccelerator.sessions = "disk_only"
eaccelerator.content = "disk_only"
eaccelerator.allowed_admin_path = "/var/www/html/piaoyun.cc/eaccelerator"

另外,再说下 eAccelerator 的安装

# wget http://bart.eaccelerator.net/source/0.9.6/eaccelerator-0.9.6.tar.bz2
# tar -jxvf eaccelerator-0.9.6.tar.bz2
# cd eaccelerator-0.9.6
# /usr/local/php/bin/phpize
# ./configure --enable-eaccelerator=shared --with-php-config=/usr/local/php/bin/php-config
# make && make install

第一部分 如何配置阵列
开机自检过程中有Ctrl+A提示:《阵列卡不同,按键组合也不同,也有Ctrl+H的,这个主要根据阵列卡来的,不过,系统启动的时候都有提示的,看屏幕就行了》
20131031084231_01

按下组合键Ctrl+A进入配置程序。
20131031084231_02

ARC是内嵌的BIOS的程序,您可以通过它配置ServeRAID-8k-l/8k/8i SAS 控制器.其包括:
Array Configuration Utility (ACU) - 创建,配置,管理逻辑驱动器.也可以对驱动器进行初始化及重新扫描.
Serial Select - 改变设备及控制器的设置
Disk Utilities–格式化或校验媒体设备
961933_132349762195C6

配置阵列,选择Array Configuration Utility一项回车,出现如下界面:
下面文档列举了如何配置Raid1。其他阵列级别配置方法相同。
第一步:新拆箱的服务器在配置阵列之前先进行初始化。注:初始化会全清掉您硬盘上的数据和阵列信息,操作时请阅读警告提示。
初始化硬盘
1.选择Initialize Drives ,新硬盘都是需要初始化才能被使用的,所以如果你的硬盘是新的就必须进行初始化
20131031084232_03

2.使用空格键把要初始化的硬盘选择到右边的方框中:
20131031084232_04

3.按“Enter”回车键继续下一步
4.弹出警告红色框按“Y”键接受提示警告,继续
20131031084232_05

5.开始初始化,等待进程完成:
20131031084232_06

6.完成后自动返回创建阵列总菜单。
1.初始化硬盘后,选择Create Arrays创建阵列:
20131031084233_07

2. 用I空格键选择1和2块硬盘,回车
20131031084233_08

3.按回车进入阵列配置菜单:
20131031084233_09

3. Array Label输入阵列标识(名字任意,符合8.3原则):注Array Label可以不填,但如果配置多个阵列,则后面的阵列必须写。
20131031084233_10

4. Array Size默认回车,Create RAID via一项选择Quick Init,
20131031084233_11

5. 然后在Done上回车,结束配置,等待创建进程,
20131031084234_12

6.完成后返回总创建菜单。
选择“Manage Arrays”查看建好的阵列状态。
在选好的阵列上按回车
20131031084234_13

以上,其他阵列跟这个一样,
第二部分 其他操作
1.删除阵列
1.1 选择“Manage Arrays”右边列出的阵列表中,用上下键选择要删除的阵列。
20131031084234_14

1.2 按“Del”键,弹出阵列属性菜单
20131031084234_15

1.3选择“Delet”回车,弹出警告菜单。
20131031084234_16

1.4 认真阅读警告消息,接受按“Y”,拒绝按“N”退出。确认删除按“Y”继续删除。
等待进程完成后,返回总菜单。阵列已经被删除。
如何选择第一引导阵列(选择哪个阵列为第一引导启动阵列):
如图所示,现在引导启动的阵列为raid1,签名的“*”标识为第一启动阵列
20131031084235_17

选择要标识为第一引导启动的阵列(例,我要把阵列名为VOLUME的阵列设为第一引导阵列),并按下“Ctrl+B”,如下图
20131031084235_18

完成后如图:
20131031084235_19

注:在做此操作之前,用户务必确认自己要把操作系统装于那个阵列之上,否则可能引起混乱,系统无法引导。

备注:
RAID10,RAID5 RAID6级别的配置并没有明显的区别。
注意:RAID0,至少1块儿硬盘
RAID1默认要求2块
RAID5至少3块硬盘或更多。
RAID6 至少4块硬盘以上。
如果您只有一块硬盘,加了8系列阵列卡按照要求做一个Volume(简单卷)就可以。一块硬盘也要创建阵列否则无法安装系统。这个很重要!

通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里。但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override ,即

< Directory />
AllowOverride None
< /Directory>

在 AllowOverride 设置为 None 时, .htaccess 文件将被完全忽略。当此指令设置为 All 时,所有具有 “.htaccess” 作用域的指令都允许出现在 .htaccess 文件中。
而对于 URL rewrite 来说,至少需要把目录设置为

< Directory /myblogroot/>
AllowOverride FileInfo
< /Directory>

AllowOverride的参数:
AuthConfig:允许使用与认证授权相关的指令(AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, 等)。

FileInfo:允许使用控制文档类型的指令(DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter, mod_mime中的 Add* 和 Remove* 指令等等)、控制文档元数据的指令(Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName)、mod_rewrite中的指令(RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule)和mod_actions中的Action指令。

Indexes:允许使用控制目录索引的指令(AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, 等)。

Limit 允许使用控制主机访问的指令(Allow, Deny, Order)。Options[=Option,...] 允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。

如果要多个权限组合使用,用这样的格式写就行了:
AllowOverride AuthConfig Indexes

越来越多的站长,开始使用独立主机(Dedicated Host)和 VPS。而为了节省成本或提高性能,不少人的独机和 VPS,都是基于unmanaged的裸机,一切都要自己 DIY。这时候,安全策略的实施,就犹为重要。我以 CentOS 为例,简单地总结一下如何配置 SSH 安全访问。
Linux SSH 安全策略一:关闭无关端口
网络上被攻陷的大多数主机,是黑客用扫描工具大范围进行扫描而被瞄准上的。所以,为了避免被扫描到,除了必要的端口,例如 Web、FTP、SSH 等,其他的都应关闭。值得一提的是,我强烈建议关闭 icmp 端口,并设置规则,丢弃 icmp 包。这样别人 Ping 不到你的服务器,威胁就自然减小大半了。丢弃 icmp 包可在 iptables 中, 加入下面这样一条:
-A INPUT -p icmp -j DROP

Linux SSH 安全策略二:更改 SSH 端口
默认的 SSH 端口是 22。强烈建议改成 10000 以上。这样别人扫描到端口的机率也大大下降。修改方法:
# 编辑 /etc/ssh/ssh_config
vi /etc/ssh/ssh_config

# 在 Host * 下 ,加入新的 Port 值。以 18439 为例(下同):
Port 22
Port 18439

# 编辑 /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
#加入新的 Port 值
Port 22
Port 18439

# 保存后,重启 SSH 服务:
service sshd restart

这里我设置了两个端口,主要是为了防止修改出错导致 SSH 再也登不上。更改你的 SSH 客户端(例如:Putty)的连接端口,测试连接,如果新端口能连接成功,则再编辑上面两个文件,删除 Port 22 的配置。如果连接失败,而用 Port 22 连接后再重新配置。
端口设置成功后,注意同时应该从 iptables 中, 删除22端口,添加新配置的 18439,并重启 iptables。
如果 SSH 登录密码是弱密码,应该设置一个复杂的密码。Google Blog 上有一篇强调密码安全的文章:Does your password pass the test?

Linux SSH 安全策略三:限制 IP 登录
如果你能以固定 IP 方式连接你的服务器,那么,你可以设置只允许某个特定的 IP 登录服务器。例如我是通过自己的 VPN 登录到服务器。设置如下:
# 编辑 /etc/hosts.allow
vi /etc/hosts.allow
# 例如只允许 123.45.67.89 登录
sshd:123.45.67.89

Linux SSH 安全策略四: 使用证书登录 SSH
相对于使用密码登录来说,使用证书更为安全。
为CentOS配置SSH证书登录验证
下午帮公司网管远程检测一下邮件服务器,一台CentOS 5.1,使用OpenSSH远程管理。
检查安全日志时,发现这几天几乎每天都有一堆IP过来猜密码。看来得修改一下登录验证方式,改为证书验证为好。
为防万一,临时启了个VNC,免得没配置完,一高兴顺手重启了sshd就麻烦了。(后来发现是多余的,只要事先开个putty别关闭就行了)
以下是简单的操作步骤:
1)先添加一个维护账号:msa
2)然后su - msa
3)ssh-keygen -t rsa
指定密钥路径和输入口令之后,即在/home/msa/.ssh/中生成公钥和私钥:id_rsa id_rsa.pub

4)cat id_rsa.pub >> authorized_keys
至于为什么要生成这个文件,因为sshd_config里面写的就是这个。
然后chmod 400 authorized_keys,稍微保护一下。
5)用psftp把把id_rsa拉回本地,然后把服务器上的id_rsa和id_rsa.pub干掉
6)配置/etc/ssh/sshd_config
Protocol 2
ServerKeyBits 1024
PermitRootLogin no #禁止root登录而已,与本文无关,加上安全些
#以下三行没什么要改的,把默认的#注释去掉就行了
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
PermitEmptyPasswords no

7)重启sshd
/sbin/service sshd restart
8)转换证书格式,迁就一下putty
运行puttygen,转换id_rsa为putty的ppk证书文件
9)配置putty登录
在connection--SSH--Auth中,点击Browse,选择刚刚转换好的证书。
然后在connection-Data填写一下auto login username,例如我的是msa
在session中填写服务器的IP地址,高兴的话可以save一下

10)解决一点小麻烦
做到这一步的时候,很可能会空欢喜一场,此时就兴冲冲的登录,没准登不进去:
No supported authentication methods available
这时可以修改一下sshd_config,把
PasswordAuthentication no 临时改为:PasswordAuthentication yes 并重启sshd
这样可以登录成功,退出登录后,再重新把PasswordAuthentication的值改为no,重启sshd。
以后登录就会正常的询问你密钥文件的密码了,答对了就能高高兴兴的登进去。
至于psftp命令,加上个-i参数,指定证书文件路径就行了。
如果你是远程操作服务器修改上述配置,切记每一步都应慎重,不可出错。如果配置错误,导致 SSH 连接不上,那就杯具了。
基本上,按上述四点配置好后,Linux 下的 SSH 访问,是比较安全的了。当然,安全与不安全都是相对的,你应该定期检查服务器的 log,及时发现隐患并排除。

Apache 的日志默认是直接写入一个独立的 log 文件。如果网站流量大,日志文件很快就会变得很庞大;而 AWStats 等日志分析软件,要求日志文件以天的格式保存。Cronolog 正好可以解决这个问题:它可以对 Apache 的日志按需要进行截断处理(cronolog 也是Apache推荐使用的日志工具之一),是使用 AWStats 进行日志分析的基础。这是 Cronolog 官方网站上的介绍:
Cronolog is a simple filter program that reads log file entries from standard input and writes each entry to the output file specified by a filename template and the current date and time. When the expanded filename changes, the current file is closed and a new one opened. cronolog is intended to be used in conjunction with a Web server, such as Apache, to split the access log into daily or monthly logs.
简单地说明一下 cronolog 在 Windows + Apache 下的安装:
首先到 Cronolog 的网站:http://www.cronolog.org/ 下载。注意应该下载 Win 32 version (ZIP file) 的版本。目前最新的 win 32 version 是 1.6.1。
将 zip 文件下载之后,将 cronolog.exe 解压并复制到 Apache 的 bin 目录
在 apache 的配置文件 httpd.conf 中, 修改以下代码:

CustomLog "|bin/cronolog.exe D:/LogFiles/access_%Y%m%d.log" combined
ErrorLog "|bin/cronolog.exe D:/LogFiles/error_%Y%m%d.log"

也可以在虚拟主机配置中使用,例如:

<VirtualHost *:80>
ServerName www.piaoyun.cc
CustomLog "|bin/cronolog.exe D:/LogFiles/piaoyun.cc/access_%Y%m%d.log" combined
ErrorLog "|bin/cronolog.exe D:/LogFiles/piaoyun.cc/error_%Y%m%d.log"
</VirtualHost>

重新启动 Apache.
其中 D:/LogFiles 表示你的log存放的路径;|bin/cronolog.exe为cronolog所在的路径,可以通过 which cronolog 的命令来查看;%Y_%m_%d表示按照年月日来分割,这样一个月就会生成一个日志文件,如果要按照每天生成一个日志文件,是%Y%m%d
然后重启一下apache,就会发现apache日志开始按照日期生成,而原来的apache日志文件就不会再记录新的访问数据了。
其他设置说明,请见下载包中的 README 文件。
Linux下的配置文件说明:

CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/%Y_%m_%d.access.log" combined

这里是按照每天来生成日志的
其中,/home/apache/logs 表示你的log存放的路径;/usr/local/sbin/cronolog为cronolog所在的路径,可以通过 which cronolog 的命令来查看;%Y_%m_%d表示按照年月日来分割,这样一个月就会生成一个日志文件,如果要按照每天生成一个日志文件,是%Y%m%d
然后重启一下apache,就会发现apache日志开始按照日期生成,而原来的apache日志文件就不会再记录新的访问数据了。

504 Gateway Time-out问题常见于使用nginx作为web server的服务器的网站

我遇到这个问题是在升级discuz论坛的时候遇到的!

一般看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲区太小造成的, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这个挂起处理的不好, 那么最后就极有可能导致504 Gateway Time-out
现在的网站, 尤其某些论坛有大量的回复和很多内容的, 一个页面甚至有几百K
默认的fastcgi进程响应的缓冲区是8K, 我们可以设置大点
在nginx.conf里, 加入:

fastcgi_buffers 8 128k

这表示设置fastcgi缓冲区为8×128k
当然如果您在进行某一项即时的操作, 可能需要nginx的超时参数调大点, 例如设置成60秒:

send_timeout 60;

我只是调整了这两个参数, 结果就是没有再显示那个超时, 可以说效果不错, 但是也可能是由于其他的原因, 目前关于nginx的资料不是很多, 很多事情都需要长期的经验累计才有结果, 期待您的发现哈!

之前,头一次在Windows Server安装这样的环境,系统运行不久后,就经常发生httpd.exe 的Memory Leak. 在网上找了很久,这个问题终于解决了,httpd.conf配置如下:

<IfModule mpm_winnt.c> 
Win32DisableAcceptEx
ThreadsPerChild 100
MaxRequestsPerChild 1000
MaxMemFree 16
ThreadLimit 100
ThreadStackSize 8192
KeepAliveTimeout 2
MaxKeepAliveRequests 10
</IfModule>

如此设置成功后,不要使用“restart", 因为使用restart的话,Apache只会停掉child thread, 再将老的parent thread复制后,生成一个新的child thread. 也就是说:你的threads设置没有生效。解决的办法是:Stop Sevice(别太心疼停服务),然后再Start Service。这样,parent tread就是一个新的进程号了,如果你不相信,可以在stop前、后,使用如下命令测试:

tasklist /FI "imagename eq httpd.exe"

当设置生效后,你就会从error.log中看到如下内容:
[Thu May 19 22:47:13 2012] [notice] Apache/2.2.4 (Win32) configured -- resuming normal operations
[Thu May 19 22:47:13 2012] [notice] Server built: Jan 9 2007 23:17:20
[Thu May 19 22:47:13 2012] [notice] Parent: Created child process 3752
[Thu May 19 22:47:13 2012] [notice] Disabled use of AcceptEx() WinSock2 API
[Thu May 19 22:47:13 2012] [notice] Child 3752: Child process is running
[Thu May 19 22:47:13 2012] [notice] Child 3752: Acquired the start mutex.
[Thu May 19 22:47:13 2012] [notice] Child 3752: Starting 100 worker threads.
[Thu May 19 22:47:13 2012] [notice] Child 3752: Listening on port 80.
[Thu May 19 22:48:00 2012] [error] [client 222.178.216.188] Invalid URI in request Connection: Keep-Alive
[Thu May 19 22:49:54 2012] [notice] Child 3752: Process exiting because it reached MaxRequestsPerChild. Signaling the parent to restart a new child process.
[Thu May 19 22:49:54 2012] [notice] Parent: Received restart signal -- Restarting the server.
[Thu May 19 22:49:54 2012] [notice] Apache/2.2.4 (Win32) configured -- resuming normal operations
[Thu May 19 22:49:54 2012] [notice] Server built: Jan 9 2007 23:17:20
[Thu May 19 22:49:54 2012] [notice] Parent: Created child process 1756
[Thu May 19 22:49:54 2012] [notice] Disabled use of AcceptEx() WinSock2 API
[Thu May 19 22:49:54 2012] [notice] Child 1756: Child process is running
[Thu May 19 22:49:55 2012] [notice] Child 3752: Released the start mutex
[Thu May 19 22:49:55 2012] [notice] Child 1756: Acquired the start mutex.
[Thu May 19 22:49:55 2012] [notice] Child 1756: Starting 100 worker threads.
[Thu May 19 22:49:55 2012] [notice] Child 3752: Waiting for 100 worker threads to exit.
[Thu May 19 22:49:55 2012] [notice] Child 1756: Listening on port 80.
[Thu May 19 22:50:03 2012] [notice] Child 3752: All worker threads have exited.
[Thu May 19 22:50:03 2012] [notice] Child 3752: Child process is exiting
注意:
当达到MaxRequestsPerChild时,apache的parent thread会启动一个新的child thread,这时你的系统中会停有3个httpd.exe进程,直到上一个进程的所有child thread都结速后,进程才会退出。
另外,上面的error log级别是:LogLevel warn

解决方法:

如果要避免丢失阵列信息,那么在安装新硬盘之前,要按照下面的方法对其进行初始化:
1、关闭服务器的电源;
2、拔掉服务器上所有现有的硬盘;
3、插入这个新的硬盘;
4、启动服务器;
5、在加电自检过程中,在看到Adaptec SAS RAID BIOS检测并提示如下信息时按Ctrl-A:
Press <Ctrl><A> for IBM ServeRAID
Configuration Utility!
Booting the Controller Kernel....../
6、在IBM ServeRAID Configuration Utility Options选项窗口中,选择"Array Configuration Utility";
7、在Main Menu主菜单中,选择"Initialize Drives"并按Enter;
8、按空格键来选择需要被初始化的硬盘(硬盘前面的编号,最后的数字是代表机器上面的数字,注意不要选择错了硬盘!),这些硬盘将会从左边的窗口移动到右边的窗口中,然后按Enter;
9、当出现警告提示时按Y;
10、预计每块硬盘需要用5-10秒来进行初始化,当所有的硬盘都初始化完成后,Main Menu主菜单将会显示出来;
11、按Escape退出IBM ServeRAID Configuration Utility界面;

系统重新启动;
12、在加电自检的开始,当看到IBM Logo标志显示时,关闭服务器;
13、重新安装上以前移走的硬盘;
14、那个新的硬盘可以随后安装或以后再安装;
15、启动服务器;
16、在显示Adaptec SAS RAID BIOS的界面时,将会看到下列信息:New devices detected at the following SAS Phys: (listing of reinserted devices)
17、按Enter回车接受当前的阵列配置;

相关文件可以在网站"Servers -ServeRAID Software Matrix"上获得,

详细信息:
当一块硬盘作为阵列的一部分后,每块硬盘都要被写上阵列配置信息的元数据。如果一块带有元数据的硬盘被安装到一个现有的阵列中,这个现有的阵列上的元数据就会被破坏并且这个阵列将会变得无法被系统使用。
在把一块硬盘插入到一个现有的阵列之前,一定要确认通过上述的初始化的步骤把所有的以前存在的元数据都要从这块硬盘上清除掉。

因为博客是使用了Www.PiaoYun.CC作为博客域名,所以想实现PiaoYun.CC全部重定向(跳转)到Www.PiaoYun.CC。同时按照google的建议,使用服务器端 301 重定向,为了确保用户及搜索引擎定向至正确网页的最佳方法。301 状态代码表示某网页已被永久迁移至新位置。下面将了解一下apache下实现301永久性重定向2个方法,需要具有访问服务器的 .htaccess 文件的权限。

1. Apache模块 mod_alias的 Redirect 和 RedirectMatch命令
上面提到2个命令使用方法相似。而区别就是后者RedirectMatch基于正则表达式匹配对当前的URL发送一个外部重定向语法为:
Redirect [status] URL-path URL
RedirectMatch [status] regex URL
status参数可以使用以下HTTP状态码:
permanent 返回一个永久性重定向状态码(301),表示此资源的位置变动是永久性的。
temp 返回一个临时性重定向状态码(302),这是默认值。
seeother 返回一个“参见”状态码(303),表示此资源已经被替代。
gone 返回一个“已废弃”状态码(410),表示此资源已经被永久性地删除了。如果指定了这个状态码,则URL参数将被忽略。

举例:

Redirect 301 /old/old.htm http://Www.PiaoYun.CC/new.htm
Redirect permanent /one http://PiaoYun.CC/two
RedirectMatch 301 (.*).gif$ http://Www.PiaoYun.CC/images/$1.jpg

2.使用mod_rewrite重写URL方式
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^PiaoYun.CC
RewriteRule ^(.*)$ http://Www.PiaoYun.CC/$1 [R=permanent,L]
在这里判断当前服务器变量HTTP_HOST是否等于PiaoYun.CC,为真就进行重写,按照R=permanent进行永久重定向,L表示并立即停止重写操作,并不再应用其他重写规则
下面是我最终实现的.htaccess文件,同时也并入wordpress重写规则。

<IfModule mod_rewrite.c>
RewriteEngine On
#Redirect
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^PiaoYun.CC$
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^(.*)$ http://Www.PiaoYun.CC/$1 [R=301,L]
#Rewrite(blog)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^blog/.* /blog/index.php [L]
RewriteRule . -
</IfModule>

Windows下面安装Apache服务,建立多域名访问指向,默认设置的话,如果别人把域名指向你的IP,就会访问你的默认的站点,下面的设置可以禁止访问。

<VirtualHost 您的ip地址:80>
ServerAdmin 您的ip地址
ServerName 您的ip地址
DocumentRoot "E:\piaoyun.cc\default"
ErrorLog "|bin/cronolog.exe D:/LogFiles/default/error_piaoyun.cc_%Y%m%d.log" 
CustomLog "|bin/cronolog.exe D:/LogFiles/default/access_piaoyun.cc_%Y%m%d.log" combined 
<Directory "E:\piaoyun.cc\default">
AllowOverride None
Options Indexes FollowSymLinks
Order Deny,Allow
Allow from all
</Directory>
</VirtualHost>

这样通过IP,或者没有在配置时添加的域名就直接访问到default目录下面,你可以放个提示文件,或者把 Allow from all 修改为 Deny from all 禁止访问。

默认情况下,如果你的网站下有一个a的文件夹,如果些文件夹下没有默认页面,当用户http://你的网址/a/ 即apache会把此文件夹角的内容全列出来。
如果想禁止此功能,修改httpd.conf
方法一:找到下面这一句把它注释掉即可
Options Indexes FollowSymLinks
修改删除上面代码中的Indexes也可以禁止列目录

 

方法二,首先修改 httpd.conf 配置文件:httpd.conf
查找 Options Indexes FollowSymLinks
修改为 Options -Indexes

 

方法三,在www 目录下的修改 .htaccess 配置文件:
加入 Options -Indexes

允许目录列表显示: Options +Indexes
禁止目录列表显示: Options -Indexes

建议默认情况下,设置APACHE禁止用户浏览目录内容。