Posts Tagged: httpd


3
二 10

编译安装Apache

温习编译Apahce的相关知识

预备知识

Makefile的惯例

  1. make clean 清除当前目录下在 make 过程中产生的文件。它不能删除软件包的配置文件,也不能删除 build 时创建的那些文件。
  2. make distclean 类似于”clean”,但增加删除当前目录下的的配置文件、build 过程产生的文件。
  3. make install-strip 和”make install”类似,但是会对复制到安装目录下的可执行文件进行 strip 操作。

make的常用选项

  1. -jN , –jobs[=N],指定并行执行的命令数目。
  2. -n –just-print,–dry-run,–recon,只打印出所要执的命令,但并不实际执行命令。
  3. -s –silent,–quit,不显示所执行的命令。

编译Apache的要求

  1. 磁盘空间
  2. ANSI-C编译器及编译环境
  3. 确保准确的时间
  4. Perl 5 [可选]
  5. apr/apr-util >= 1.2

apr和apr-util包含在Apache httpd的发行源代码中,并且在绝大多数情况下使用都不会出现问题。当然,如果apr或apr-util的1.0或1.1版本已经安装在你的系统中了,则必须将你的apr/apr-util升级到1.2版本,或者将httpd单独分开编译。要使用发行源代码中自带的apr/apr-util源代码进行安装,你必须手动完成:
# 编译和安装 apr 1.2
cd srclib/apr
./configure –prefix=/usr/local/apr-httpd/
make
make install

# 编译和安装 apr-util 1.2
cd ../apr-util
./configure –prefix=/usr/local/apr-util-httpd/ –with-apr=/usr/local/apr-httpd/
make
make install

# 配置 httpd
cd ../../
./configure –with-apr=/usr/local/apr-httpd/ –with-apr-util=/usr/local/apr-util-httpd/

Apache的模块状态

通常我们认为Apache的模块分五类:多路处理模块(MPM),基本模块(Base),扩展模块(Extension),实验性模块(Experimental),第三方模块(External)。
关于各模块的状态详情可以查看手册。第三方模块不包含在发行版中,手册中只标识了四种状态:

M 多路处理模块 必须有且仅有一个MPM被静态编译到服务器中。
B 基本模块 默认包含,必须明确禁用。
E 扩展模块 默认不包含,必须明确启用。
X 试验模块 默认不包含,必须明确启用。

Apache的基本模块

Apache 2.2.14 默认被静态编译进httpd的模块:

核心模块

不可或缺
core.c
http_core.c
mod_so.c
prefork.c(Linux上默认是prefork.c)

认证相关模块

mod_authn_file.c
mod_authn_default.c
mod_authz_host.c
mod_authz_groupfile.c
mod_authz_user.c
mod_authz_default.c
mod_auth_basic.c

其它模块

mod_include.c
mod_filter.c
mod_log_config.c
mod_env.c
mod_setenvif.c
mod_version.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_actions.c
mod_userdir.c
mod_alias.c

我的Apache的常用模块

最简单的认证模块组合

[B]mod_auth_basic.c 或
[E]mod_auth_digest.c 加 (2.2.14版时,已经由实验模块转为扩展模块)
[B]mod_authn_file.c 加
[B]mod_authz_user.c
注意!basic加密方式密码是明文传送的,不安全,建议使用digest方式的认证。

保护认证而加载的模块

[B]mod_authn_default.c
[B]mod_authz_default.c
出于安全考虑,强烈建议加载!

最常用的访问控制模块

[B]mod_authz_host.c
提供基与主机名、IP地址以及请求特征的访问控制。

其它常用模块

[B]mod_log_config.c
[B]mod_alias.c
[B]mod_dir.c
[B]mod_mime.c
[B]mod_setenvif.c
[E]mod_rewrite.c
[E]mod_deflate.c
[E]mod_expires.c
[E]mod_headers.c

我常用的编译指令


1. ./configure --prefix=/opt/httpd-2.2.14 --with-mpm=prefork --enable-mods-shared=all LDFLAGS='-s'
2. ./configure --prefix=/opt/httpd-2.2.14 --with-mpm=prefork --enable-mods-shared=all --enable-cache --enable-mem-cache --enable-ssl --enable-file-cache --enable-disk-cache --enable-proxy --enable-proxy-http LDFLAGS='-s'
3. ./configure --prefix=/opt/httpd-2.2.14 --with-mpm=prefork --enable-mods-shared=all --enable-dir=static --enable-authz-host=static --enable-auth-basic=static --enable-authn_file=static --enable-authz_user=static --enable-authn-default=static --enable-authz-default=static --enable-setenvif=static --enable-alias=static --enable-log-config=static --enable-deflate=static --enable-rewrite=static --enable-mime=static --enable-expires=static --enable-cache=static --enable-mem-cache=static --enable-headers=shared --enable-disk-cache=shared --enable-file-cache=shared LDFLAGS='-s'

注意:因为Apache的./configure生成的Makefile不支持make install-strip,所以使用 LDFLAGES=’-s’来编译被strip的代码。

参考:
深入理解软件包的配置、编译与安装
Apache 2.2 手册-编译与安装
Apache 2.2 手册-动态共享对象支持
Apache 2.2 手册-各模块的简介描述
Apache 2.2 手册-描述模块的术语
Apache 2.2 手册-指令速查


25
四 09

使用基于Apache的 subversion/svn 管理代码

到版本1.5.6,subversion提供的svnserve搭建的SVN服务器,使用的仍然是名文密码文件。

为了使用加密的密码文件,需要借助于Apache,使用subversion的mod_dav_svnmod_authz_svn.so,使用基于Apache的认证机制。

假如使用发行版的Apache,那么一般发行版都带了相应的svn模块mod_dav_svn(CentOS)、libapache2-svn(Debian/Ubantu),直接安装即可。

下面主要介绍

源代码安装mod_dav_svn:

下载subversion的源代码:http://subversion.tigris.org/

与Apaceh相关的两个编译选择:

–with-apxs[=FILE]      Build shared Apache modules. FILE is the optional pathname to the Apache apxs tool; defaults to “apxs”.
–with-apache-libexecdir[=PATH] Install Apache modules to PATH instead of Apache’s configured modules directory; PATH “no” or –without-apache-libexecdir means install to LIBEXECDIR.

一般指定使用 –with-apxs=[apxs的绝对路径]来编译。默认会安装两个模块到Apache的modules目录内,分别mod_authz_svn.so、mod_dav_svn.so。

配置Apache:

1. 加载SVN依赖的模块

LoadModule dav_module             modules/mod_dav.so
LoadModule dav_fs_module         modules/mod_dav_fs.so
LoadModule dav_svn_module       modules/mod_dav_svn.so
LoadModule authz_svn_module    modules/mod_authz_svn.so

2. 建立svn仓库

svnadmin create /srv/_svndata/isystem
svnadmin create /srv/_svndata/iconfig

3. 配置apache对svn仓库的管理
# 注意,/svn目录不能在你的DocumentRoot目录下。
<Location /svn>
# 启用SVN
DAV svn
# 设置SVN仓库的路径
# SVNPath /srv/_svndata/isystem
# 假如在一个目录下有多个仓库,那么可以使用SVNParentPath来指定多仓库的根目录
# 也可以使用SVNPath来进行单独的设置
SVNParentPath /srv/_svndata

AuthType Basic
AuthName “Subversion Repository”
AuthUserFile /etc/apache2/dav_svn.passwd

# 设置SVN的权限控制
AuthzSVNAccessFile /etc/apache2/dav_svn.authz

<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>

</Location>

4. 添加SVN访问账号

htpasswd /etc/apache2/dav_svn.passwd  caoyuwei

编辑:/etc/apache2/dav_svn.authz

[groups]
admin = caoyuwei
[/]
@admin = rw
[isystem:/]
@admin= rw
[iconfig:/]
@admin=rw


25
三 09

使用ssl加密http协议

使用mod_ssl模块,使Apache可以使用SSL协议加密HTTP协议,用来保护HTTP会话。

最简洁的配置样例:

<VirtualHost _default_:443>
ServerName    www.bsdmap.com
DocumentRoot  /opt/httpd/htdocs
SSLEngine      on
SSLCertificateFile        /opt/httpd/conf/ssl/www.bsdmap.com.cert
SSLCertificateKeyFile   /opt/httpd/conf/ssl/www.bsdmap.com.key
</VirtualHost>

SSLEngine                 ON 启动SSL引擎
SSLCertificateFile       指定证书
SSLCertificateKeyFile  指定相关密钥

使用SSL加密分为正式场合,比如网上银行、支付宝等对应用安全要求较高的应用上;另一个为非正试场合,比如自己也可以配置一个SSL的web服务。区别在于,正式场合https应用使用的SSL证书是经过第三方数字签名的,而非正式应用,则是非正式机构或者是自己制作、签名的。

成生密钥对儿:

在创建证书之前,要有一个共公/私有密钥对儿。以www.bsdmap.com为例:

openssl genrsa -des3 -rand file1:file2:file3 -out www.bsdmap.com.key 1024

genrsa:告诉openssl要生成一个RSA的密钥对儿。

des3:表示私钥应该被一个”pass phrase”编码和保护。

rand:给OpenSSL提供任意的、随机的数据以确保生成的密钥是唯一的和不可预知的。这个开关在Windows里没有必要,在Windows下使用其他的方式获得随机数据。

out:保存位置。

1024:密钥位数。

当使用了-des3选项,成生了受“口令”保护的密钥对儿时,启动apache时需要输入口令才能启动。假如不想要每次都输入“口令”(不安全),可以使用不受“口令”保护的密钥,去掉-des3选项即可,也可以使用下面的命令转换一下:

openssl rsa -in www.bsdmap.com.key -out www.bsdmap.com.key.nopassword

显示密钥文件的信息:

openssl rsa -noout -text -in www.bsdmap.com.key

该命令也可用于查看ssh-key的信息,其实质是一样的。

 

创建一个证书签署请求(正式应用场合):

正式场合的应用,需要一个经证书颁发机构签署的证书,为此,我们先成生一个证书,提交由第三机构签名认证。使用命令:

openssl req -new -key www.bsdmap.com.key -out www.bsdmap.com.csr

需要填写一些地域、组织机构类的信息。需要特殊说明的是:在一个网站站书里,Common Name (eg, YOUR name)一栏标识完全限定的域名(FQDN),假如此处与以后使用证书的站点名不同,浏览器将发布一个错误,无法访问。

完成之后,证书就存储在www.bsdmap.com.csr里。下面的命令可以显示这个证书的信息:

openssl req -noout -text -in www.bsdmap.com.csr

然后,可以所这个证书签署请求提交给一个CA(证书签署机构)处理。

Verisign和Thawte是两家可以选择的CA:

https://digitalid.verisign.com/server/apacheNotice.htm

https://www.thawte.com/ssl-digital-certificates/buy-ssl-certificates/

创建自签署证书(非正式应用场合):

非正式的应用,可以自己签署自己的证书:

openssl x509 -req -days 365 -in www.bsdmap.com.csr -signkey www.bsdmap.com.key -out www.bsdmap.com.cert

并且,必须使用:chmod 400 www.bsdmap.com.key 来保护密钥文件。

另一个问题:

貌似SSL不能与基于主机名的虚拟主机一同工作。

有一个协议把一个已有的HTTP连接升级到TLS,但是并不是所有的浏览器支持此项功能(RFC 2817)。

参考:
SSL原理解析

http://www.yesky.com/ServerIndex/77125243130347520/20040426/1791592.shtml

SSL原理解密

http://fanqiang.chinaunix.net/a6/b8/20010608/121000441.html


1
三 09

服务器时间与HTTPD关系

发现服务器时间与HTTP应用有关。

当服务器时间慢于标准时间时(也可能是服务器时间是Last-Modified时间的过去时间时),会导致客户端缓存失效,从而产生不必要的流量。


14
十二 07

Apache的几个重要模块

mod_expires

说 明: 允许通过配置文件控制HTTP的”Expires”和”Cache-Control”头内容
状 态:扩展(E)
模块名:expires_module
源文件:mod_expires.c

概述

这个模块控制服务器应答时的Expires头内容和Cache-Control头的max-age指令。有效期(expiration date)可以设置为相对于源文件的最后修改时刻或者客户端的访问时刻。

这些HTTP头向客户端表明了文档的有效性和持久性。如果有缓存,文档就可以从缓存(除已经过期)而不是从服务器读取。接着,客户端考察缓存中的副本,看看是否过期或者失效,以决定是否必须从服务器获得更新。

要修改Cache-Control头中max-age(参见RFC 2616 section 14.9)项之外的内容,你还可以使用Header指令。