Apache httpd 是 Apache 软件基金会的一个开源的 Web 服务器,可以在大多数计算机操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一。本文主要介绍其基本概念及安装,文中所使用到的软件版本:httpd 2.4.55、apr 1.7.2、apr-util 1.6.3、pcre 8.43、CentOS 7.9.2009。
Apache httpd 起初由伊利诺伊大学香槟分校的国家超级电脑应用中心(NCSA)开发,经过多次修改,成为世界上最流行的 Web 服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache 的特点是简单、速度快、性能稳定,并可做代理服务器来使用。
本来它只用于小型或试验 Internet 网络,后来逐步扩充到各种 Unix 系统中,尤其对 Linux 的支持相当完美。Apache 有多种特性,可以支持SSL技术,支持多个虚拟主机。Apache 是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个 Apache Web 站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。世界上很多著名的网站如Amazon、Yahoo!、W3 Consortium、Financial Times 等都是 Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
Apache httpd 的诞生极富有戏剧性。当 NCSA WWW 服务器项目停顿后,那些使用 NCSA WWW 服务器的人们开始交换他们用于该服务器的补丁程序,他们也很快认识到成立管理这些补丁程序的组织是必要的。就这样,诞生了Apache Group,后来这个团体在 NCSA 的基础上创建了 Apache httpd。
Apache httpd 被设计为功能强大且灵活的 Web 服务器,可以在各种不同环境中的多种平台上工作。不同的平台和环境通常需要不同的功能,或者可能具有不同的方式来最有效地实现相同的功能。Apache httpd 通过其模块化设计一直适应各种环境。通过这种设计,网站管理员可以通过选择在编译时或运行时加载哪些模块来选择服务器中将包含哪些功能。
Apache httpd 2.0 将此模块化设计扩展到 Web 服务器的最基本功能。该服务器随附了多种选择的多处理模块(MPM),这些模块负责绑定到计算机上的网络端口,接受请求并调度子代来处理请求。
将模块化设计扩展到服务器的这一级别有两个重要的好处:
下表列出了各种操作系统的默认 MPM。如果您在编译时没有其他选择,则将选择该 MPM。
| 网络软件 | mpm_netware |
| OS / 2 | mpmt_os2 |
| Unix 系统 | prefork,worker或 event,取决于平台功能 |
| 视窗 | mpm_winnt |
在这里,“Unix” 用于表示类似 Unix 的操作系统,例如 Linux,BSD,Solaris,Mac OS X 等。
对于 Unix,关于安装哪个 MPM 的决定基于两个问题:
1、系统是否支持线程?
2、系统是否支持线程安全轮询(特别是 kqueue 和 epoll 函数)?
如果两个问题的答案均为“是”,则默认 MPM 为 event。
如果#1的答案为“是”,而#2的答案为“否”,则默认值为 worker。
如果两个问题的答案均为“否”,则默认 MPM 为 prefork。
实际上,这意味着默认值几乎始终为 event,因为所有现代操作系统都支持这两个功能。
编译的时候可以通过 --with-mpm 参数指定 mpm;安装完成后可通过 bin/httpd -V |grep -i "Server MPM" 命令查看当前使用的 mpm。
Aapache httpd 在启动之初,就预先派生一些子进程,然后等待请求过来;每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有模块,线程安全性高。
缺点:不适合处理高并发请求;一个进程相对占用更多的系统资源,消耗更多的内存。
使用多进程和多线程的混合模式,也预先派生几个子进程(数量远少于 prefork 派生的);每个子进程创建多个线程,包括一个监听线程;每个请求会被分配一个线程来服务。
优点:占据更少的内存,适合高并发的场景。
缺点:必须考虑线程安全的问题,使用 keep-alive 长连接的时候,某个线程会被一直占用,即使没有收到请求,需要等待到超时才会释放;一个线程出现问题也会导致同一进程下的线程出现问题。
类似于 worker 的工作模式,最大区别是它解决了 keep-alive 场景下,长期被占用的线程的资源的浪费问题;event 模式下,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实的请求过来的时候,将请求传递给服务线程,执行完毕又允许它释放。
官网(http://www.pcre.org/)下载 pcre,解压并安装:
unzip pcre-8.43.zip
cd pcre-8.43
./configure --prefix=/fop/soft/pcre-8.43
make
make install
安装完成后需把 pcre 的 bin 目录添加到 PATH 的环境变量中:
PATH=$PATH:/home/mongo/soft/pcre-8.43/bin
export PATH
官网(https://apr.apache.org/)下载 APR 和 APR-Util,然后解压到 httpd 源码目录的 srclib 目录下,解压后的目录需要把版本号去除:

APR 和 APR-Util 只需把源码放到指定目录,不需要单独编译及安装。
如果不需要配置 https,则该步不需要;OpenSSL 的安装可参考:OpenSSL 介绍(1)--概念及安装。这里安装在 /home/mongo/soft/openssl-1.1.1s 目录下。
官网(https://httpd.apache.org/download.cgi)下载 httpd,解压后参考 2.1.2 的方法把 APR 和 APR-Util 的源码放到 srclib 目录下;然后编译安装:
cd httpd-2.4.55
./configure --prefix=/home/mongo/soft/httpd-2.4.55 --with-included-apr --enable-ssl --with-ssl=/home/mongo/soft/openssl-1.1.1s
make
make install
安装完成后需把 OpenSSL 的 libssl 和 libcrypto 包拷贝到 httpd 安装目录的 lib 下:
cp /home/mongo/soft/openssl-1.1.1s/lib/libssl.so.1.1 /home/mongo/soft/httpd-2.4.55/lib/
cp /home/mongo/soft/openssl-1.1.1s/lib/libcrypto.so.1.1 /home/mongo/soft/httpd-2.4.55/lib/
编辑 conf/httpd.conf 文件:
Listen 8080
ServerName 10.49.196.33:8080
执行命令:
bin/apachectl
启动后访问 8080 端口:

bin/apachectl -k stop #停止
bin/apachectl -k restart #重启
make 时可能会报:
fatal error: expat.h: No such file or directory
这是由于系统中缺少 expat-devel,安装下即可:
yum install expat-devel
configure 时可能会报:
configure: error: Did not find working script at pcre-config
找不到 pcre-config 命令,需把 pcre 的 bin 目录添加到 PATH 的环境变量中:
PATH=$PATH:$PCRE_HOME/bin
export PATH
启动 httpd 时可能会报:
httpd: Syntax error on line 133 of /home/mongo/soft/httpd-2.4.55/conf/httpd.conf: Cannot load modules/mod_ssl.so into server: libssl.so.1.1: cannot open shared object file: No such file or directory
OpenSSL 相关的包找不到,需把 OpenSSL 的 libssl 和 libcrypto 包拷贝到 httpd 安装目录的 lib 下:
cp $OPNESSL_HOME/lib/libssl.so.1.1 $HTTPD_HOME/lib/
cp $OPNESSL_HOME/lib/libcrypto.so.1.1 $HTTPD_HOME/lib/
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece