当前位置: 首页 > 编程日记 > 正文

服务器架设笔记——编译Apache及其插件

之前一直从事Windows上的客户端软件开发,经常会处理和服务器交互相关的业务。由于希望成为一个全栈式的工程师,我对Linux上服务器相关的开发也越来越感兴趣。趁着年底自由的时间比较多,我可以对这块做些技术研究。虽然这些知识很基础也很老,但是对我这样的新人来说还是挺有意思的。

初期目标是可以让虚拟机中的服务架设成功,且实体机可以访问。服务器我选择了相对熟悉点的Ubuntu——Ubuntu Server 14.04.1 LTS 32位版本(http://releases.ubuntu.com/14.04.1/ubuntu-14.04.1-desktop-i386.iso.torrent)。而服务我则选用大名鼎鼎的Apache。(转载请指明出于breaksoftware的csdn博客)

简易安装Apache

我先在虚拟机的ubuntu上安装软件源上的Apache。为了简便,我直接使用了tasksel命令

打开软件配置界面

然后使用空格选中LAMP server。使用回车确认选择,这样将自动安装相关软件——包括Apache。待安装完毕,使用service httpd start方式启动http服务。这样我便可以在实体机上使用ip访问该服务了。

但是这儿有个问题,我们始终访问的是一个静态页面。而现实中http服务器要实现更多更复杂的功能。比如我们日常使用的日志服务,一般需要解析URL,并将一些参数做相关运算后放入数据库中。显然这样的需求是一个静态页面无法满足的。

编译Apache

作为一款著名的服务软件,能得到如此的市场占有率,必然有其很多优点。其中一个优点肯定是其构架是良好的——可以想象,其构架也必然是“对扩展开放”的。否则增加一点需求,就得去阅读和修改Apache的源码,无疑将大大提高使用者的难度,便不会有如此多的用户。那我们我们希望可以处理url解析这样的简单需求,肯定也是通过插件这类的方式实现的。然而,我们编译一个插件,一般是需要借助一些库——软件自带的库、软件关联的库……那么为了不遗漏这样那样的库,我们就需要构建一个环境——可以完全编译Apache源码的环境——连Apache都可以编译,那么其最基础功能的插件肯定也可以编译。

从http://httpd.apache.org/download.cgi下载Apache源码。目前使用的是2.4.12这个版本。获取完该压缩包,我们将它解压到/usr/src目录下

wget http://mirrors.cnnic.cn/apache//httpd/httpd-2.4.12.tar.gz
tar  xvfz httpd-2.4.12.tar.gz -C /usr/src

我们切入解压目录,执行

./configure

我们发现,如果环境尚不完善,将会报缺少APR和APR-Util和PCRE库。

ARP库

官网:http://apr.apache.org/

wget http://mirror.bit.edu.cn/apache//apr/apr-1.5.1.tar.gz
tar xvfz apr-1.5.1.tar.gz -C /usr/src
./configure --prefix=/usr/local/apr
make
make install

ARP-Util库

官网:http://apr.apache.org/

wget http://mirror.bit.edu.cn/apache//apr/apr-util-1.5.4.tar.gz
tar xvfz apr-util-1.5.4.tar.gz -C /usr/src
mv apr-util-1.5.4 /usr/src/
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make
make install

PCRE库

官网:http://pcre.org/

wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz
tar xvfz pcre-8.36.tar.gz -C /usr/src
./configure --prefix=/usr/local/pcre
make
make install

openssl库

官网:http://www.openssl.org/source/

因为https等模块会用到加密等方法,所以我们要拉取openssl。Ubuntu系统中好像已经带了openssl的库文件。但是我们在编写插件时,会使用到它的头文件,所以我们也把它拉取和编译下。

wget http://www.openssl.org/source/openssl-1.0.2.tar.gz
tar xvfz openssl-1.0.2.tar.gz
./config --prefix=/usr/local/openssl -fPIC no-gost no-shared no-zlib 
make depend
make install

openssl库的编译有些特别,因为如果不这么做,之后编译apache mod_ssl模块是会报“libssl.a(s3_srvr.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC”错误。

这些库准备好后,我们就再到Apache的解压目录下,执行./configure就行了(可能需要指定部分库的路径)。./configure还有很多参数可以供选择,具体我不在这儿说明了。因为我们前期目标是搭建成功——能用就行。


        如果我们之前已经安装了源中的Apache,那就要卸载掉它——apt-get remove apache2。

经过漫长的编译,Apache终于编译完了。但是事情总不能一帆风顺,我运行可执行文件httpd时,会报libpcre.so.1(64位系统好像是报libpcre.so.0)找不到(使用lld httpd查看文件关联)。还好这种找不到文件的问题很好解决:

启动Apache:

使用ifconfig查看IP,我们在宿主电脑的浏览器里输入IP。我们将得到如下结果:


        至此,我们编译的Apache跑起来了。编译插件的环境也准备就绪。

编译、添加插件

在Apache编译完的./bin目录下,有个axps文件。它的全称是:APache eXtenSion tool。顾名思义,它是帮我们生成扩展插件的辅助工具(为了方便使用它,我们要将其所在目录放到环境变量中vim /etc/environment; source /etc/environment)。它的使用非常简单,比如我们要建立一个插件叫hello world。则我们使用

apxs -g -n hello_world


        其中-g是指示apxs生成一个模板项目,-n是用于指定项目名。这两个参数一般一块使用。

然后我们就可以编译该模块,并将模块注册到Apache的配置中。

apxs -c -i -a mod_hello_world.c

编译成功将出现


        -c指令指示编译工程;-i指令指示将编译出来的模块拷贝到Apache的modules目录下(mod_hello_world.so)。-a指令指示修改Apache配置文件httpd.conf,让模块加载流程去加载这个so。

一般情况下,-c是单独使用的。-i -a是结合使用的,且它们可以省略,因为它只是拷贝文件和修改配置,而我们在开发的时候可能不需要拷贝so到Apache的modules目录下,而只用修改httpd.conf以指示其so的路径。比如:我在conf中新增如下一行

我们回过来再看看,模块的逻辑——mod_hello_world.c的内容

现在我们并不对该文件进行解读,而是粗略发现如下几点:

  • 我们的请求将和hello_world字段有关。
  • 我们要使用一套特定的api去操作内部逻辑——如ap_rpus这个函数。

在该文件注释段,告诉我们需要手工修改httpd.conf文件,新增如下


        这段配置什么作用,我们这节也不去深究。

一切完毕后,我们重启Apache——./httpd -k restart。

在实体机访问

我们如愿干涉了服务器的返回结果,完成了我们初步的目标。之后的章节中,我们将详细研究如果编写更加复杂的插件。

参考信息:

http://wiki.ubuntu.org.cn/Apache

http://httpd.apache.org/docs/2.4/install.html

http://httpd.apache.org/docs/2.4/programs/configure.html

http://httpd.apache.org/docs/2.4/en/programs/apxs.html

相关文章:

Silverlight 2中多语言支持实现(上)

引言 最近项目要在Silverlight 2应用程序中实现本地化,原以为这个过程非常简单,却没想到实现的时候一波三折,好在结果还算不错。需求是这样的,用户第一次访问的时候,默认为英文,当用户选择一种显示语言后&a…

解析大型.NET ERP系统 多国语言实现

实现多国语言有许多种实现方案,无外乎是一种字符串替换技术,将界面控件的文本标签替换成相应语言的文字。.NET Windows Forms实现多国语言的方法有以下几种: 1 .NET的方案,使用资源文件 分别做三个语言的资源文件,比如…

服务器架设笔记——Apache模块开发基础知识

通过上节的例子,我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API。虽然Apache的官网上有对这些API的详细介绍,但是空拿着一些零散的说明书,是很难快速建立起一套可以运行的系统。(转载请指明出于breaksoftware的csd…

解密Elasticsearch技术,腾讯开源的万亿级分布式搜索分析引擎

「免费学习 60 节公开课:投票页面,点击讲师头像」作者 | johngqjiang,腾讯 TEG 云架构平台部研发工程师来源 | 腾讯技术工程(ID:Tencent_TEG)【导读】Elasticsearch(ES)作为开源首选…

Centos5上firefox的升级

Centos5上firefox的升级默认Centos5上firefox的版本是1.5当我们使用yum update firefox提示到的版本还是1.5 可是我们在使用1.5版本的firefox可能会有一些问题,比如打不开QQ空间接下来我们就将系统的firefox从rpm包的1.5版本升级到tar包的3.0首先删除1.5版本的fire…

cheat engine lua

function CEButton1Click(sender) local x getProperty(CETrainer.CEEdit1,"Text")--这句很重要,获取文本框的值 --writeInteger(0x42c0c0,readInteger(0x42c0c0)x)--设置0X42C0C0地址的值 setProperty(CETrainer.CEEdit2,"Text","0001000")--设…

服务器架设笔记——使用Apache插件解析简单请求

一般来说,对于一个请求,服务器都会对其进行解析,以确定请求的合法性以及行进的路径。于是本节将讲解如何获取请求的数据。(转载请指明出于breaksoftware的csdn博客) 我们使用《服务器架设笔记——编译Apache及其插件》…

如何用Python快速抓取Google搜索?

「免费学习 60 节公开课:投票页面,点击讲师头像」作者 | linksc译者 | 弯月,编辑 | 郭芮来源 | CSDN(ID:CSDNnews)自从2011年 Google Web Search API 被弃用以来,我一直在寻找其他的方法来抓取G…

利用歌词插件 让WMP活起来

如果利用起这个歌词插件的话 是不是可以减少下载那么多播放器和每次更新的烦恼呢?因为WMP是系统自带的.可以下载的插件名称:Wa3 Music Engine 或者乐辞的歌词秀插件转载于:https://blog.51cto.com/david25/84211

Linux性能研究(总)

http://www.vpsee.com/2009/11/linux-system-performance-monitoring-introduction/ http://www.jb51.net/LINUXjishu/34607.html 公司有个测试服务器,上面跑了几个应用和一个DB。 DB被这个几个应用使用。 最近老是被挂掉。 CPU 使用率100%。 搞到最后大家都不能用。…

万字干货:如何从零开始构建企业级推荐系统?

「免费学习 60 节公开课:投票页面,点击讲师头像」作者丨gongyouliu编辑丨zandy来源 | 大数据与人工智能(ID: ai-big-data)最近几个月有很多人咨询作者怎么从零开始搭建工业级推荐系统,有做音视频的、有做新闻资讯的、有…

Mocha BSM基础架构管理——灵活的网络拓扑展现

业务需求与挑战企业的网络拓扑结构与设备时常变化,人工往往难以维护网络拓扑。尤其对于上千台设备的大型网络来说情况更为复杂。当用户网络设备大量增加后,网络结构异常复杂,用户的网络拓扑很难在一个屏幕上展现或者很难找到要查阅的网络拓扑…

服务器架设笔记——打通MySQL和Apache

在《服务器架设笔记——使用Apache插件解析简单请求》一文中,我们已经可以获取请求内容。这只是万里长征的第一步。因为一般来说,客户端向服务器发起请求,服务器会有着复杂的业务处理逻辑。举个例子,大部分客户端软件都有日志模块…

【Maven】maven的安装配置和ecplise结合

2. Maven的安装和配置 2.1. 安装 进入Maven官网的下载页面:http://maven.apache.org/download.cgi,如下图所示: 选择当前最新版本:“apache-maven-3.0.4-bin.zip”,下载到本地,解压缩到本地磁盘D:下。 2…

2020年趋势一览:AutoML、联邦学习、云寡头时代的终结

作者 | Roberto Sannazzaro,Ben Longstaff译者 | 夕颜出品 | AI科技大本营(ID:rgznai100) 【导读】在 2020 年来临之际,新年前夕往往是人们回顾过去一年并展望来年的好时机。本文将深入探讨了关于 AI 的技术和非技术方面的趋势&am…

使用C++实现一套简单的状态机模型——实例

一般来说,“状态机”是一种表达状态转换变换逻辑的方法。曾经有人和我讨论过为什么不直接用ifelse,而要使用“状态机”去实现一些逻辑,认为使用“状态机”是一种炫技的表现。然而对于大型复杂逻辑的变化和跳转,使用ifelse将带来代…

net通过oledb 和ibm自带连接方式,连接db2数据库出错

第一种通过ibm方式连接 DataSet ds new DataSet(); OleDbConnection cn new OleDbConnection( "ProviderIBMDA400.1;Data Source192.168.21.10;User IDb4dd;" "Passwordb4dd;Default CollectionQIBMPP"); …

SAP QM 'QM System' 有什么控制作用?

SAP QM ‘QM System’ 有什么控制作用? QM system可以控制如下二点: 1>如果我方与Vendor的质量标准匹配,且相互认证,那么我方收货后不用检验,系统不产生检验批;如果我方与vendor的质量标准匹配&#x…

使用C++实现一套简单的状态机模型——原理解析

在上一文中,我们介绍了该状态机模型的使用方法。通过例子,我们发现可以使用该模型快速构建满足基本业务需求的状态机。本文我们将解析该模型的基础代码,以便大家可以根据自己状态机特点进行修改。(转载请指明出于breaksoftware的c…

干货:NIST评测(SRE19)获胜团队声纹识别技术分析 | CSDN博文精选

作者 | xjdier来源 | CSDN博文精选(*点击阅读原文,查看作者更多精彩文章)近日,NIST说话人识别技术评测 (Speaker Recognition Evaluation,SRE)正式公布榜单,芯片初创公司清微智能和清华大学等机构组成的联队…

网络系统传输负载测试

网络系统传输负载测试 随着企业各种信息系统相继投入使用,生产、管理信息逐步增加,企业网络规模迅速扩大,信息城域网承受着空前的压力,网络带宽严重不足,网络系统传输丢包、设备死机情况频频发生。我们需要对网络状况做…

android圆形旋转菜单,而对于移动转换功能支持

LZ该公司最近接手一个项目,需要写一个圆形旋转菜单,和菜单之间的移动换位支持,我本来以为这样的demo如若互联网是非常。想想你妈妈也帮不了我,空旋转,但它不能改变位置,所以LZ我们只能靠自己摸索。 最后LZ参…

微信9年:张小龙指明方向,微信AI全面开放NLP能力

作者 | 夕颜责编 | 王金许出品 | AI科技大本营(ID:rgznai100)一年一度的微信公开课 Pro 在广州保利世贸博览馆如期举行。一大早,同在博览馆举办的广州年货促展会参会者,夹杂着参加腾讯公开课的与会者,让这里变得人流攒…

实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现

在《使用WinHttp接口实现HTTP协议Get、Post和文件上传功能》一文中,我已经比较详细地讲解了如何使用WinHttp接口实现各种协议。在最近的代码梳理中,我觉得Post和文件上传模块可以得到简化,于是几乎重写了这两个功能的代码。因为Get、Post和文…

第一篇文章,做个纪念

第一篇文章,做个纪念,这个blog好吗?拭目以待!转载于:https://blog.51cto.com/197536/88241

Maven工程引入jar包(转)

Maven项目引入jar包的方法,希望能帮助有需要的朋友们 法一.手动导入:项目右键—>Build Path—>Configure Build Path—>选中Libraries—>点击Add External Jars—>选中已事先下好的Jar包导入即可。 法二.通过pom.xml文件的Dependencies标…

实现HTTP协议Get、Post和文件上传功能——使用libcurl接口实现

之前我们已经详细介绍了WinHttp接口如何实现Http的相关功能。本文我将主要讲解如何使用libcurl库去实现相关功能。(转载请指明出于breaksoftware的csdn博客) libcurl在http://curl.haxx.se/libcurl/有详细的介绍,有兴趣的朋友可以去读下。本文…

32岁程序员,补偿N+2:“谢谢裁我,让我翻倍!” 网友:榜样!

2019年的冬天,“冷”的有些频繁。12月19日,《马蜂窝被曝裁员40% UGC模式变现难?》爆火,据悉马蜂窝将裁员40%,交易中心成了“重灾区”,赔偿N2,留下的除搜索推荐、内容中心等核心部门外&#xff0…

山有木兮木有枝,心悦君兮君不知

《越人歌》今夕何夕兮,搴舟中流。 今日何日兮,得与王子同舟 蒙羞被好兮,不訾诟耻 心几烦而不绝兮,得知王子 山有木兮木有枝,心悦君兮君不知。本是《夜宴》中的,"山有木兮木有枝,心悦君兮君…

浅析电商、社区、游戏常用的 MySQL 架构

一般、或者必须是这样、MySQL 架构一定要结合业务来分析、设计、优化 所以不管是那种架构、根据业务要求组合成符合需求的即是最好的、不能泛泛而谈 同时、也必须注意数据的安全(如ipsec,ssh,vpn传输) 常见的架构都是进行业务切…