1、Apache worker/prefwork模式说明
在linux中,我们可以用httpd-l 查看安装的模块是prefork模式还是worker模式
[[email protected] ~]# /application/apache/bin/apachectl -l|egrep "worker|prefoker"
worker.c
[[email protected] ~]#
或者
[[email protected] ~]# /application/apache/bin/apachectl -l |sed -n ‘/worker\|prefork/p‘
worker.c
[[email protected] ~]#
prefork模式(默认):
prefork使用的是多个子进程,而每个子进程只有一个线程,每个进程在某个确定的时间只能维持一个连接。
工作原理:
控制进程最初建立若干个子进程,为了不在请求到来时再生成子进程,所以要根据需求不断的创建新的子进程,最大可以达到每秒32个知道满足需求为止。
简单示例图表示为:
安装方法:
在编译的时候,加入参数--with-mpm=prefork 如果不加也可以,因为默认的话,会采用prefork模式
优点:效率高,稳定,安全。对于线程调试困难的平台来说,调试更加容易一些。
缺点:和worker模式相比消耗的资源多
配置参数说明:
<Ifmodule mpm_prefork_module>
StartServers 5 #--->最初建立的子进程
MinSpareServers 5 #--->最小空闲进程数,如果空闲的进程小于设定值,Apache会自动建立进程,如果服务器并发及负载大的话,可以考虑加大。
MaxSpareServers 10 #--->最大空闲进程数,如果空闲的进程大于设定值,Apache会自动kill掉多余的进程,如果服务器负载大的话,可以考虑加大
MaxClients 150 #--->设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数,就是Apache可以同时处理的请求数,就是说如果有150个用户在访问,那么151个用户就要等之前的访问结束后才能访问
MaxRequestPerChild 0 #---->每个子进程可以处理的请求数。每个子进程在处理了"maxrequestsperchild"个请求后将自动销毁,0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零页有两点好处(1)防止意外的内存泄露(2)在服务器负载下降的时候回自动减少子进程数
</Ifmodule mpm_prefork_module>
提示:在设置参数值的时候,MinSpareServers 与StartServers尽量保持一致,在prefork模式下,MaxClients被认为是Apache的最大并发数
常用配置参考:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 5000
</IfModule>
prefork模式环境下,如何查看Apache的并发连接数(进程数):
具体方法如下:
[[email protected] ~]# ps -ef|grep http|wc -l
6
[[email protected] ~]#
worker模式:
worker模式是Apache2.x新引进的模式,是线程与进程的结合,在worker模式下会有多个子进程,每个子进程又会有多个线程。每个线程在摸个确定时间只能维持一个连接。
如下图所示:
工作原理:
由主控制进程生成若干个子进程,而每个子进程中又包含固定的线程数,各个线程独立处理请求,同样为了不在请求到来时再生成线程,在配置文件中设置了最小和最大空闲线程数及所有子进程的线程总数,如果现有子进程中的线程总数不能满足并发负载,控制进程将派生新的子进程。
安装方法:
在配置编译的过程中,加入参数--with-mpm=worker,如果不加的话系统会采用默认的prefork模式
优点:内存占用比prefork模式低,适合高并发高流量的HTTPD服务
缺点:假如一个线程崩溃,整个进程积极会连同其任何线程一起“死掉”。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为“每个线程都是安全的”。服务稳定性不如prefork模式。
配置说明(prefork模式):
[[email protected] ~]# sed -n ‘43,58p‘ /application/apache/conf/extra/httpd-mpm.conf
# 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
<IfModule mpm_worker_module>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
生产场景配置4:
<IfModule mpm_worker_module>
StartServers 3
MaxClients 1600
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 64
MaxRequestsPerChild 0
</IfModule>
worker模式下所能同时处理的请求总数是由子进程总数乘以Threadsperchild值决定的,应该大于等于maxclients。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。
提示: 默认最大的子进程总数为16,如需加大时也需要明显的申明serverlimit的值(最大值时20000)
查看Apache的worker下并发连接数:
[[email protected] ~]# pstree -a|grep httpd|wc -l
84
[[email protected] ~]#
2、web防盗链技术
简单的说,就是某些不法的网站,通过在其自身网站程序里未经许可非法调用其他网站的资源,然后在自己的网站上显示这些调用的资源,达到了填充自身网站显示的效果,但是浪费了调用资源网站的网络流量,造成其他网站的带宽及服务压力吃紧,甚至宕机。
网站被盗链的解决方案:
1、根据http referer实现防盗链
在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示从哪里来的链接到当前网页的资源,通过referer可以检测到目标访问的来源网页,如果是资源文件,可以跟踪到显示它的网页地址,一单检测出来源不是本站进行阻止或返回指定页面。 目前Apache,nginx,lighttpd三者都支持根据http referer实现防盗链
2、根据cookie处理
3、通过加密变换访问路径实现防盗链lighttpd有类似的插件mod_secdownload
Apache web服务实现防盗链实战
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/var/html/bbs"
ServerName ucode.blog.51cto.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/bbs-error_log"
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_bbs_%Y%m%d.log" combined
RewriteEngine On #开启防盗链
RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC]
RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/$ [NC]
RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC]
RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com$ [NC]
RewriteCond .*\.(gif|jpg|swf)$ http://ucode.blog.51cto.com/img/nolink.jpg [ R,NC]
</VirtualHost>
满足以上的黑体部分的就会返回:http://ucode.blog.51cto.com/img/nolink.jpg图片
原理流程图:
利用referer和rewrite实现Apache防盗链小结
通过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的网站内容,才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的。需要注意的是:是所有的用户代理(浏览器)都会设置referer变量,而且有的还可以手工修改erferer,referer是可以被伪造的,上面的配置只是一种简单的防护手段。应付一般的盗链足矣。