关于虚拟主机的配置

Apache的虚拟主机主要分两种:基于ip的虚拟主机和基于域名的虚拟主机

对于单纯的基于ip的虚拟主机来说,配置像这样:

NameVirtualHost 10.10.10.11:80
NameVirtualHost 10.10.10.12:80

#VirtualHost 1
<VirtualHost 10.10.10.11:80>
DocumentRoot "/aaa/"
ServerName domain1
</VirtualHost>

#VirtualHost 2
<VirtualHost 10.10.10.12:80>
DocumentRoot "/bbb/"
ServerName domain2
</VirtualHost>

说明:因为每个ip都配置了虚拟主机,所以只需根据ip就可以判断要访问的是哪个虚拟主机,如果用domain2来访问,而hosts里设置domain2指向10.10.10.11,那么会访问到哪个虚拟主机呢?当然,先根据ip判断,访问 VirtualHost 1了,所以ServerName没有多大用途,师傅说可以作为环境变量(就是说环境变量里会出现ServerName的);或许您会问了,如果用127.0.0.1来访问呢,确实没有给该ip指定使用哪个虚拟主机,这种情况下排在第一个的那个(就是VirtualHost 1)就是默认虚拟主机了,就是说,没有能匹配的上的(用ip和域名匹配,ip优先),就使用默认虚拟主机

 

对于单纯的基于域名的虚拟主机,配置像这样:

#任何ip都是用虚拟主机
NameVirtualHost *:80

#VirtualHost 1
<VirtualHost *:80>
DocumentRoot "/aaa/"
ServerName domain1
</VirtualHost>

#VirtualHost 2
<VirtualHost *:80>
DocumentRoot "/bbb/"
ServerName domain2
</VirtualHost>

说明:这样的话,不管走哪个ip(因为根据ip没法区分),用domain1访问,就访问到VirtualHost 1,用domain2访问,就访问到VirtualHost 2;

对于既有基于ip的虚拟主机也有基于域名的虚拟主机,配置像这样:

#任何ip都是用虚拟主机
NameVirtualHost *:80

#VirtualHost 1
<VirtualHost 10.10.10.11:80>
DocumentRoot "/aaa/"
ServerName domain1
</VirtualHost>

#VirtualHost 2
<VirtualHost 10.10.10.12:80>
DocumentRoot "/bbb/"
ServerName domain2
</VirtualHost>

#VirtualHost 3
<VirtualHost domain3:80>
DocumentRoot "/ccc/"
ServerName domain3
</VirtualHost>

说明:
1. 要注意启动apache时,domain3指向的是哪个ip,因为<VirtualHost domain3:80>里的domain3是要解释成ip的,分析的时候就把这里当作解析成的ip来对待

2. 假设domain3解释为10.10.10.11,如果客户端用domain3指向10.10.10.11来访问,我们发现就有两个10.10.10.11:80的虚拟主机,然后根据ServerName判断,发现#VirtualHost 3是最匹配的一个虚拟主机,于是#VirtualHost 3就是要访问到的虚拟主机;

3. 假设domain3解释为10.10.10.11,如果客户端用domain3指向10.10.10.12来访问,先根据ip判断,只有#VirtualHost 2是匹配的,所以#VirtualHost 2就是要访问到的虚拟主机;

4. 要想只要用domain3访问,都是访问/ccc/目录,那么就要对两个ip都配置ServerName为domain3的虚拟主机;我们想,将#VirtualHost 3改成如下行吗:
#VirtualHost 3
<VirtualHost *:80>
DocumentRoot "/ccc/"
ServerName domain3
</VirtualHost>

答案是:不行;因为做ip匹配的时候,优先选用更精确匹配的一个,显然与另外两个虚拟主机相比,通过任何一个ip访问,* 都不如直接用ip定义的虚拟主机精确,所以这时的#VirtualHost 3只有通过环回地址访问,而且只要通过环回地址访问,使用任何主机名访问的都是#VirtualHost 3;

对于NameVirtualHost的使用
如果某个ip:port 上只设置了一个虚拟主机,那么NameVirtualHost ip:port 可以不写,因为从这个ip:port的访问不需要做任何选择;
如果某个ip:port 上设置了多于一个虚拟主机,那么必须使用指令
NameVirtualHost ip:port ,
否则从该ip:port的访问只访问第一个该ip:port 的虚拟主机(因为它优先,apache启动时会提示的);
如果使用了指令
NameVirtualHost ip:port ,
却没有为该ip:port定义任何虚拟主机,好像不会出现访问到错误的虚拟主机的问题(因为谁也不知道你想干什么,不过apache还是会提示你:[warn] NameVirtualHost ip:port has no VirtualHosts);
如果VirtualHost 指定的虚拟主机没有匹配一个NameVirtualHost 指令,那么该虚拟主机不会被用到(除非他是第一个虚拟主机),这相当于没有NameVirtualHost 指令,即:如果有多个虚拟主机,一定要有NameVirtualHost 指令

注:

虚拟主机中可以缺省很多指令,我曾经只是想给通过不同域名的访问分别记录日志,实际上他们访问的都是相同的东西,所以DocumentRoot指令就可以省略了,里面我只写了三条指令,如:

<VirtualHost *:80 >
        ServerName *
        TransferLog "|rotatelogs /backup/apachelog/%Y%m/access_log.%Y%m%d 86400 480"
        ErrorLog "|/rotatelogs /backup/apachelog/%Y%m/error_log.%Y%m%d 86400 480"
</VirtualHost>


打包大批量文件的方法

对于大批量的文件如果要tar的话,是不能直接:tar -cvf a.tar * 的,因为* 扩展开来太大了,会出现参数太长的错误,一般来讲这种问题都通过xargs命令来解决,如:

ls * | xargs tar -rvf a.tar

注意:
1. 这里用到了tar命令的选项 -r ,是append的意思,但是如果tar文件不存在,也有create的作用
2. -r 选项不能和 -z 选项同时使用,所以需要压缩的话,都tar完之后再gzip

如果不知道 -r 选项,当然还可以 把所有要tar的文件mv到一个新的目录,还得用到xargs命令,不过这时就有点问题了,如:

ls * | xargs mv source target

因为一般情况下我们使用mv时,目标是最后一个参数,所以用xargs传参就有些不合适,但是我man mv 发现可以用选项指定目的地,可以这样写:

ls * | xargs mv –target-directory=/newdir/
然后:tar -zcvf a.tar /newdir

注: 这里的ls * 仅代表数据源的意思,不要直译,可能是find ….或 grep .. 等

一句话自省

一个好东西可能不是它本身有多好,可能多半是它放对了地方;就好像说话,同样一句话,聪明人会说的恰到好处,糊涂人会说的让人啼笑皆非。

人们总是在追求完美的,尽管永远也做不到。

喝酒伤胃,不喝酒伤心。 —2008-09-21 14:43

不要轻易把某个女人比作天使,那样她可能把你比作狗屎。

什么都可以改变,只要你用心;什么都扯淡,只要你不在乎。  —曾用过的msn签名

做事要有原则,更要有方法。   —曾用过的msn签名

百度百科 谚语 : http://baike.baidu.com/view/23790.html

纪念5.12 汶川大地震

    2008.5.12 14:30 左右, 我在北京市中关村理想国际大厦18层,感觉是工作有点累了,自己连同办公桌前后晃动,大概有几秒钟,我发现有些不对,地震?往左右看看,同事都站起来了,地震!地震!果然是地震,我一下子慌了,这是我平生第一次经历地震,因为我们楼高,通过窗户往外望,只觉得楼在晃动,虽然幅度很小,但是还是可以看到的,‘晃动’本身并不可怕,可怕的是这么大个庞然大物在晃动,还是我第一次看到,我有点惊呆了,虽然都知道是地震,但是也仅仅是很小的骚动,没有慌慌张张逃命的现象。不过我倒是很想赶快离开这座大楼,只是我有突然觉得坐电梯很不安全,所以就和大伙儿一块原地呆着,很快,地震过去了,行政部要我们赶快疏散,下了楼才知道,地震不是针对我们来的,震中在四川汶川县,全国大部分地区有震感。

    今天早上起来,手机传来短信,四川死亡近万人,作为一个中国公民,我知道,这是我们国家的异常劫难,2008 太不同寻常了,逢春节,北方无事,南方却遭受百年不遇的雪灾;现在,一个汶川地震,全国都在晃动。

    我想,我们在党中央的领导下,全国人民齐心协力,严重的雪灾没有给我们国家造成太大的创伤;现在,汶川大地震,温家宝总理又亲临第一线,我们每一个中国公民都要在党中央的领导下,为汶川人民重建家园,做出一点自己的行动!

ulimit 详解

ulimit [-SHacdflmnpstuv [limit]]
Provides control over the resources available to the shell and to processes started by it, on systems that
allow such control. The -H and -S options specify that the hard or soft limit is set for the given
resource. A hard limit cannot be increased once it is set; a soft limit may be increased up to the value of
the hard limit. If neither -H nor -S is specified, both the soft and hard limits are set. The value of
limit can be a number in the unit specified for the resource or one of the special values hard, soft, or
unlimited, which stand for the current hard limit, the current soft limit, and no limit, respectively. If
limit is omitted, the current value of the soft limit of the resource is printed, unless the -H option is
given. When more than one resource is specified, the limit name and unit are printed before the value.
Other options are interpreted as follows:
-a All current limits are reported
-c The maximum size of core files created
-d The maximum size of a process’s data segment
-f The maximum size of files created by the shell
-l The maximum size that may be locked into memory
-m The maximum resident set size
-n The maximum number of open file descriptors (most systems do not allow this value to be set)
-p The pipe size in 512-byte blocks (this may not be set)
-s The maximum stack size
-t The maximum amount of cpu time in seconds
-u The maximum number of processes available to a single user
-v The maximum amount of virtual memory available to the shell

If limit is given, it is the new value of the specified resource (the -a option is display only). If no
option is given, then -f is assumed. Values are in 1024-byte increments, except for -t, which is in sec-
onds, -p, which is in units of 512-byte blocks, and -n and -u, which are unscaled values. The return status
is 0 unless an invalid option or argument is supplied, or an error occurs while setting a new limit.

 

中文解释:

-H 设置硬限制.
-S 设置软限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes

 

配置文件: /etc/security/limits.conf 可以针对用户或组进行永久性 配置,使用命令的配置是临时的,针对当前用户的,不写文件的,退出当前shell就没有了的,写在配置文件中可以永久生效

Windows 下文件搜索命令

1. 按文件名搜索【相当于shell中的find命令】
题目:搜索d盘下所有php文件

dir d: /A /S /B *.php

2. 按文件内容搜索【相当于shell中的grep命令】
题目:搜索d盘下含有mail_user 函数 字符串的文件

findstr /D:d:  /S /C:"function mail_user" *.php
解释: /D:  指定要搜索的目录   /S 指定要搜索子目录  /C: 指定字符串为正常的字符串,不采用模式匹配

我比较郁闷的是模式匹配不是那么好用的,用知道的给留个言啊

解读配置文件 /etc/sysctl.conf

从文件名可以看出文件/etc/sysctl.conf 是系统级别的配置文件,而且是控制方面的,但是以前不知道里面都有哪些变量是可以配置的,这次不小心发现了配置文件/etc/sysctl.conf 与 /proc/sys/ 目录是有很大关系的,比如,文件/etc/sysctl.conf 中有配置net.ipv4.tcp_syncookies = 1

那么 /proc/sys/ 目录下就有子目录net ,net 目录下就有目录ipv4, ipv4 目录下又有文件tcp_syncookies ,当然如果配置文件里没有配置,也会有一些默认的目录和文件的,反过来说,只要是/proc/sys/ 下的目录和文件都是可以在配置文件/etc/sysctl.conf 中配置的,这样在机器启动时,就不再是默认值,而是我们配置过的值了,如果不重启系统,但是修改了此配置文件,可以用命令sysctl -p 命令使配置文件生效;

命令:ls -lR /proc/sys/ 可以知道我们可以配置些什么,至于这些配置都是什么意思,还得自己去查呀

注意
1.不要以为我们在/etc/sysctl.conf 中配置了a.b.c = 1 ;sysctl -p 之后就可以在/proc/sys/就生成对应的目录和文件,结果是error的

2. sysctl -p 不会重新载入未定义的配置的默认值的,只会更新配置文件中配置的内容,不会影响没有配置到的内容。

Eaccelerator 相关

由于apache+php 自从收养的Eaccelerator 之后就没个几天要出现一点问题,所以我不得不研究一下Eaccelerator了,环境:

[junjie2@login htdocs]$ php -v
PHP 5.1.5 (cli) (built: May 28 2007 11:31:05)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with eAccelerator v0.9.5.2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator
[junjie2@login htdocs]$ /data1/apache/bin/httpd -v
Server version: Apache/1.3.33 (Unix)
Server built: Feb 2 2007 11:21:13
[junjie2@login htdocs]$

Eaccelerator 版本为0.9.5.2

问题为:每隔几天apache就无法访问,重启apache一切正常,没有明显有效的apache错误日志。

解决方法:

1. 使用gdb调试apache ,因为apache编译时没有指定-g 参数,所以没法gdb调试

2. strace apache的主进程,没发现什么有效信息

3. 研究一下Eaccelerator ,决定换个版本试试,因为0.9.5.2 对0.9.5 只针对php5.2 修改了一个bug,而我的php是5.1.5的,所以用0.9.5是可以的

 

相关发现:

1.php Eaccesleratror 本身也提供了session管理的功能,但是默认的编译时没有编译进去的,需要  –with-eaccelerator-sessions  来启用该功能

2. Eaccelerator 只能用于web,对命令行无效,但不会报错,而且PHP必须是以模块的方式运行在apache中的cgi的方式不行,PHP的另一个加速器APC也有此要求

3. Eaccelerator 中的调试选项:
eaccelerator.debug="1"
eaccelerator.log_file = "/var/log/httpd/eaccelerator_log"

没有发现该文件有多少有用的调试信息,简单测试发现信息基本如下:
EACCELERATOR cached: "/var/www/html/test.php"
EACCELERATOR cached: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR hit: "/var/www/html/test.php"
EACCELERATOR cached: "/var/www/html/test2.php"
EACCELERATOR cached: "/var/www/html/test3.php"

—————————————————————————————————-
4. 关于编译选项:–with-eaccelerator-debug
加上之后没有发现更多的调试信息,eaccelerator_log 文件中还是除了 hit 就是cached的

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
eAccelerator配置选项
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


eaccelerator.shm_size
       指定 eAccelerator 能够使用的共享内存数量,单位:MB
       "0" 代表操作系统默认。默认值为 "0"。

eaccelerator.cache_dir
       用户磁盘缓存的目录。eAccelerator 在该目录中存储预编译代码、session 数据、内容等。
       相同的数据也可以存储于共享内存中(以获得更快的存取速度)。默认值为 "/tmp/eaccelerator"。

eaccelerator.enable
       开启或关闭 eAccelerator。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.optimizer
       开启或关闭内部优化器,可以提升代码执行速度。"1" 为开启,"0" 为关闭。默认值为 "1"。

eaccelerator.debug
       开启或关闭调试日志记录。"1" 为开启,"0" 为关闭。默认值为 "0"。

eaccelerator.check_mtime
       开启或关闭 PHP 文件改动检查。"1" 为开启,"0" 为关闭。如果您想要在修改后重新编译 PHP
       程序则需要设置为 "1"。默认值为 "1"。

eaccelerator.filter
       判断哪些 PHP 文件必须缓存。您可以指定缓存和不缓存的文件类型(如 "*.php *.phtml"等)
       如果参数以 "!" 开头,则匹配这些参数的文件被忽略缓存。默认值为 "",即,所有 PHP 文件
       都将被缓存。

eaccelerator.shm_max
       当使用 " eaccelerator_put() " 函数时禁止其向共享内存中存储过大的文件。该参数指定允许
       存储的最大值,单位:字节 (10240, 10K, 1M)。"0" 为不限制。默认值为 "0"

eaccelerator.shm_ttl
       当 eAccelerator 获取新脚本的共享内存大小失败时,它将从共享内存中删除所有在
       最后 "shm_ttl" 秒内无法存取的脚本缓存。默认值为 "0",即:不从共享内春中删除
       任何缓存文件。

eaccelerator.shm_prune_period
        eAccelerator 获取新脚本的共享内存大小失败时,他将试图从共享内存中删除早于
       "shm_prune_period" 秒的缓存脚本。默认值为 "0",即:不从共享内春中删除
       任何缓存文件。

eaccelerator.shm_only
       允许或禁止将已编译脚本缓存在磁盘上。该选项对 session 数据和内容缓存无效。默认
       值为 "0",即:使用磁盘和共享内存进行缓存。

eaccelerator.compress
       允许或禁止压缩内容缓存。默认值为 "1",即:允许压缩。

eaccelerator.compress_level
       指定内容缓存的压缩等级。默认值为 "9",为最高等级。

eaccelerator.name_sapce
       一个所有键(keys)的前缀字符串。如果设置该前缀字符串则允许 .htaccess 或者 主配置
       文件在相同主机上运行两个相同的键名。

eaccelerator.keys
eaccelerator.sessions
eaccelerator.content
       判断哪些键(keys)、session 数据和内容将被缓存。可用参数值为:
       "shm_and_disk" – 同时在共享内存和磁盘中缓存数据(默认值);
       "shm"          – 如果共享内存用尽或者数据容量大于 "eaccelerator.shm_max"
                        则在共享内存或磁盘中缓存数据;
       "shm_only"     – 仅在共享内存中缓存数据;
       "disk_only"    – 仅在磁盘中缓存数据;
       "none"         – 禁止缓存数据。


eAccelerator 应用程序接口(API)

eaccelerator_put($key, $value, $ttl=0)
       将 $value 存储在共享内存中,并存储 $tll 秒。

eaccelerator_get($key)
       从共享内存中返回 eaccelerator_put() 函数所存储的缓存数值,如果不存在或者已经
       过期,则返回 null。

eaccelerator_rm($key)
       从共享内存中删除 $key。

eaccelerator_gc()
       删除所有过期的键(keys)

eaccelerator_lock($lock)
       创建一个指定名称的锁(lock)。该锁可以通过 eaccelerator_unlock() 函数解除,在请求
       结束时也会自动解锁。例如:
       

<?php
               eaccelerator_lock("count");
               eaccelerator_put("count",eaccelerator_get("count")+1));
       ?>



eaccelerator_unlock($lock)
       解除指定名称的锁(lock)

eaccelerator_set_session_handlers()
       安装 eAccelerator session 句柄。
       从 PHP 4.2.0 以后,您可以通过设置 php.ini 中的 "session.save_handler=eaacelerator"
       安装 eAccelerator 句柄。

eaccelerator_cache_output($key, $eval_code, $ttl=0)
       在共享内存中缓存  $eval_code 的输出,缓存 $ttl 秒。
       可以调用 mmcach_rm() 函数删除相同 $key 的输出。例如:
       

<?php eaccelerator_cache_output(‘test’, ‘echo time(); phpinfo();’, 30); ?>



eaccelerator_cache_result($key, $eval_code, $ttl=0)
       在共享内存中缓存 $eval_code 的结果,缓存 $ttl 秒。
       可以调用 mmcach_rm() 函数删除相同 $key 的结果。例如:
       

<?php eaccelerator_cache_output(‘test’, ‘time()." Hello";’, 30); ?>



eaccelerator_cache_page($key, $ttl=0)
       缓存整个页面,且缓存 $ttl 秒。例如:

<?php
               eaccelerator_cache_page($_SERVER[‘PHP_SELF’].’?GET=’.serialize($_GET),30);
               echo time();
               phpinfo();
       ?>


eaccelerator_rm_page($key)
       从缓存中删除由 eaccelerator_cache_page() 函数创建的相同 $key 的页。

eaccelerator_encode($filename)
       返回 $filename 文件经过编译后的编码。

eaccelerator_load($code)
       加载被 eaccelerator_encode() 函数编码过的脚本。

PHP加速器官方网站:http://eaccelerator.net/ 页面内的每个链接点开都有很多需要了解的东西

什么是α、β测试

  事实上,软件开发人员不可能完全预见用户实际使用程序的情况。例如,用户可能错误的理解命令,或提供一些奇怪的数据组合,亦可能对设计者自认明了的输出信息迷惑不解,等等。因此,软件是否真正满足最终用户的要求,应由用户进行一系列“验收测试”。验收测试既可以是非正式的测试,也可以有计划、有系统的测试。有时,验收测试长达数周甚至数月,不断暴露错误,导致开发延期。一个软件产品,可能拥有众多用户,不可能由每个用户验收,此时多采用称为α、β测试的过程,以期发现那些似乎只有最终用户才能发现的问题。

  α测试是指软件开发公司组织内部人员模拟各类用户行对即将面市软件产品(称为α版本)进行测试,试图发现错误并修正。α测试的关键在于尽可能逼真地模拟实际运行环境和用户对软件产品的操作并尽最大努力涵盖所有可能的 用户操作方式。经过α测试调整的软件产品称为β版本。紧随其后的β测试是指软件开发公司组织各方面的典型用户在日常工作中实际使用β版本,并要求用户报告异常情况、提出批评意见。然后软件开发公司再对β版本进行改错和完善。

相关资料:http://www.itisedu.com/phrase/200602271215442.html