Apache2 中的 prefork/worker/event

三种 MPM(Multi-Processing Module) ,最古老的 prefork,worker 以及比较新的 event 模式。
prefork 一个进程一个线程,worker 一个进程多个线程,event 在 worker 基础上做了更大的改进,前两者还是使用的是 select I/O 模型,而 event 则需要 glibc 的 EPoll 的支持。
总结一下,prefork 对线程支持不太好的可以使用,多进程模式,需要经常 fork 子进程,耗资源;worker 在大流量时更适合,消耗资源相对较少。
进程跟线程的关系,区别网上有很多,简单讲,一个程序至少有一个进程,一个进程至少有一个线程。线程划分的尺度更小,并发性更高。
Continue reading

Apache2 虚拟主机注意点

下面这个是使用 VirtualHost 过程中的注意事项,分 Ip Based 以及 Domain Based。

# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:13:3e:13:11:06 
          inet addr:111.111.111.111  Bcast:111.111.111.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:57203592 errors:0 dropped:0 overruns:0 frame:0
          TX packets:21655208 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:85022831734 (85.0 GB)  TX bytes:1540881922 (1.5 GB)
          Interrupt:10

eth1      Link encap:Ethernet  HWaddr 00:13:3e:13:11:17 
          inet addr:10.18.10.252  Bcast:10.18.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6982 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1249 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1122466 (1.1 MB)  TX bytes:535239 (535.2 KB)
          Interrupt:11

eth1:1    Link encap:Ethernet  HWaddr 00:13:3e:13:11:17 
          inet addr:10.18.10.251  Bcast:10.18.10.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:11

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:12 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:984 (984.0 B)  TX bytes:984 (984.0 B)

1.Ip Based

没有必要设置 NameVirtualHost 指令。VirtualHost 紧邻 addr:port,addr 建议使用 IP 的方式而非 FQDN 的方式。如果要使用 * 则必须跟 NameVirtualHost 结合使用,或者下面演示的 _default_ 方式。

$ cat /etc/apache2/sites-available/ip-based

<VirtualHost 10.18.10.252:80>
    DocumentRoot /var/www/a
</VirtualHost>
<VirtualHost 10.18.10.251:80>
    DocumentRoot /var/www/b
</VirtualHost>
<VirtualHost 10.18.10.251:8000>
    DocumentRoot /var/www/a
</VirtualHost>
<VirtualHost _default_:*>
    DocumentRoot /var/www/c
</VirtualHost>

基于 IP 的用的比较少,内部实验性质的可以试试。

Continue reading

HTTP Headers 部分字段笔记

一个简单的 request 可以像下面这样:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 
Host: net.tutsplus.com 

而复杂起来可以像下面这样:
Accept    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset    UTF-8,*
Accept-Encoding    gzip, deflate
Accept-Language    zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Cache-Control    max-age=0
Connection    keep-alive
Cookie    fc=fcVal=634513393390715776; __utma=118891282.16916071.13137550.1327303242.1327308483.209; __utmz=118891282.1326609907.194.66.utmcsr=t.co|utmccn=(referral)|utmcmd=referral|utmcct=/CzETxUKX; wp-settings-1=m5%3Do%26m9%3Do%26m8%3Do%26m6%3Do%26m1%3Do%26m7%3Dc%26m4%3Do; wp-settings-time-1=1327827407; Hm_lvt_c83c032e78cf7375a9080f7c7cb11f4d=1329629501454; wordpress_logged_in_291e3cce02324c1995dd5347a4c388d8=jaseywang%7C1330445508%7C1c14af67aebf19f5; Hm_lpvt_c83c032e78cf7375a9080f7c7cb11f4d=1329629501454
Host    jaseywang.me
User-Agent    Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0

Continue reading

[error] NSS_Initialize failed

之前有台服务器(CentOS 5.5 x86_64)装完了系统就没碰过(安装过程中默认配置了 apache)。今天下午有空把基本环境配置了一下,顺便 yum update 了一下,reboot 后发现主页访问不了了!service httpd restart,还是不好访问,top 看,3 个僵尸,没在意;再重启服务,ps -ef | grep def,变成了 5 个。
并且全是 httpd 产生的进程,kill -9/kill -15 刚杀完几秒钟又出来了,除非杀死 httpd 的父进程或者 /etc/init.d/httpd stop。查看 error_log,才一会功夫就 60M 了,果真是要没不出问题,一出问题就能撑爆 /var 。

[Thu Apr 14 19:43:05 2011] [error] NSS_Initialize failed. Certificate database: /etc/httpd/alias.
[Thu Apr 14 19:43:05 2011] [error] SSL Library Error: -8038 SEC_ERROR_NOT_INITIALIZED

google 之,发现是 nss_module 出的问题。

简单的说 nss_module 是提供 ssl 服务的模块,继承自 mod_ssl 这个模块。由于我不需要系统 https 服务,最简单的方法如下:

# pwd
/etc/httpd/conf.d
# mv nss.conf nss.conf.bk
改成不是以 .conf 结尾就可以了。

其实这个是 bug:https://bugzilla.redhat.com/show_bug.cgi?id=669963

NSS 数据库需要被 apache 这个用户可读,修改 /etc/httpd/alias/*.db 下面的 user:group:

# chmod g+r /etc/httpd/alias/*.db
# chgrp apache /etc/httpd/alias/*.db

教训:
出问题了注意查看相应服务的日至记录。
不要求新而更新系统,还好没直接跳到 5.6,虽说是稳定版本,但是毕竟是新事物,接下去就用哲学的观点去解释吧。
安装这台机子的时候由于当时时间紧促,就直接在安装系统的时候勾选了 apache 服务,想想以后还不不能这么做,默认安装哪些包都不清楚。