【apache工作模式】优化重写功能

 

/usr/local/apache/bin/httpd -l #模式查看

worker.c

/usr/local/apache/bin/httpd -V

yum install httpd -y
/usr/local/apache/bin/httpd -V
Server MPM: prefork #可以看到rpm安装的还是旧的prefork模式的。

 


1.prefork模式性能优化

vi /usr/local/apache/conf/httpd.conf
改:483 #Include conf/extra/httpd-mpm.conf
为:483 Include conf/extra/httpd-mpm.conf
vi /usr/local/apache/conf/extra/httpd-mpm.conf #查看主要参数
prefork模式参数
#这是prefork模式的配置参数,虽然配置文件中有参数,但是不启作用,因为我们是以worker模式在运行apache,以下参数说明。
28 <IfModule mpm_prefork_module> 
29 StartServers 5 # 启动apache时创建的服务进程数量
30 MinSpareServers 5 # 最小空闲进程数,备用
31 MaxSpareServers 10 # 最大空闲进程数 2000的服务器上,MaxSpareServers这个值设置的是200。保留最大并发数的10分之一
32 MaxRequestWorkers 250 # 最大并发进程数。
33 MaxConnectionsPerChild 0 # 最大连接数限制。如果设置为0,表示没有限制。 </IfModule>

 

 

2.worker模式性能优化

优点:内存占用比prefork模式低,适合高并发高流量HTTP服务。
缺点:一个子线程蹦整个进程蹦

vi /usr/local/apache/conf/extra/httpd-mpm.conf #查看主要参数

#这是worker模式的配置参数

44 <IfModule mpm_worker_module>
45 StartServers 3 # 启动时进程数
46 MinSpareThreads 75 # 最小空闲线程数
47 MaxSpareThreads 250 # 最大空闲线程数
48 ThreadsPerChild 25 # 每个进程可以启动的线程数量
49 MaxRequestWorkers 400 # 所有线程数量的最大值,通常表示了一个web服务可以同时处理的请求数
50 MaxConnectionsPerChild 0 # 最大连接数限制
51 </IfModule>

 

 

ps -aux | grep httpd | wc -l

ps -aux | grep httpd # root 是管理线程不处理请求 子进程处理数据

ps -axu | grep http | awk '{print $6}' 
注:默认单位是K,可以看到三个进程每个使用的是4360K内存,一共使用了4360*3=13.08M内存,这是初始的内存大小

ps aux | grep http |awk '{sum += $6;n++};END{print sum}' #查看进程占用的所有内存

ps aux | grep http |awk '{sum += $6;n++};END{print sum/n}' #平均每个进程占的内存数。

 


2、扩展:在选择服务器时,如何确认cpu和内存搭配?
通用型服务器选择标准:cpu核心和内存大小,一般比例为1:4 ,如8核cpu,32G内存;16核心CPU,64G内存。
计算型服务器选择标准:cpu核心和内存大小,一般比例为1:2 ,如8核cpu,16G内存;16核心CPU,32G内存。
内存型服务器选择标准:cpu核心和内存大小,一般比例为1:8 ,如8核cpu,64G内存;16核心CPU,128G内存。


3、实战场景:一台服务器,16核心CPU,64G内存。 apache最大可以设置多少个work进程。
思路:先减去服务器系统本身所需要的资源,剩下的才能给apache使用。具体分配内存场景,可以参考以下案例。
例1:当一台服务器是8G内存时,2G留给系统使用,6G留给apache使用。
例2:当一台服务器是16G内存时,4G留给系统使用,12G留给apache使用。
例3:当一台服务器是32G内存时,8G留给系统使用,24G留给apache使用。
例4:当一台服务器是64G内存时,8G留给系统使用,56G留给apache使用。
总结:系统最多使用8G内存,就足够了稳定运行了。

 

那么对于64G内存的服务器,apache可以使用56G内存,假如每个work进程稳定运行时,平均使用56M内存。最大work进程数为:56*1024/56=1024个。

[root@xuegod63 ~]# vi /usr/local/apache/conf/extra/httpd-mpm.conf
44 <IfModule mpm_worker_module>
45 StartServers 1024
46 MinSpareThreads 750
47 MaxSpareThreads 2500
48 ThreadsPerChild 250
49 MaxRequestWorkers 25000 # 1024*250=25600
50 MaxConnectionsPerChild 25000
51 </IfModule>

 

[root@xuegod63 ~]# /etc/init.d/apachectl-xuegod restart

[root@xuegod63 ~]# watch -n 1 "pgrep httpd|wc -l" #动态看连接数

 


一台服务器cpu是8核心,物理是内存32G ,想达到2000并发的apache,worker模式的配置参数如下:

<IfModule mpm_worker_module>
StartServers 16 
MinSpareThreads 75 
MaxSpareThreads 1250 #配置为1天中最大并发量的1半 
ThreadsPerChild 125 
MaxRequestWorkers 2000 # 16*125=2000
MaxConnectionsPerChild 12500 
</IfModule>

 


1.稳定并发用perfork 2.2
2.大并发用work模式
3. 2.4以后用envt模式
4.优化改进程 改线程 开启动的最大和最小

 

 

17.3.3 event模式调优
[root@xuegod63 apache2.4-xuegod]# vi /usr/local/apache/conf/extra/httpd-mpm.conf #配置如下
61 <IfModule mpm_event_module>
62 StartServers 3
63 MinSpareThreads 75
64 MaxSpareThreads 250
65 ThreadsPerChild 25
66 MaxRequestWorkers 400
67 MaxConnectionsPerChild 0

1、Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式
/usr/local/apache/bin/apachectl -M | grep rewrite

互动:我们在之前编译时已经加了--enable-rewrite选项,为什么此没有找到rewrite模块?

[root@xuegod63 ~]# ls /usr/local/apache2.4-xuegod/modules/mod_rewrite.so
/usr/local/apache2.4-xuegod/modules/mod_rewrite.so #可以看到系统中有这个模块的
解决:这是因为我们还没有启用rewrite模块
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf 
改:155 #LoadModule rewrite_module modules/mod_rewrite.so #删除前面的#号,启用rewrite模块
为:155 LoadModule rewrite_module modules/mod_rewrite.so

 


/usr/local/apache/bin/apachectl -M | grep rewrite

/usr/local/apache/bin/apxs -c -i -a /usr/local/src/httpd-2.4.28/modules/mappers/mod_rewrite.c #手动添加模块

 

17.4.5
1、实现client请求不是www.xuegod.cn和192.168.1.63都跳转到主机前缀为http://www.xuegod.cn 。
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf
在:155 LoadModule rewrite_module modules/mod_rewrite.so 之后插入以下内容:

RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.xuegod.cn [NC]
RewriteCond %{HTTP_HOST} !^192.168.1.63 [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://www.xuegod.cn/ [L]

 

参数说明
L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
NC(no case) 不区分大小写
这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用. 就是引用前面里的(.*)字符。
[root@xuegod63 ~]# /etc/init.d/apachectl graceful #重新加载配置

www.360buy.com 域名时跳转到www.jd.com
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf
删除之前添加的rewrite规则:
在原来位置插入以下内容:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.360buy.com [NC]
RewriteRule ^/(.*) http://www.jd.com/ [L]

 


apache进行防盗链的配置

[root@xuegod63 ~]# vim /usr/local/apache/conf/httpd.conf
删除:
157 RewriteEngine on
158 RewriteCond %{HTTP_HOST} ^www.360buy.com [NC]
159 RewriteRule ^/(.*) http://www.jd.com/ [L]
在原位置插入以下内容:

<IfModule rewrite_module>
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]
</IfModule>

 

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

 

现在禁止访问目录下的内容:
vi /usr/local/apache/conf/httpd.conf #找到根目录中的

248 <Directory "/usr/local/apache/htdocs">
。。。
改:261 Options Indexes FollowSymLinks
为:261 Options FollowSymLinks

 

 


设置不允运行/usr/local/apache/htdocs/data 目录下的php结尾的文件
[root@xuegod63 ~]# mkdir /usr/local/apache/htdocs/data
[root@xuegod63 ~]# vi /usr/local/apache/conf/httpd.conf
在:

248 <Directory "/usr/local/apache/htdocs">
。。。
274 </Directory>

<Directory "/usr/local/apache/htdocs/data" >
<Files ~ ".php">
Order allow,deny
Deny from all
</Files>
</Directory>

 

[root@xuegod63 ~]# /etc/init.d/apachectl restart

 

17.5.4 apache网站架构优化

1、分离最佳方式是分别使用独立的服务器(需要程序支持)
2、次选方案在前端负载均衡器通过haproxy/nginx来根据用户请求的目录或扩展名来对后端的服务器发出请求。
例如:请求http://www.xuegod.cn/a/b.jpg就抛给图片服务器(CDN最好),这里是根据扩展名.jpg分发
请求http:// /www.xuegod.cn /upload/login.php就抛给apache服务器,这里是根据URL路

posted @ 2018-11-24 16:17  夜辰雪扬  阅读(217)  评论(0编辑  收藏  举报