十、开启防盗链

一些小网站为了盈利,通过盗链来实现对自己网站内容的丰富,这无疑加大了企业的空间和流量的成本,因此我们需要对apache进行防盗链的配置。

由于我们要用到mod_rewrite模块,因此我们需要先检测该模块是否安装,检测和安装方法与上面mod_deflate和mod_expires的一样,这里不多讲了。

防盗链配置:

一般我们都是将防盗链的配置,配置在虚拟主机里面,配置如下:

ServerAdmin [email protected]

DocumentRoot "/www/html"

ServerName www.sunsky.pw

ServerAlias sunsky.pw

CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined

ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"

RewriteEngine On

RewriteCond %{HTTP_REFERER} !^http://sunsky.pw/.*$ [NC]

RewriteCond %{HTTP_REFERER} !^http://sunsky.pw$ [NC]

RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw/.*$ [NC]

RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw$ [NC]

RewriteRule .*\.(gif|jpg|swf)$ http://www.sunsky.pw [R,NC]

如上配置之后,我们重启apache服务即可生效。

 

十一、禁止目录浏览

由于开启目录浏览会让我们整个目录下的内容全部都暴露到外面,因此我们必须要禁止目录浏览功能。当然一些目录开放给客户做下载的,可以忽略此项优化。我的http://down.sunsky.pw就是范例。

我们通过修改apache主配置文件httpd.conf中的标签内的Options选项参数来实现禁用目录浏览。

实现方法有三种:

第一种:


AllowOverride None

Options FollowSymLinks   #不填写Indexes项,默认即为关闭。

Require all granted

第二种:


 

AllowOverride None

Options -Indexes #通过在Indexes前面加-来禁用此功能

Require all granted

第三种:

 

AllowOverride None

Options None    #禁用所有选项

Require all granted

十二、禁用AllowOverride选项,关闭.htaccess文件使用

首先是性能考虑,如果AllowOverride启用了.htaccess文件,则apache需要在每个目录中查找.htaccess文件。因此,无论是否真正用到,启用.htaccess都会导致服务器性能的下降。另外,对于每一个请求,都需要读取一次.htaccess文件。

其次是安全考虑,这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。

1、禁用AllowOverride选项

我们通过修改apache主配置文件httpd.conf中的标签内的AllowOverride选项参数来实现禁用目录浏览。


Options none

AllowOverride None    #禁止该选项,防止用户重复载入

Require all granted

通过该设置加快了服务器响应速度,因为它不再让每个请求去寻求每个目录的访问控制文件(.htaccess)

2、关闭.htaccess文件使用

默认在Unix平台下能够使用.htaccess来对目录权限进行规则定义,但是这是不安全的,建议关闭,默认的选项:


AccessFileName .htaccess

这里我们将它关闭注释掉


 

#AccessFileName .htaccess

全部目录权限定义使用httpd.conf中的定义,不使用.htaccess进行定义。

 

十三、关闭自带CGI功能

生产环境中,一般我们不使用apache自带的cgi的功能,如果使用的话,可以用mod_perl模块来替代。因此我们这里需要将apache主配置文件httpd.conf中有关cgi的内容删除掉。

删除部分:


ScriptAlias /cgi-bin/ "/usr/local/apache2.4.6/cgi-bin/"

<Directory "/usr/local/apache2.4.6/cgi-bin">

AllowOverride None

Options None

Require all granted

</Directory>

十四、禁止PHP解析指定站点的目录

企业的站点有时会提供用户进行上传操作,而用户上传文件的存放目录,我们是不能给php的解析权限的,否则会对apache服务和系统造成危害。

 

十五、apache的安全模块

我们需要对apache站点增加一些扩展的安全模块,如:mod_evasive20防DDOS、mod_limitipconn(针对单站点)配置、mod_security2防SQL注入等等之类的工具。

另外,下面是推荐给大家的几个工具。

1、makejail http://www.floc.net/makejail/

它是一个自动把建立jail所需要的程序放到jail内的软件,使用python编写,他有debian和openbsd的版本。

2、mod-security http://www.modsecurity.org/

它是apche的一个模块,它不仅可以实现过滤请求和日志审计等功能,而且可以防止SQLInjection和跨站脚本***等是个很不错的安全模块。

 

十六、使用tmpfs文件系统替代频繁访问的目录

tmpfs是一种基于内存的文件系统。它最主要的两个优势就是动态文件系统大小和速度快。因为典型的tmpfs文件系统会完全驻留在RAM中,读写几乎可以是瞬间的。即使用了一些交换分区,性能仍然是卓越的。因此对于那些频繁访问的目录,建议使用tmpfs文件系统进行替代。

 

十七、优化系统内核参数

对系统内核的优化参数,我们在系统的基础优化这边博文已经讲过了。系统内核优化最主要的目的就是减少TIME-WAIT的TCP连接数。

由于在基础优化篇我们已经对apache进行了内核参数的优化,因此这里我就不再操作了。这里我将为大家对优化的参数进行讲解。


net.ipv4.tcp_fin_timeout  #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间,默认值是60秒。

net.ipv4.tcp_tw_reuse   #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认值为0,表示关闭。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_reuse 0

net.ipv4.tcp_tw_recycle  #表示开启TCP连接中TIME-WAIT sockets的快速回收该参数对应系统路径为:/proc/sys/net/ipv4/tcp_tw_recycle提示:reuse和recycle两个参数为了防止生产环境下web,squid等time_wait过多设置的。

net.ipv4.tcp_syncookies   #表示开启SYN Cookies功能。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN***,Centos5系列默认值为1,表示开启。因此这个参数也可以不添加。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syncookies,默认为1

net.ipv4.tcp_keepalive_time   #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为10分钟。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_keepalive_time,默认为7200秒。

net.ipv4.ip_local_port_range  #选项用来设定允许系统打开的端口范围。即用于向外连接的端口范围。该参数对应系统路径为:/proc/sys/net/ipv4/ip_local_port_range  32768  61000

net.ipv4.tcp_max_syn_backlog   #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。选项为服务器端用来记录那些尚未收到客户端确认信息的连接请求的最大值。

该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_syn_backlog

net.ipv4.tcp_max_tw_buckets    #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清楚并打印警告信息。默认为180000,对于Apache、Nginx等服务器来说可以调整低一点,如改为5000-30000,不同业务的服务器也可以给大一旦,比如lvs,squid。上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。此参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_tw_buckets

net.ipv4.tcp_synack_retries   #参数的值决定了内核放弃连续之前发送SYN+ACK包的数量。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_synack_retries默认值为5

net.ipv4.tcp_syn_retries    #表示在内核放弃建立连接之前发送SYN包的数量。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_syn_retries 5

net.ipv4.tcp_max_orphans    #选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立连接将立即被复位并打印出警告信息。这个限制这是为了防止简单的Dos***,不能过分依靠这个限制甚至认为减少这个值,更多的情况是增加这个值。该参数对应系统路径为:/proc/sys/net/ipv4/tcp_max_orphans 65536

十八、尽可能减少HTTP请求数

http请求是要开销的,想办法减少请求数自然可以提高网页速度。常用的方法,合并css,js(将一个页面中的css和js文件分别合并)以及Imagemaps和csssprites等。当然或许将css,js文件拆分成多个是因为css结构,共用等方面的考虑。阿里巴巴中文站当时的做法是开发时依然分开开发,然后在后台对js,css进行合并,这样对于游览器来说依然是一个请求,但是开发时仍然能还原成多个,方便管理和重复引用。yahoo甚至建议将首页的css和js直接写在页面文件里面,而不是外部引用。因为首页的访问量太大了,这么做可以减少两个请求数。而事实上国内的很多门户都是这么做的。

其中csssprites是指只用将页面上的背景图合并成一张,然后通过css的background-position属性定义不过的值来取他的背景。淘宝和阿里巴巴中文站目前都是这样做的。http://www.csssprites.com/这是个工具网站,它可以自动将你上传的图片合并,并给出对应的background-position坐标。并将结果以png和gif的格式输出。