apache安装时的一些术语
apache源码安装时,需要的哪些必须依赖模块?
主要需要apr, apr-util, pcre模块
其中 apr模块时必须的.
如何卸载 源码安装的软件?
- 在源码 的 解压目录下, 使用 make uninstall/ make clean, make distclean
- 直接将 安装在--prefix目录下的文件全部都删除掉即可!
- 使用 --prefix选项的另一个好处是卸载软件或移植软件:
当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;
移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。
当然要卸载程序,也可以在原来的make目录下用一次make uninstall,但前提是make文件指定过uninstall。
apache为什么不自带php模块?
怎样查看apache加载了哪些模块?
有两个部分:
- 是 httpd -l, 可以查看"compiled in modules" , 查看apache在编译时就包含进apache里的模块...
- 另一个就是 看 /etc/httpd/conf/httpd.conf 文件中的 LoadModule.... 看载入了哪些目录...
在httpd的配置文件中, 如何使用别名?
同样的 , 在配置文件中, 要在后面使用别名, 要先使用alias定义别名, alias的好处 就如同 快捷方式一样, 可以用一个比较简短的, 比如, 只是最后的目录名, 来代替 目录位置 很深的目录, 如: 在autoindex.conf中, 使用 alias /icons/ /usr/share/httpd/icons/
linux中的目录后面都不能 带 斜杠/吗?
- 不一定
- 完全就是 看你 在后面的 应用, 如果你后面的应用中, 本身就没有斜杠, 而且是目录名 和后面的内容 直接相连, 那么这个时候, 目录名后面就要带 斜杠/
- 反之, 如果你后面要连接的内容, 本身自己就带有斜杠, 或者自己 在代码中, 手动地添加 斜杠, 那么这时候, 目录名后面就不能带 斜杠/ 了
为了便于后面的引用, 所以 在配置文件中, 也做了 alias设置. 同时 , 对任何目录, 都要显式地设置访问权限, 对于需要索引的, 还要设置 options Indexes...
require all granted, 中的require, 可以认为是 apache服务器/用户 对 httpd 的命令请求. 所以是require, 不是request.
未知的图标是 unkown.gif, unkown.png, 就是 打问号的图标.
/icons/下 的 图标都只有两种: gif和png, 其中, png的稍微要大一些
httpd/conf.modules.d/00-base.conf....等以00开头, 或许只是一种占位符...
厘清httpd的配置文件结构?
-
首先, 看httpd配置文件的目录结构:
配置东西在前面几个目录: /etc/httpd/conf, conf.d, conf.modules.d, 后面的三个目录是httpd的"实体"文件, 如logs, modules, run. 实际上他们都是链接文件, 因为你不可能把实体文件放在配置目录中.
logs是链接到 /var/logs/httpd的目录, modules是链接到 /usr/lib/httpd/目录的, 因为不是 自定义源码安装, 所以是放在系统库中的, 不是放在 用户安装的库目录/usr/local/apache2/lib/...中, run是链接到 /run/httpd目录中的. -
ServerRoot: 时指 httpd的配置文件, 日志logs, 错误errors, 也是i以日志的方式error_log...表示的, 模块等保存的目录, the top of directory tree under which httpd configurations, logs,errors, modules are kept(keep具有 : 保持, 使...保留的意思)
-
static: 读音是[st2tic], 不是[steitic]原来一直读错了. statically: 静态地. 加载的模块, 分为静态编译的模块, 比如用 httpd -l列出的那些模块;
include conf.modules.d/*.conf
是动态共享的对象, dso, 静态编译的模块, 不需要用 LoadModule mpm_prefork_module modules/mod_mpm_prefork.so 来动态的加载的
-
动态加载模块, 是在httpd.conf最早几行就完成的, 这样在后面才能生效: <IfModule ....> , 否则后面的配置就无法生效.
-
在主配置文件的 最后面, 包括其他的配置文件放在 目录 conf.d 中, 如 autoindex.conf, userdir.conf, welcome.conf
-
比如welcome.conf, 是如果没有在/var/www/html下找到索引文件, 则打开: /usr/share/httpd/noindex/index.html
linux的命令参数和 选项
通常来说, 命令 的 参数 是表示的 命令的目标, 而选项表示的是命令的可选的项目,通常 参数是紧跟在 选项符合, 用-来表示 . 比如, 要创建一个软链接, ln -s $destFile $linkFile
, 由于ln命令是创建链接文件, 因此, 俩接文件linkFile就是 命令的参数, 而 -s是选项符合, 所以 要链接的目标文件就放在 -s的后面
在linux/win的世界中, 配置文件,使用 ini, conf , config等文件, 主要有两种格式 (解释器解释方式): 一种是ini中的 [section] key = value
, 使用 等号的方式, 另一种是使用conf/httpd.conf的形式, directives是使用的 空格 来 进行分隔和解释.
file命令?
file的意思是 "文件", 因此, 该命令, 就是判断一个文件(包括目录)的性质, 是: ascii文件, directory, 还是 symbolic link等, 还是character file等
硬链接和软链接?
- 硬链接也称为 实体链接. 就是真的 要另外 去 创建 一个 真实的 文件. 而软链接, 并不会 真的去创建 一个真实的文件, 充其量只是记载一些 目标文件的路径/文件名/inode等文件meta元信息而已.
- 对文件可以创建软/硬链接都可以, 毕竟对文件的硬链接只是 创建 该文件本身的 !一个! 文件. 不会影响其他内容. 硬链接的 inode是一样的.
- 因为是真实的 实体文件, 所以你删除一个文件, 另一个文件丝毫不受影响. 而软链接删除了目标文件后, 就会提示 : broken symbol link. 同时文件也会显示为红色(表示警告), 用cat命令打印时, 会提示"没有such file or directory"
- 但是, 不能对目录创建硬链接: 一是, 可能会造成目录的循环; 二是, 在一个目录中创建文件或子目录时, 在另一个"硬链接"的 目录中, 也要去创建文件和子目录, 这样会造成文件系统的复杂度大大增加, 所以,不支持 目录的硬链接..
区分 apr和arp 的不同?
arp: address resolution protocal, 最后的p表示协议, 是从 ip->mac地址的解析协议.
apr: apache portable runtime libraries: apache 可移植运行时库. 是从apache项目独立出来的, 原来的apache的应用程序要自己去处理不同平台(windows,linux/unix, mac等)下函数调用的细节, 而apr将平台的区别做了下移, apr完成了平台处理细节的不同, 提供给了应用程序在各种平台下的 函数调用的 同一接口. 也就是屏蔽了底层操作系统的不同...所以可以方便地让application进行移植...
子进程和线程的区别?
子进程是由父进程产生的独立的程序. 父子进程之间基本上没有多大的/太多的关系, 虽然他们之间还是可以通过 dde, ole, 邮槽等进行通信.
而线程是属于进程的, 跟进程紧密相连/相关的概念.
系统分配资源是按进程来分配的, 线程不额外占有资源, 只是在 进程的范围内, 多个线程之间 共享/竞争 资源.
也就是, 进程/子进程和线程之间的 "粒度" 不同
如: ie调用pdf程序打开pdf文档, 是进程和子进程之间的关系, 而一个ie打开多个 标签则是 进程和线程的关系.
进程和线程的区别在于粒度不同, 进程之间的变量(或者说是内存)是不能直接互相访问的, 而线程可以, 线程一定会依附在某一个进程上执行.
在Windows下开一个IE浏览器, 这个IE浏览器是一个进程.
你用浏览器去打开一个pdf, IE就去调用Acrobat去打开, 这时Acrobat是一个独立的进程, 就是IE的子进程.
而IE自己本身同时用同一个进程开了2个网页, 并且同时在跑两个网页上的脚本, 这两个网页的执行就是IE自己通过两个线程实现的.
值得注意的是, 线程仍然是IE的内容, 而子进程Acrobat严格来说就不属于IE了, 是另外一个程序.
之所以是IE的子进程, 只是受IE调用而启动的而已
父子进程之间, 也不能这么说从此就没关系了, 父进程还是可以通过和子进程通信来获得一些信息的. 拿上面的例子来说, IE可以通过一些进程间通信的接口来知道Acrobat是否顺利的把pdf打开了之类的信息. 但有一点我觉得你的理解基本正确, 就是父进程和子进程是独立的. 假如IE开了一个病毒子进程, 子进程不听话, 父进程也没什么特别的办法, 除了向系统申请去关闭它之外.
### 区分子进程和线程很简单:
一个独立程序的运行称为一个进程, 在进程里并发执行的不同部分称为线程. 由这个进程引发的另外的独立程序运行为这个进程的子进程.
httpd中的StartServers 5 和 MaxKeepAliveRequests 100 是什么意思?
httpd --- 5*[httpd], 表示一个httpd的父进程, 还有5个httpd的子进程.
也就是, StartServers 5: 中的Start表示开始, 启动, 即在apache服务器启动的时候, 除了有一个父进程httpd外, 另外还会 在开始的时候, 一次性fork出 5个子进程, 这样可以减少系统的开支.
而MaxKeepAliveRequests 100指的是, 使用alive连接, 即当一个请求进来后, 创建一个连接, 当这个请求处理完成后, 这个连接并不马上断开, 而是继续保持和这个client/ip的连接, 等待这个同一个 /相同的客户端的下一次 请求, 这样就避免了下一次请求时, 再次建立连接的资源开销. 虽然在一定程度上, 提高了效率, 但是也可能带来负面的影响, 那就是, 如果这个连接一直保持, 但是又迟迟没有请求进来, 那么这个连接就白白浪费了系统维护这个连接的开销,相当于"占着位置不拉x". 当这样keepalive的连接多了, 就会造成可用的连接数不够用, 后来的连接请求就没有办法处理. 因此, 为了综合 这样的两个方面的影响, 就规定这个, MaxkeepAliveRequests数....?
php为什么不适用大型系统?
- 对递归的不良支持(递归是一种强大的机制,将复杂的问题简单化,如递归quicksort排序)
- 许多php模块都不是线程安全的。
apche2.2服务器是支持多线程的。php的核心模块是线程安全的,但是非核心模块很多都不是线程安全的。所以,php小组不推荐再apache2的多线程模式下运行php
什么叫线程安全?
- 线程安全是指, 当多线程访问同一代码,不会产生不确定的结果, 编写线程安全的程序,就是依靠线程同步(即线程锁)
- 什么时候,才需要考虑多线程之间的同步? 即: 在多线程环境中, 当各线程之间不共享数据(即使是对数据/变量进行写操作)的时候,线程一定是安全的. 或者, 线程之间共享数据,但是只是读数据, 不写操作, 那么也是线程安全的.
- 如: 对于一个接口而言,线程之间有一个共享的数据成员, private int count=10, 这时候就要考虑线程同步; 而在继承方式下, 线程之间没有共享的数据成员,各线程各自有一个私有成员,这时候,就不必考虑线程间的同步.
- 但是,在多线程中,各线程之间不共享数据的情况并不多见, 在多数情况下都要共享数据, 这时候,就需要进行适当的同步控制了.
- 线程安全一般都要用synchronized,就是同一段代码同时只能有一个线程来操作, 不然中间过程可能会产生不可预知的结果, 也就是说, 其中某个线程要操作的时候,必须先取得 一个 唯一的, 排他的token 才能进行
- 如果你的代码所在的进程中,有多个线程在同时运行,而这些线程可能会同时(时间片断交替运行)运行这段代码( 多线程还是允许多个线程 在时间片中交替运行你的代码的, 你也许做了同步控制, 也许没有做同步控制, 要分具体情况处理。。)如果每次运行的结果和单线程运行的结果都是一样的, 而且其他变量的值也和预期的值是一样的, 就是线程安全的。
- 比如,一个ArrayList类,在添加一个元素的时候,假设会有两步来完成:1. 在item[size]的位置存放此元素,2.增大size的值。 在单线程运行的情况下, 如果size=0, 添加一个元素后, 此元素在位置0, 而且size=1; 而如果是在多线程情况下, 比如有两个线程,线程A先将元素存放在位置0, 但是此时cpu调度线程A暂停,线程b得到运行的机会,线程b也向ArrayList添加元素,因为此时size仍然等于0(因为线程A仅仅完成了一步)所以线程B也将元素存放在位置0, 然后线程A和线程B都继续运行, 都增加size的值。 这时候,ArrayList的情况是,元素实际上只有一个,存放在位置0, 而size等于2. 这就是 “线程不安全”了。
- 如果一个类或程序所提供的接口对于线程来说是 原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,这时候我们就不用考虑同步的问题
- 线程安全的问题都是 由全局变量和静态变量引起的
- 如果每个线程对全局、静态变量只有读操作, 没有写操作,一般来说, 这个全局变量就是线程安全的; 若有多个线程同时执行写操作,一般都要考虑线程同步, 否则就可能影响线程安全。线程安全是多线程访问是,采用加锁机制, 当一个线程访问该类的某个数据时, 进行保护,其他线程不能进行访问, 知道该线程 “读写”完成后, 其他线程才可以使用, 不会出现数据不一致或数据污染而造成“脏数据”
如何判断一个字符串是否是数字?
- 使用的函数是 is_numeric, 不是 numberic, 那个是笔误。
- is_numeric的参数是mixed var, 即混合类型,既可以是数字变量, 也可以是“数字字符串”
- 数字字符串, 是数字序列的字符串, 即使是0开始的也是,0开始的认为是8进制数字 , 好像是忽略0后的值.
- 要获取一个数字/数字字符串的值, 最好的方法是 intval;
如何知道察看 apache/httpd是单线程还是多线程在运行?
就是看apache的版本, 如果是2.2.x, 则是采用的子进程(每个子进程采用单线程)的方式, 如果是 2.4.x, 则才用的是 多子进程和 多线程的混合方式. 是因为, 如果在多线程方式下, 如果其中一个线程崩溃, 那么其他线程也会崩溃. 如果没有其他子进程, 那么整个应对处理就没有了.
关于apache的mpm?
mpm: multi-processing modules: 多处理模块,有:prefork, worker模式, event事件模式
prefork是产生多个子进程, 每个子进程负责处理一个连接请求;
worker也是产生多个子进程,但是不是由子进程直接负责处理连接请求,而是子进程产生多个线程, 由一个线程来负责处理一个连接请求
对php这种non-thread-safe(非线程安全,不是 “非安全线程”)来说,通常让apache采用prefork 模式。
mpm是apache2引入的概念,将结构模块化。将核心处理任务模块化。
prefork mpm基于非线程模型,跟apache1.x版本的处理方式很相似,对运行非线程安全(non-thread-safe)模式的软件如PHP,它是唯一的安全选择。
只是在并发量较大时,耗费的内存较大。
Worker?MPM基于线程模式,具有内存消耗低(对繁忙的服务很重要)、扩展性在某些特定应用情况下比Prefork更好等优点。在这个模式下,采用的进程和线程混合的形式处理请求。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的Prefork模式
event是解决应对高负荷的最好方式,但是它不支持https连接。通常的做法是:低点击量的用prefork每秒几千到1万的负荷是能承受的;但是work能承受每秒几万次的点击量。
如果直接用 apache2-mpm-worker 使用worker模式将导致php无法使用。因此,要事先安装配置一些东西。
使用httpd -V 可以查看服务器载入的模块,apr,和服务器的MPM模式。
查看已经载入 的模块 也可以使用 : httpd -M
#loadModule mpm_prefork_module modules/mod_mpm_prefork.so
prefork模式可以算是很古老但是非常稳定的Apache模式。Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不需要支持线程安全)
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
有些人会觉得奇怪,那么这里为什么不完全使用多线程呢,还要引入多进程?
原因主要是需要考虑稳定性,如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了(它们都是同一个进程下的)。为了防止这场异常场景出现,就不能全部使用线程,使用多个进程再加多线程,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。
优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题
apache 的mpm模式?
# httpd -V
Server version: Apache/2.4.10 (Unix)
Server built: Dec 29 2014 11:23:13
Server's Module Magic Number: 20120211:36
Server loaded: APR 1.5.1, APR-UTIL 1.5.3
Compiled using: APR 1.5.1, APR-UTIL 1.5.3
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
编译的时候,可以通过configure的参数来指定:
--with-mpm=prefork|worker|event
也可以编译为三种都支持,通过修改配置来更换
--enable-mpms-shared=all
在httpd.conf中修改Apache的多处理模式MPM可以通过(modules文件夹下,会自动编译出三个MPM的so):
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
- prefork MPM
prefork模式可以算是很古老但是非常稳定的Apache模式。Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不需要支持线程安全)
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
Apache的httpd.conf中的配置方式:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5 // 表示服务器始终要保持的最低子进程数为5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 0
</IfModule>
icon和iconv的区别?
icon: 是 图标, 图标文件的意思
iconv: international convert, 表示的是 国际 字符集 编码 转换, conv 是转换convert的意思.
在 php等语言中, 还有专门的iconv函数, 而在 linux下, 有专门的 iconv 命令, 包括用法:
iconv -f : 从要转换的 字符集
-t: 要转换到的 字符集
-o: 要转换后的保存的文件
php中有两个编码转换的工具iconv和mb_convert_encoding区别, 参考: https://www.douban.com/note/232122976/
- iconv通常是php自带的模块, 而后者通常要安装/启用 mbstring模块/扩展
- 如果我们在输入/编辑文件 的时候, 没有明确的指明要使用的字符编码集, 那么默认的就是使用的 是操作系统os的 编码, 如win下就是 gb2312, 而linux就是 en_US.UTF-8
- 因此如果是win下的默认文件, 在做字符集转换的时候, 就要使用
iconv("gbk/gb2312", "utf-8", $str)
, 就不能是iconv("utf-8", "utf-8", $str)
- iconv 的一个众所周知的bug, 是在遇到 字符"-"时 会终止字符转换. 方法是使用//ignore:
iconv("gbk", "utf-8//ignore" , $str)
注意,ignore是放在目标字符集的后面, 而且是包含在 整个双引号内的.???? - mb_convert_encoding的参数顺序刚好和 iconv相反: `mb_convert_encoding($str, "to", "from").
- file_input_content表示将字符串内容写入到文件中, 而file_get_content表示将文件内容读入到一个字符串中.
etc的启动目录配置?
- 启动级别配置 全都 放在 /etc/rc.d 目录中的, 包括: /etc/rc.d/init.d + rc0.d ~ rc6.d 总共有7个启动级别, 是从rc0 到 6.
- 为了方便, 把/etc/rc.d下的目录全部都链接 到 了 /etc/根目录下. 即 /etc/init.d, /etc/rc0~rc6.d
- 在所有启动级别下都启动的是 init.d, 所以把 开机启动的httpd放在 /etc/init.d中.
制作背景透明的图片?
- 需求,在web中, 可能需要将图片放在其他颜色的背景条/块/区域上, 要求除了图片外的其他地方都要透明. 但是通常我们在用软件创建图片的时候, 都是方形/矩形的画布, 除了图片内容的地方, 其他地方如果是白色的话, 那么放在非白色背景下,就能看得出来...这通常不是我们想要的, 我们想要除了图片真的图像之外的地方要是 透明的,才行
- 使用的工具是 ps7.0 很经典的版本,基本上够用了. 先抠取我们想要的图像部分, 然后创建一个 矩形画布,但是背景选择 "透明"
- 然后粘贴抠取的图像, 最后保存为 "png" web上使用的格式即可
关于apache和httpd的关系?
- apache是一个很大的软件组织, apache software foundation . 而httpd 只是它众多项目中 的一个项目而已, 叫做: HTTP Server Project.
- apache的根网站是:
http://www.apache.org
而apache服务器即 httpd的站点是:http://httpd.apache.org/
- essential: 是要点, 本质, 必需品, 精华. 在网站上的内容列表时, 表示的是: "要点" Essentials:
怎样选httpd-2.2.x版本还是 httpd-2.4.x版本?
- 肯定回答: 使用 httpd-2.2.x, 比较经典的/稳定的是: httpd-2.2.34的版本
- 原因是:
httpd-2.2.x(prefork)
httpd-2.4.x(event) 编译时可以使用--with-mpm=prefork手动指定其使用prefork
PHP官方推荐 httpd使用prefork(php能更稳定地运行),而不是线程化的worker和event,httpd-2.4.x默认使用线程化的event作为mpm.
Linux上很多PECL库都是非线程安全的,libphp5.so在线程化的httpd(event/worker)中运行可能会出现一些问题,为了保持兼容性和稳定性,PHP一般还是使用httpd-2.2.x(prefork)这个分支.
原因很简单,linux上升级软件很困难,没人敢冒险升级
如果不出大问题,服务器的软件很少有大的升级
在哪里下载httpd?
有比较多的地方都可以下载httpd, 但是在 apache / httpd的官网上本身就可以下载..而且其相关项目, apr, apr-util也可以从apache的官网上下载:
https和http?
- https是加入了 ssl(安全套接层)的 http.
- 现在国内很少支持https的, 某度都不收录 https. 因为https要ca证书,证书要收费, 而https对用户来说, 是透明的, 企业部署https有技术难度, 有资金和运行成本付出...
- 分三种情况: 如果整站 http, 和 https 这两种协议都支持的话, 那么你随便输入那种头都可以 定位到相同网页; 如果不支持 https的话, 就只能是http才能访问; 反之, 如果某些网站全站 强制使用https的话, 那么你用http也就不能访问了!
mission和 is to do?
mission是任务,使命的意思, 动词不定式to do是可以放在 be后面作表语的: The mission of Apache Portable Runtime Library Project is to create and maintain....
red hat 7 中的启动服务放在哪里的?
- 之前的版本是放在 /etc/rc.d/init.d/下面的
- 7以后的版本是, 放在 /etc/systemd(系统配置)/system/multi-user.target.wants/下的, 比如 httpd.service
qizhong, systemd下放置的配置文件很多, 比如: resolved.conf, user.conf, timesyncd.conf, system.conf等. (system和system.conf是不同的, 前者是目录, 后者是系统配置文件.
httpd -k start中的-k可以看作是 控制类型 --kind的意思, 实际上是 向httpd服务器发送命令... 因为httpd不是向dnf, git那样的命令, 可以带"子命令", 它后面不能再带子命令, 所以向 start/restart/stop/shutdown等命令选项必须以-k 的方式来传递..
httpd -c directive / -C directive 是指在读取配置文件之前或之后, 处理指定的指令 , -c是command指令的意思;
-f是指定配置文件, -d: 是指定 ServerRoot目录的意思, 可以覆盖服务器根目录;
-S 查看虚拟主机的配置.
在配置文件的路径, 如果是以/ 开头的表示 绝对路径, 不是 以/开头的是相对路径, **主要是要 搞清楚相对路径是相对于谁而言的, 这里config是相对于 ServerRoot 目录路径而言的! **
**在httpd 的命令选项中, -k install/config/uninstall -n SERVICE_NAME 只能 在 windows 平台下使用!!! **
常识: 使用全大写 来表示 参数/选项的 配置值: 如: -prefix PREFIX
设计架构?
现在, 思考软件/项目的时候, 要从 架构 和设计 的角度来思考问题了, 假设让我来设计 这个软件项目, 我该怎样作? 学习和体会和记忆!
通常以模块的方式来组织项目, 一个模块表现在文件组织结构上,就是一个目录! 这个目录下放置很多的.c, .php, .class.php等文件和 一个目录/模块中放一个Makefile
关于从http://httpd.apache.org/download.cgi#apache2
下载安装httpd?
-
在url中,支持文件名资源后 的 锚点语法
-
man/与manual目录的区别
-
man1和 man8 的区别
-
为什么apach2/modules那么少,
-
bin下的apachectl和httpd有什么区别?
-
httpd下的 -D name选项?
-
Makefile.in和 Makefile.win 和 Makefile?
-
/usr/bin/install
-
关于make命令?
-
下载的 httpd-2.2.34 中本身就包含 apr和apr-util吗?
-
看文章开头的问题???
Makefile 因为要在 shell下运行 编译, 安装 , 所以其实也是一种shell脚本, 需要被 make 这个命令所解释执行... 因此, 它的写法也要遵守 bash的 语法, 比如: if test ... fi, 等等. 但有些跟纯粹的shell脚本稍有区别, 比如变量的定义, 和变量的 引用, 使用 $(i_am_var). 使用括号是避免根后面的字符相混淆.
**感觉shell脚本的语法, 跟vba有些类似, 都是用 关键字 来表示大括号的 范围, 如: if ... then .... fi , 语句都是按 enter一行为单位自然结束的, 语句后面也不使用分号... ** 但是 特殊的一点是, if 后面的条件后面必须跟 分号;
- 但是, 如果是在一行内写多个语句, 由于没有/无法使用回车符来进行断句, 所以 此时每个语句末尾都要使用 分号来进行分隔
- 由于在命令行shell中 (不是脚本的方式) 写语句, 不管你 一次输入 多少行, 总是默认为 是 一条 语句, **总是认为 你所有的输入都是在 一行内(你用ctrl_p 就看出了) **所以 回车后, 会自动 换到下一行, 即不用写 "续行符" 但是 凡是 执行语句 后面要加分号 , 结构关键字后面 可以不用加分号, 如
case $name in
这一行是结构关键字,不是执行语句,所以不用加分号, 像 test , [ ], echo等语句就是执行性语句. - 如果是在 脚本中 , 则 一条语句 (如if...fi等 就表示一条语句), 在一行内没有写完, 可以使用 "续行符" \
&& 的用法有二: 一是表示条件的逻辑和, 二是 表示 if ... then...fi的简洁写法
虽然都是 alias, 但是不同解释器的 语法写法还是略有区别的(要看解释器是怎样解释和语法分析的 ), 比如: conf/httpd.conf 或 welcome.conf下的 alias的写法, 就没有等号, 而bash中的 alias就有 等号 alias rm="rm -i"
注意 像 ~/.bashrc /etc/bashrc中的 alias 都有 -i的选项, 表示 都要 交互式 提示: 即: rm : prompt before every removal
shell 脚本中的 文件判断选项: -r/-w/-x, -n, -n表示 -null 是比较 字符串是否为null空?
关于数字的大小比较, 不能使用 >, < 因为这些符合是shell的关键字, 表示重定向, 所以数字比较用 -ge, -eq, -le等比较选项
shell脚本中什么时候用双引号?
单引号
两个单引号包围起来的字符串就是普通的字符串,它将保留原始的字面意思.
双引号 (保护4个特殊符号!)
两个双引号包围起来的字符串,部分特殊字符将起到它们的作用.
这些特殊字符有: 美元符$, 反斜杠\, 反引号, 感叹号!. "$HOME, \$HOME, "
反引号
两个反引号包围起来的字符串,将作为命令来运行,
注: seq输出的是包含换行的信息,但echo `seq 3` 却丢失了换行符,因为bash在解析时认为`seq 3`的输出结果是3个独立的字符,解析后与echo 1 2 3相同(这个过程,bash做了很多工作,有兴趣的可以了解下bash解析顺序);
而echo “`seq 3`”时,bash把`seq 3`的输出结果当成一个整体对待(因为它被双引号包围),所以输出的结果不会被bash拆分对待,换行符得以保留。
所以,当你需要保留变量或者命令替换的 完整信息, 特别是换行符时,请记得给它们戴上双引号作保险,时刻加个双引号是个好习惯
(为什么不是单引号呢?前面解释了,单引号里面没有魔法,变量也变不了了,命令 替换也替换不了了)。再次提醒: “$var”, “`command`”, 都比$var, `command`安全得多,很多情况下,前面的才是你要的结果,除非你知道你在做什么,否则不要轻易省略双引号。
可以像C 语言那样, 用 && 来表示 if... then..fi, 使用 &&...||.. 来表示 : if...then...else ...fi shell中的 elseif 被简写elif
shell中的数组?
有两种表示方法: 一是使用传统正式的 表示方法: array=(1 2 3 4) ,
另一种是 使用 双引号, array="1 2 3 5",
要输出数组中的元素, 需要使用 ${array[1]}的格式, 否则 $array[1], 会将 \(array解释成一个变量, 因为array是一个数组, 默认的\)array只输出第一个元素:
对于 if 条件语句里所有的字符串的比较时,最好是在变量的外面加上双引号。特别是 if -n 判断字符串是否为null时候(null意思就是字符串长度为0),一定要加上双引号。否则,像下面的case就会出错。 a=""
if [ -n $a ] 等价于 if[ -n ]
对于字符串长度为0时,相当于没有参数,这句总返回为真。明明a的为空串,长度为空,但是却判断出来为非空字符串。
改为if [ -n "$a" ]就没有此问题,可以判断出来为此为空字符串。
对于字符串的变量,一个比较特殊的情况,就是数组变量。这个时候变量外面不能用双引号,否则的话,shell会把双引号里的内容当作一个字符串,而不会去以空格分割里面的内容。
for i in "$arr" --加了双引号,就会将$arr的内容作为一个字符串一起输出
make的执行过程是, 在 当前目录下有Makefile 文件, make自动执行它, 生成中间文件 *.o, 这个叫做编译. make还有 sub-command, 子命令, 即: make install 就是将生成的文件拷贝到相应的目录中...
**注意的是, make本身就是 系统提供的一个 工具: 在 /usr/bin/make中
cp命令的几个有用的选项:
- -v --verbose: explain what is being done. 表示解释, 显示正在进行拷贝的是什么内容
- -r: 表示对目录进行拷贝操作, 即: --recursive 递归