3. 虚拟主机配置文件(httpd-vhosts.conf) 7
4. 多路处理模块(MPM)(httpd-mpm.conf) 7
5. 配置Apache服务器默认设置 httpd-default.conf 9
cronolog语法:/path/to/cronolog [OPTIONS] logfile-spec 11
7. 强制Apache Web服务器始终使用https 15
3. mod_deflate模块在apache中的应用 16
4. mod_expires模块在apache中的应用 17
15. 利用Cookie和rewrite实现Apache防盗链下载 21
官方网站:http://httpd.apache.org/
Apache HTTP Server(简称Apache)是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中
Apache源于NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定等(静态小文件),并可做代理服务器来使用。
功能强大、简单、速度快、应用广泛、性能靠靠稳定,并可做代理服务器或负载均衡器来使用。
使用Apache运行静态HTML网页、图片(处理静态小文件能力不如Nginx)
使用Apache结合PHP引擎运行PHP、Perl等程序,LAMP被成为经典组合
使用Apache结合Tomcat/Resin运行JSP、JAVA等程序,成为中小企业的首选
使用Apache做代理、负载均衡、rewrite规则过滤等等
一般来说,系统默认的Apache或RPM包安装的Apache版本都比较低,应该卸载掉并安装最新的稳定版。
rpm -aq httpd
rpm -e --nodeps httpd
yum install -y zlib zlib-devel openssl-devel
mkdir /server/tools
cd /server/tools/
wget http://archive.apache.org/dist/httpd/httpd-2.2.27.tar.gz
tar zxvf httpd-2.2.27.tar.gz
cd httpd-2.2.27
编译参数:
./configure \
--prefix=/application/apache2.2.27 \
--enable-deflate \
--enable-expires \
--enable-headers \
--enable-modules=most \
--enable-so \
--enable-ssl \
--with-mem=worker \
--enable-rewrite
make
make install
ln -s /application/apache2.2.27/ /application/apache
错误1:
checking for zlib location... not found
checking whether to enable mod_deflate... configure: error: mod_deflate has been requested but can not be built due to prerequisite failures
解决办法:yum install -y zlib zlib-devel
[root@liwenbin conf]# /application/apache/bin/apachectl -t #检查语法错误
错误1:
/application/apache/bin/apachectl -t
httpd: Could not reliably determine the server's fully qualified domain name, using 219.146.13.36 for ServerName
Syntax OK
/application/apache/bin/apachectl start #启动服务
httpd: Could not reliably determine the server's fully qualified domain name, using 219.146.13.36 for ServerName
解决办法
vi /application/apache/conf/httpd.conf 编辑配置文件,修改
#ServerName www.example.com:80为ServerName 127.0.0.1:80或ServerName localhost:80或ServerName 主机名:80。也可以不用修改,其实服务已经启动,上面仅仅为提示
sed -i "s#\#ServerName www.example.com:80#ServerName 127.0.0.1:80#g" httpd.conf
/application/apache/bin/apachectl start #启动服务
netstat -lntup|grep 80
lsof -i :80
ps -ef|grep httpd
/etc/init.d/iptables stop
命令前加strace查看命令执行的详细过程,例如
strace /application/apache/bin/apachectl -l #查看编译的参数
grep -i documentroot httpd.conf
# DocumentRoot: The directory out of which you will serve your
DocumentRoot "/application/apache2.2.27/htdocs"
# This should be changed to whatever you set DocumentRoot to.
# access content that does not live under the DocumentRoot.
[root@liwenbin apache]# tree -L 1 ./bin
./bin # 程序命令目录
├── ab # apache http服务器性能压力测试工具,类似的jmeter、loadrunner、webbench
├── apachectl # apache的启动命令
├── apxs # apache服务器编译和安装扩展的工具,在进行dso方式模块编译时会用到。
# 例如编译php时就用到:--with-apxs2=/usr/local/apache/bin/apxs
├── htcacheclean # 清理磁盘缓存区的命令,一般少用
├── htpasswd # 建立和更新基本认证文件.例如配置nagio监控时候会用到
├── httpd # 为apache的控制命令程序,apachectl执行的时候会调用到httpd
└── rotatelogs # apache自带日志轮询工具 ,也可以用到cronolog代替。
[root@liwenbin apache]# tree -L 1 ./conf
./conf # 配置文件目录
├── extra #额外的Apache配置文件目录
├── httpd.conf #Apache的主配置文件
[root@liwenbin apache]# tree -L 1 ./htdocs/
./htdocs/ #编译安装时默认站点目录
└── index.html #编译安装时默认首页文件
[root@liwenbin apache]# tree -L 1 ./logs/
./logs/ #默认日志文件存放
├── access_log # 访问日志
├── error_log # 错误日志
└── httpd.pid # 记录主进程号
[root@liwenbin apache]# tree -L 1 ./modules/
./modules/ #Apache的模块目录,比如php、memcache等模块编译后都在这里
└── httpd.exp
[root@liwenbin apache]# tree -L 1 ./conf/extra/
./conf/extra/
├── httpd-autoindex.conf
├── httpd-dav.conf #dav支持配置
├── httpd-default.conf # 相关的服务参数如超时时间,保持连接时间等
├── httpd-info.conf
├── httpd-languages.conf #语言支持配置
├── httpd-manual.conf
├── httpd-mpm.conf #服务器池管理。如选择apache模式及配置连接数
├── httpd-multilang-errordoc.conf
├── httpd-ssl.conf #SSL支持配置
├── httpd-userdir.conf
└── httpd-vhosts.conf #虚拟主机配置
[root@backup conf]# egrep -v "#|^$" httpd.conf|nl
1 ServerRoot "/application/apache2.2.27" # apache根目录,应只能root访问,一般不需要修改
2 Listen 80 # apache监听端口,墨认80,如果同时监控81可以加一行:Listen 81
3 <IfModule !mpm_netware_module>
4 <IfModule !mpm_winnt_module>
5 User daemon # apache的用户,默认为daemon,建议修改,如apache
6 Group daemon # apache的用户组,默认为daemon,建议修改,如apache
7 </IfModule>
8 </IfModule>
9 ServerAdmin you@example.com # 系统管理员的邮箱,此项为非重要选项,当网站出现问题时,面面会显示此页面地址
10 DocumentRoot "/application/apache2.2.27/htdocs" #apache默认的web站点目录,路径结尾不要添加斜线
#11-16 行,对根目录的控制
11 <Directory />
12 Options FollowSymLinks #FollowSymLinks表示允许使用符号连接,没加的选项默认为禁用
13 AllowOverride None #禁止用户对目录配置文件(.htaccess)重载。普通站点建议不开
14 Order deny,allow #deny优先,没有明确说拒绝都将通过,类似去商场,随便进,除非保安不让进(即下面的拒绝规则)
15 Deny from all #明确指出,拒绝所有访问
16 </Directory>
# 17-22对默认apache站点目录限制配置,如果读者配置了新站点目录而没配置这里会出现403错误
17 <Directory "/application/apache2.2.27/htdocs">
18 Options Indexes FollowSymLinks #Indexes表示允许目录浏览,这很危险,应取消掉
19 AllowOverride None
20 Order allow,deny #allow优先,没有明确允许都拒绝访问,类似去电影院,没票不能进,必须要有票 Apache优化,应该去掉或前面加-
21 Allow from all #明确指出,允许所有访问
站点目录必须授权模块
22 </Directory>
23 <IfModule dir_module>
24 DirectoryIndex index.html #配置默认的apache首页,如果虚拟主机未配置,默认应用这里的配置。可以有多个,以空格隔开,调用时前面优先匹配
25 </IfModule>
26 <FilesMatch "^\.ht"> #防止.htaccess和.htpasswd等重要隐藏文件被用户查看
27 Order allow,deny
28 Deny from all
29 Satisfy All
30 </FilesMatch>
31 ErrorLog "logs/error_log" #错误日志路径
32 LogLevel warn
33 <IfModule log_config_module>
34 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
35 LogFormat "%h %l %u %t \"%r\" %>s %b" common #普通访问日志格式
36 <IfModule logio_module>
37 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
38 </IfModule>
39 CustomLog "logs/access_log" common #默认站点访问日志配置
40 </IfModule>
#41-51行为cgi配置,没有特殊需求应考虑全部注掉或者干脆删了
41 <IfModule alias_module>
42 ScriptAlias /cgi-bin/ "/application/apache2.2.27/cgi-bin/"
43 </IfModule>
44 <IfModule cgid_module>
45 </IfModule>
46 <Directory "/application/apache2.2.27/cgi-bin">
47 AllowOverride None
48 Options None
49 Order allow,deny
50 Allow from all
51 </Directory>
52 DefaultType text/plain #定义当不能确定MIME类型时服务器提供的默认值
53 <IfModule mime_module>
54 TypesConfig conf/mime.types
55 AddType application/x-compress .Z
56 AddType application/x-gzip .gz .tgz
57 </IfModule>
58 <IfModule ssl_module>
59 SSLRandomSeed startup builtin
60 SSLRandomSeed connect builtin
61 </IfModule>
[root@liwenbin extra]# egrep -v "#|^$" httpd-vhosts.conf|nl
1 NameVirtualHost *:80 #表示使用基于名称的虚拟主机配置。*表示本机所有IP,可以改成具体IP
2 <VirtualHost *:80> #定义一个虚拟主机,监听本机所有IP地址的80端口
3 ServerAdmin webmaster@dummy-host.example.com #管理员信箱,如果没有找主配置文件
4 DocumentRoot "/application/apache2.2.27/docs/dummy-host.example.com" #站点目录
5 ServerName dummy-host.example.com #域名
6 ServerAlias www.dummy-host.example.com #别名
7 ErrorLog "logs/dummy-host.example.com-error_log" #错误日志
8 CustomLog "logs/dummy-host.example.com-access_log" common #访问日志
9 </VirtualHost>
[root@liwenbin extra]# egrep -v "#|^$" httpd-mpm.conf|nl
1 <IfModule !mpm_netware_module>
2 PidFile "logs/httpd.pid" #主进程ID文件
3 </IfModule>
4 <IfModule !mpm_winnt_module>
5 <IfModule !mpm_netware_module>
6 LockFile "logs/accept.lock" #锁文件
7 </IfModule>
8 </IfModule>
##设置prefork多路处理模块(如果没有指定会默认)
9 <IfModule mpm_prefork_module>
10 StartServers 5 #StartServers:设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数
11 MinSpareServers 5 #设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意
12 MaxSpareServers 10 #设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进 程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"
13 MaxClients 150 #用于伺服客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是150,如果要提高这个值必须同时提高ServerLimit的值。笔者建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
14 MaxRequestsPerChild 0 #设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏 无限进行而耗尽内存;给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。 如果设置为非零值,笔者建议设为10000-30000之间的一个值。
15 </IfModule>
公式: MaxClients<=ServerLimit
#设置worker多路处理模块
16 <IfModule mpm_worker_module>
17 StartServers 2 #StartServers:设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所有一般没有必要调整这个参数。
18 MaxClients 150 #用于伺服客户端请求的最大接入请求数量(最大线程数)。任何超过MaxClients限制的请求都将进入等候队列。默认值 是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加 ServerLimit的值。笔者建议 将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是4000/2=2000。
19 MinSpareThreads 25 #最小空闲线程数,默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少, 子进程将产生新的空闲线程。
20 MaxSpareThreads 75 #设置最大空闲线程数。默认值是"70"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数 太多,子进程将杀死多余的空闲线程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和。
21 ThreadsPerChild 25 #每个子进程建立的线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。每个子进程所拥 有的所有线程的总数要足够大,以便可以处理可能的请求高峰。
22 MaxRequestsPerChild 0 设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结 束。如果MaxRequestsPerChild为"0",子进程将永远不会结束。将MaxRequestsPerChild设置成非零值有两个好处:可以防止(偶然的)内存泄漏无限进行而耗尽内存; 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。 如果设置为非零值,笔者建议设为10000-30000之间的一个值
23 </IfModule>
#公式: ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必须是ThreadsPerChild的倍数 MaxSpareThreads >= MinSpareThreads+ThreadsPerChild
24-47行为其他模块,基本不用,这里不再累述
配置Apache服务器默认设置 httpd-default.conf
[root@backup extra]# egrep -v "#|^$" httpd-default.conf|nl
1 Timeout 300 设置服务器在断定请求失败前等待的秒数。默认值300
2 KeepAlive On 设置是否启用HTTP持久链接,On 代表打开,Off 代表关闭。如果用于同一页面包含大量静态文件的应用,设置为On,以提高性能;如果用于主要为动态页面的应用,设置为Off,以节约内存资源;如果服务器前跑有squid或者其它七层设备,设置为On。
3 MaxKeepAliveRequests 100 限制当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。笔者建议将此值设为100-500之间的一个值,以确保最优的服务器性能。
4 KeepAliveTimeout 5 设置持久链接中服务器在两次请求之间等待的秒数。对于高负荷服务器来说,KeepAliveTimeout值较大会导致一些性能方面的问题:超时值越大,与空闲客户端保持连接的进程就越多。
5 UseCanonicalName Off 配置服务器如何确定它自己的域名,可选值为On | Off | DNS。DNS用于为大量基于IP的虚拟主机支持那些古董级的不提供"Host:"头的浏览器使用。笔者建议设置为Off。
6 AccessFileName .htaccess 设置分布式配置文件的名字,默认为.htaccess。如果为某个目录启用了分布式配置文件功能,那么在向客户端返回其中的文档时,服务器将在这个文档所在的各级目录中查找此配置文件,因此会带来性能问题,笔者建议关闭分布式配置文件功能。
7 ServerTokens Full 控制服务器回应给客户端的"Server:"应答头是否包含关于服务器操作系统类型和编译进的模块描述信息,同时还控制着 ServerSignature指令的显示内容。可选值为Full | OS | Minor | Minimal | Major | Prod。笔者建议设置为显示最少信息的Prod。
8 ServerSignature On 配置服务器生成页面的页脚,可选值为On | Off | EMail。采用On会简单的增加一行关于服务器版本和正在伺服的虚拟主机的ServerName,而EMail设置会额外创建一个指向 ServerAdmin的"mailto:"部分。建议使用默认值Off。
9 HostnameLookups Off 设置是否启用对客户端IP的DNS查找,可选值为On | Off | Double。DNS查询会造成明显的时间消耗,建议设置为Off。
3个站点名称:www.etiantian.org、 bbs.etiantian.org、 bbs.etiantian.org
mkdir /var/html/{www,bbs,blog} -p
touch /var/html/{www,bbs,blog}/index.html
for name in www bbs blog; do echo "http://$name.etiantian.org" >/var/html/$name/index.html;done
vi httpd-vhosts.conf 编辑虚拟主机配置文件,虚拟主机配置模板如下
<VirtualHost *:80>
ServerAdmin 1935845114@qq.com
DocumentRoot "/var/html/www"
ServerName www.etiantian.org
ServerAlias etiantian.org #其他主机的别名可以不设置
ErrorLog "logs/www-error_log"
CustomLog "logs/www-access_log" common
</VirtualHost>
取消对虚拟主机配置文件的注释
Include conf/extra/httpd-vhosts.conf
也可以同时取消对extra/httpd-mpm.conf文件的注释,对结果没影响
否则会出现403错误
<Directory "/var/html">
Options -Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
/application/apache/bin/apachectl -t
#/application/apache/bin/apachectl start
/application/apache/bin/apachectl graceful
Listen 80
Listen 8080
在原有ServerName 下面
NameVirtualHost *:80
NameVirtualHost *:8080
<VirtualHost *:80>
<VirtualHost *:8080>
/application/apache/bin/apachectl graceful
http://www.etiantian.org/ #默认80端口
http://bbs.etiantian.org:8080/
ifconfig eth0:1 192.168.80.99/24 up
<VirtualHost 192.168.80.99:80>
<VirtualHost 192.168.80.100:80>
通用日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b" common
日志示例如下:
192.168.80.107 - - [15/May/2016:18:22:10 +0800] "GET / HTTP/1.1" 200 26
这行内容由7项构成,上面的例子中有两项空白,但整行内容仍旧分成了7项
第一项信息是远程主机的IP地址
第二项是空白:用一个“-”占位符替代,用于记录浏览者的标识,这不只是浏览者的登录名字,而是浏览者的email地址或者其他唯一标识符由于有人用它来收集邮件地址和发送垃圾邮件,所以它未能保留多久。
第三项也是空白:这个位置用于记录浏览者进行身份验证时提供的名字
第四项是请求的时间,“+0800”表示服务器所处时区位于UTC之后的8小时
第五项信息典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”
第六项信息是状态代码。
第七项表示发送给客户端的总字节数。
组合日志格式(常用)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
combinedio日志
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
CustomLog "logs/access_log" common
cd /root/tool/
wget http://down1.chinaunix.net/distfiles/cronolog-1.6.2.tar.gz
tar zxvf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2
./configure
make
make install
ll /usr/local/sbin/cronolog
修改访问日志的格式
默认如下
CustomLog "logs/blog-access_log" common
cronolog语法:/path/to/cronolog [OPTIONS] logfile-spec
错误写法
CustomLog "|/usr/local/sbin/cronolog logs/access_www_%Y%m%d.log" combined
提示:cronolog轮询日志的正确写法,被轮询的日志路径要写全路径
按天轮询(生产场景常见用法,推荐)
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
提示:大多数网站的常规配置,日志不会覆盖
按小时轮询(生产场景常见用法)
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d%H.log" combined
提示:如果要及时详细的分析Apache日志,此配置可能比较适用
按周轮询(生产场景常见用法)
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%w.log" combined
提示:按周循环覆盖:推荐
分目录按周记录日志
CustomLog "|/usr/local/sbin/cronolog /app/logs/%w/access_www.log" combined
提示:按周循环覆盖,只需保留少量日志,供SA使用,不做特殊行为分析等
同时按天、按小时轮询(记录两份日志)
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d%H.log" combined
按周建立目录,按小时轮询
CustomLog "|/usr/local/sbin/cronolog /app/logs/%w/access_www_%Y%m%d%H.log" combined
CustomLog "|/usr/local/sbin/cronolog /app/logs/%w/access_www%H.log" combined
以上轮询也可以轮询错误日志
这是Apache自带的日志轮询工具,此处不推荐使用(有可能丢日志)
rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]
选项
-l 使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。
logfile 它加上基准名就是日志文件名。如果logfile中包含”%”,则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的”.nnnnnnnnnn”后缀。这两种格式都表示新的日志开始使用的时间。
rotationtime 日志文件滚动的以秒为单位的间隔时间。
offset 相对于UTC的时差的分钟数。如果省略,则假定为”0″并使用UTC时间。比如,要指定UTC时差为”-5小时”的地区的当地时间,则此参数应为”-300″。
filesizeM 指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。
CustomLog "|bin/rotatelogs -l logs/localhost/access_%Y%m%d.log 86400" combined
ErrorLog "|bin/rotatelogs -l logs/localhost/error_%Y%m%d.log 86400"
cd /application/apache/logs/
mv www-access_log www-access_log_$(date +F).log
/application/apache/bin/apachectl graceful
因为统计日志PV时一个页面才算一个PV,而图片,css、js等只是图片的元素,如果记录在日志中,按日志行计算PV就不准确了,所以可考虑不记录图片等的日志。
在虚拟主机配置模块中添加如下配置,并修改CustomLog
方法一:排除法
<FilesMatch "\.(bmp|gif|jpg|swf)">
SetEnv IMAG 1
</FilesMatch>
CustomLog /var/wwwlogs/b.test.com.log combined env=!IMAG
方法二:只记录html,htm,php等文件
SetEnvIfNoCase Request_URI "(\.htm|\/|\.html|\.php)$" htm
CustomLog logs/9enjoy.com-access_log combined env=htm
SetEnvIfRequest_URI "^/checkstatus.html" dontlog
ErrorLog"logs/error_log"
LogLevel warn
CustomLog"logs/access_log" combined env=!dontlog
两种方法
awk '{++S[$1]} END {for (key in S) print S[key],key}' www-error_log |sort -rn -k1|head
awk '{print $1}' www-access_log|sort|uniq -c|sort -rn -k1|head
Web服务器在默认情况下使用HTTP,这是一个纯文本的协议。正如其名称所暗示的,纯文本协议不会对传输中的数据进行任何形式的加密。而基于HTTP的Web服务器是非常容易配置,它在安全方面有重大缺陷。任何”中间人”,通过精心防止的数据包嗅探器,是能够看到任何经过的数据包内容。更进一步,恶意用户甚至可以在传输路径设置一个假冒的WEB服务器冒名顶替实际的目标Web服务器。在这种情况下,最终用户可能实际上与假冒者服务器,而不是真正的目的服务器进行通信。这样,恶意用户可以通过精心设计的表单欺骗终端用户获取到敏感信息,如用户名密码。
为了处理这些类型的漏洞,大多数供应商往往在他们的web服务器应用HTTPS协议。对于只读类型的网站,用户只能读取内容,并没有实际提交任何信息,HTTP仍然是一个可行的选择。但是,对于保存敏感信息的网站,比如:用户需要登录来获得网站的服务,那么HTTPS是必须的。 HTTPS能够为一个网站提供以下能力。:
1.确保所有经过服务器传输的数据包都是经过加密的。
2.建立了一个官方数字证书证书,使得假冒服务器无法冒充真正的服务器。
需要建立支持HTTPS的WEB服务器所要做的第一件事就是获得数字证书。数字证书可以在以下任一方法来获得。
1.自签名证书被推荐用于测试目的和个人项目。自签名证书,也可以用于服务提供商,不过一般适用于用户互相信任的情形。另外,自签名证书不用花钱购买。
2.证书可以由社区为基础的认证供应商如StartSSL和CACERT办法。这些证书也不需要花钱,但建议为个人项目。
3.对于全球性商业网站,建议从值得信赖的知名证书颁发机构购买证书。这些证书需要花钱,但他们增加了网络服务提供商的信誉。
在这篇文档中,我们将使用自签名证书。
假设CentOS已经安装了Apache Web服务器。我们需要使用OpenSSL生成自签名证书。如果尚未安装OpenSSL,它可以使用yum来安装。
[root@data-1 conf]# yum install mod_ssl openssl -y
[root@data-1 conf]# ls /etc/httpd/conf.d/ssl.conf
/etc/httpd/conf.d/ssl.conf
安装完毕后,会自动生成 /etc/httpd/conf.d/ssl.conf 文件,下文配置会用到!
下面的命令可以被用来产生一个自签名的证书。
首先,生成2048位的加密私钥
openssl genrsa -out server.key 2048
然后,生成证书签名请求(CSR),这里需要填写许多信息,如国家,省市,公司等
openssl req -new -key server.key -out server.csr
最后,生成类型为X509的自签名证书。有效期设置3650天,即有效期为10年
openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
创建证书后,将文件复制到对应的目录。
cp server.crt /etc/pki/tls/certs/
cp server.key /etc/pki/tls/private/
cp server.csr /etc/pki/tls/private/
首先,修改下面的配置文件。仅需配置红色部分 SSLCertificateFile 和 SSLCertificateKeyFile
vim /etc/httpd/conf.d/ssl.conf
### overwrite the following parameters ###
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
### The following parameter does not need to be modified in case of a self-signed certificate. ###
### If you are using a real certificate, you may receive a certificate bundle. The bundle is added using the following parameters ###
SSLCertificateChainFile /etc/pki/tls/certs/example.com.ca-bundle
然后,重新启动httpd服务使更改生效。Web服务器现在可以使用HTTPS
对于虚拟主机,典型的HTTP配置是这样的。
NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin email@example.com
DocumentRoot /var/www/html/virtual-web
ServerName proxy.mimvp.com
</VirtualHost>
我们可以参考上面的配置创建HTTPS虚拟主机。
NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
ServerAdmin email@example.com
DocumentRoot /var/www/html/virtual-web
ServerName proxy.mimvp.com
</VirtualHost>
如果由于某种原因,你需要站点的Web服务器都只使用HTTPS,此时就需要将所有HTTP请求(端口80)重定向到HTTPS(端口443)。 Apache Web服务器可以容易地做到这一点。
强制主站所有Web使用(全局站点)
如果要强制主站使用HTTPS,我们可以这样修改httpd配置文件:
vim /application/apache/conf/httpd.conf
ServerName www.example.com:80
Redirect permanent / https://www.example.com
重启Apache服务器,使配置生效:
强制虚拟主机(单个站点)
如果要强制单个站点在虚拟主机上使用HTTPS,对于HTTP可以按照下面进行配置:
# vim /application/apache/conf/httpd.conf
<VirtualHost *:80>
ServerName proxy.mimvp.com
Redirect permanent / https://proxy.mimvp.com/
</VirtualHost>
重启Apache服务器,使配置生效。单个站点全部使用HTTPS,则 http://proxy.mimvp.com 会强制重定向跳转到 https://proxy.mimvp.com
一般情况下,由于浏览器会自动拦截https未被认证的网址,因此建议同时保留 http://proxy.mimvp.com 和 https://proxy.mimvp.com ,或者购买权威的认证服务,让用户浏览器信任https浏览访问。
编辑源文件中的./tool/httpd-2.2.27/include/ap_release.h文件
42 #define AP_SERVER_BASEPRODUCT "IIS" # Apache修改为软件为IIS
43
修改版本
44 #define AP_SERVER_MAJORVERSION_NUMBER 7 #2改为7
45 #define AP_SERVER_MINORVERSION_NUMBER 0 # 2改为0
46 #define AP_SERVER_PATCHLEVEL_NUMBER 0 #27改为0
47 #define AP_SERVER_DEVBUILD_BOOLEAN 0 #不变
编辑源文件中的./tool/httpd-2.2.27/os/unix/os.h
35 #define PLATFORM "Win 32" # Unix 改为Win 32
egrep -v "#|^$" /application/apache/conf/extra/httpd-default.conf|nl
7 ServerTokens Prod # Full修改为Prod
8 ServerSignature Off #On修改为Off
需要编辑/application/apache/conf/httpd.conf主配置文件
#Include conf/extra/httpd-default.conf #取消注释,应用httpd-default.conf配置文件配置
官方网站:http://httpd.apache.org/docs/2.2/
apache的mod_deflate模块提供了DEFLATE输出过滤器,允许apache服务器将输出内容在发送到客户端之前根据具体的策略进行压缩,以节约网站带宽,同时提升用户访问体验。
检查apache mod_deflate模块是否安装
/application/apache/bin/apachectl -M #查看所有模块,如果出现(dynamic),表示该模块是DSO方式编译的,如果出现(static) ,表示该模块是编译安装的,以上两种方法不能同时配置,否则会有冲突。
/application/apache/bin/apachectl -l|grep mod_deflate.c #列出编译安装的模块
ls /application/apache/modules/ #以DSO方式编译的模块查看方法
配置编译时加入如下参数
[root@apache httpd-2.2.27]# ./configure --help|grep deflate
--enable-deflate Deflate transfer encoding support
#--enable-deflate提供对内容的压缩传输编码支持,一般html,js,css等内容的站点,使用此参数功能会大大提高传输速度,提升访问者访间体验。在生产环境中,这是apache调优的一个重要选顶之一
cd /server/tools/httpd-2.2.27/modules/filters/
/application/apache/bin/apxs -c -i -a mod_deflate.c
ll /application/apache/modules/
上述apxs参数选项说明
-c此选项表示需要执行编译操作.它首先会编译C源程序(.c)files为对应的目标代码文件(.o),然后连接这些目标代码和files中其余的目标代码文件(.o和.a),以生成动态共享对象dsofile。如果没有指定-o选项,则此输出文件名由files中的第一个文件名推测得到,也就是默认为modname.so。
-i此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
-a此选项自动增加一个LoadModule行到http.conf文件中,以激活此模块
可以在主配置中配置,也可以在虚拟主机中配置
整个配置过程十分简单,只需要把下面内容完整的复制到httpd.conf或者httpd-vhosts虚拟机主机标签的结尾保存即可使所有的虚拟主机生效。
环境1:在主httpd.conf配里中配里如下
http://httpd.apache.org/docs/2.2/mod/mod_deflate.html
<IfModule mod_deflate.c>
DeflateCompressionLevel 9
AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml # 压缩类型
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
SetOutputFilter DEFLATE
#DeflateFilterNote Input instream
#DeflateFilterNote Output outstream
#DeflateFilterNote Ratio ratio #在日志中存放压缩率标记,这个功能一般不用
#LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate #日志格式
#CustomLog logs/deflate_log.log deflate #记录压缩日志
</IfModule>
测试:访问网站通过火狐浏览器的yslow插件查看,也可以通过curl -I域名地址查看。
mod_expires模块查看、安装过程同mod_deflate模块,仅仅在编译的时候添加--enable-expires参数,或者以DSO方式指定mod_expires.c
语法:
Description: Value of the Expires header configured by MIME type
Syntax: ExpiresByType MIME-type <code>seconds
Context: server config, virtual host, directory, .htaccess #也可以为location
Override: Indexes
Status: Extension
Module: mod_expires
整个配置十分简单,只需要把下面内容完整的复制到httpd.conf结尾保存即可使所有的虚拟主机生效。
<IfModule mod_expires.c> #此行为注释,不生效,也可以不写
ExpiresActive on
ExpiresDefault "access plus 12 month"
ExpiresByType text/html "access plus 12 months"
ExpiresByType image/gif "access plus 12 month"
ExpiresByType image/jpeg "access plus 12 month"
ExpiresByType application/x-javascript "access plus 12 month"
ExpiresByType text/css "access plus 12 month"
ExpiresByType application/x-shockwave-flash "access plus 12 month"
ExpiresByType image/jpg "access plus 12 months"
ExpiresByType image/png "access plus 12 months"
ExpiresByType video/x-flv "access plus 12 months"
</IfModule>
#不记录图片,js,css访问日志
<FilesMatch "\.(ico|gif|jpg|png|bmp|swf)">
SetEnv IMAG 1
</FilesMatch>
CustomLog logs/access_log combined env=!IMAG
SetEnvIfRequest_URI "^/checkstatus.html" dontlog
ErrorLog"logs/error_log"
LogLevel warn
CustomLog"logs/access_log" combined env=!dontlog
方法一:提示下载不解析
<Directory "/var/html/bbs/attachments">
Optionss FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
php_flag engine off
</Directory>
方法二:返回403错误
<Directory /var/html/blog/attachments>
<file ~ ".php">
Order allow,deny
deny from all
</files>
</Directory>
查看当前使用的模式:默认是prefork
[root@apache ~]# /application/apache/bin/apachectl -l|egrep "worker|prefork"
[root@apache ~]# /application/apache/bin/apachectl -l|sed -n "/worker\|prefork/p"
prefork使用的是多个子进程,而每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接。一个主进程,多个子进程
工作原理:
控制进程最初建立若干个子进程,为了不在请求到来时再生成子进程,所以要根据需求不断的创建新的子进程,最大可以达到每秒32个直到满足需求为止。
安装方法:
在编译的过程中,加入参数--with-mpm=prefork如果不加也可以,因为默认的话,会采用prefork模式
优点:效率高,稳定,安全.对于线程调试困难的平台来说,调试更加容易些。
缺点:和woker模式比消耗资源多
常用配置参考:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 5000
</IfModule>
ps -ef|grep http|wc -l #此模式下查看apache的并发
worker模式是apache2.x新引进来的模式,是线程与进程的结合,在worker模式下会有多个子进程,每个子进程又会有多个线程,每个线程在某个确定的时间只能维持一个连接。一个主进程,多个子进程,每个子进程又有多个线程。
工作原理:
由主控制进程生成若干个子进程,而每个子进程中又包含固定的线程数,各个线程独立处理请求,同样为了不在请求到来时再生成线程,在配里文件中设置了最小和最大的空闲线程数及所有子进程中的线程总数,如果现有子进程中的线程总数不能满足并发及负载,控制进程将派生新的子进程。
子进程和线程的区别:http://blog.csdn.net/wangkehuai/article/details/7089323
安装方法:
在编译的过程中,加入参数--with-mpm=worker
优点:内存占用比prefork模式低,适合高并发、高流HTTP服务
缺点:假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”.由于线程共享内存空间,所以一个程式在运行时必须被系统识别为”每个线程都是安全的”。服务稳定性不如prefork模式
<IfModule mpm_worker_module>
StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerchild值决定的,应该大于等于maxclients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。
默认最大的子进程总数是16,如需加大时也需要显式声明ServerLimit 的值(最大值是20000)。
特别说明:
如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)
数学表达:
MaxClients<=总的进程数(ServerLimit)*线程数(ThreadsPerChild)
MaxClients%ThreadsPerChild=0
worker MPM也有不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”。
pstree -a|grep http|wc -l #此模式下查看apache的并发
<Directory "/var/html">
Options -Indexes FollowSymLinks #Indexs前加-,或去掉Indexs,禁止目录索引
AllowOverride None #禁止用户重载
Order allow,deny
Allow from all
/Directory
提示:禁止用户重载这会加快服务器响应速度,因为它不在为每个请求寻找每个目录访问控制文件(.htaccess)。也杜绝了开发人员变相修改配置的安全隐患。
首先是从web性能考虑。如果AllowOverride启用了支持.htaccess文件,则Apache需要在每个站点目录中查找.htaccess文件,因此,无论是否真正用到,启用.htaccess都会导致web性能的下降.另外,对每一个请求,都需要读取一次.htaccess文件。
其次是安全考虑.这样会允许开发人员或者代码管理者可以修改服务器的配置,这可能会导致某些意想不到的修改,应该避免使用.htaccess文件功能,如果要实现类似的功能,可以在主配里中配置。
将配置文件中下面内容及其模块中的注释都干掉
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/application/apache2.2.27/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/application/apache2.2.27/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
mkdir /opt/tmp
mv /tmp/* /opt/tmp
mount -t tmpfs -o size=16m tmpfs /tmp #工作中一般给2-4G
echo "mount -t tmpfs -o size=16m tmpfs /tmp" >>/etc/rc.local
vi /etc/fstab #或者在fstab文件中挂载
tmpfs /tmp tmpfs size=2048m 0 0
简单地讲,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的cache服务器内,通过DNS负载均衡的技术,判断用户来源就近访问cache服务器取得所需的内容,杭州的用户访问近杭州服务器上的内容,北京的访问近北京服务器上的内容。这样可以有效减少数据在网络上传输的时间,提高速度。把静态内容分布到CDN减少了用户影响时间20%或更多。
CDN技术示意图:
网宿,蓝讯(chinacache),快网
Apache 防盗链的第一种实现方法,可以用 Rewrite 实现。首先要确认 Apache 的 rewrite module可用:能够控制 Apache httpd.conf 文件的,打开 httpd.conf,确保有这么一行配置:
LoadModule rewrite_module modules/mod_rewrite.so
然后在相应虚拟主机配置的地方,加入下列代码:
ServerName www.etiantian.org
#防盗链配置参数
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://www.etiantian.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.etiantian.org$ [NC]
RewriteCond %{HTTP_REFERER} !^http://blog.etiantian.org/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://blog.etiantian.org$ [NC]
RewriteRule .*\.(gif|jpg|swf)$ http://www.etiantian.org/img/nolink.gif [R,NC]
说明:
1. www.etiantian.org、blog.etiantian.org表示网站的信任站点
2. .(gif|jpg|swf)表示要保护的防止被盗连的文件的扩展名
3. nolink.gif为上述扩展名的资源被盗链后的重定向页面/图片。用以输出警示信息,这张图片应该尽可能的小。
在其他的网站中,如果调用www.etiantian.org提供的图片URL,这样就会转向http://www.etiantian.org/img/nolink.gif,这个转向图片可能是版权信息的提示。
通过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的网站内容,才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的。需要注意的是:不是所有的用户代理(浏览器)都会设置referer变量,而且有的还可以手工修改referer,referer是可以被伪造的。上面配置,只是一种简单的防护手段。应付一般的盗链也足够了。
常见的的网站防盗链都是通过Referer来判断用户来路的,不过这样的方法对于下载工具来说形同虚设,因为现在的下载工具早就能伪造Referer了。
Cookie配合Rewr1te模块很简单的可实现防盗链下载,首先在浏览页面的时候,会向客户端发送一个特别的Cookie,例如“Site=etiantian.org",盗链而来的将没有这个Cookie。
1、配置Cookie和rewrite实现Apache防盗链下载
在主配置文件httpd.conf或者在虚拟主机httpd-vhosts.conf中配置如下:
RewriteEngine On
RewriteCond %{HTTP_COOKIE} !^.*(?:Site=etiantian.org).*$
#对于Cookie里面没有特殊记录的请求进行重定向到错误页面
RewriteRule ^.*$/error.html #将非法访问重定向到错误页面
说明:这样如果一个盗链而来的请求将会因为役有特殊Cookie而被重定向到错误页面.就算实际地址暴露也不怕。至于这个cookie的内容是什么以及有效时间完全可以由管理员自己来设定,也就是说下载工具也没法伪造,从而防止了服务器资源被盗链的危险。
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
# prefork MPM
# StartServers︰ 数目服务器进程启动
# MinSpareServers︰ 服务器进程处于空闲的最小数目
# MaxSpareServers︰ 服务器进程处于空闲的最大数目
# MaxClients︰ 最大服务器进程数允许启动
# 每︰ 最大服务的请求数服务器进程
# 工人 MPM # StartServers︰ 初始服务器进程启动
# MaxClients 数︰ 最大并发客户端连接数
# MinSpareThreads︰ 工作线程处于空闲
# MaxSpareThreads 的最小数目︰ 工作线程处于空闲
# 线程最大数目︰ 数量恒定的工作线程在每个服务器处理
# 每︰ 服务器进程服务的请求的最大数目
发表评论