之前一直从事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

服务器架设笔记——编译Apache及其插件相关推荐

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

    一般来说,对于一个请求,服务器都会对其进行解析,以确定请求的合法性以及行进的路径.于是本节将讲解如何获取请求的数据.(转载请指明出于breaksoftware的csdn博客) 我们使用<服务器架 ...

  2. RHCE课程-RH253Linux服务器架设笔记五-APACHE服务器配置(4)

    JSP(Java Server Pages)是由Sun Microsystems公司倡导.许多公司一起参与建立的一种基于Java技术的动态网页技术标准. Apache只是一个Web服务器,不能运行JS ...

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

    在<服务器架设笔记--使用Apache插件解析简单请求>一文中,我们已经可以获取请求内容.这只是万里长征的第一步.因为一般来说,客户端向服务器发起请求,服务器会有着复杂的业务处理逻辑.举个 ...

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

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

  5. 服务器架设笔记——多模块和全局数据

    随着项目工程的发展,多模块设计和性能优化是在所难免的.本文我将基于一些现实中可能遇到的需求,讲解如何在Apache的Httpd插件体系中实现这些功能.(转载请指明出于breaksoftware的csd ...

  6. CentOS4.4下邮件服务器架设笔记之windows AD整合功能实现

    1.通过"CentOS4.4下邮件服务器架设笔记之邮件网关功能实现"这一篇文章,我们已经实现了邮件网关功能,但是对于microsoft ad 平台下exchange邮件系统用户来说 ...

  7. 服务器架设笔记——httpd插件支持mysql字符集选择

    mysql数据库默认的字符集是latin1.默认情况下,我们编译的httpd插件是可以正常读取该类型的数据库,并且不会出现乱码.但是,如果我们的数据库变成其他格式,比如UTF8,那么默认读取出来的数据 ...

  8. 服务器架设笔记——搭建用户注册和验证功能

    之前介绍的Apache Httpd相关内容,都是些零散的知识点.而实际运用中,我们要根据不同的业务,将这些知识点连接起来以形成各种组合,来满足我们的需求.(转载请指明出于breaksoftware的c ...

  9. FreeBSD6.0Release+Squid+Socks5服务器架设笔记

    架设此服务器,使客户端通过设置代理服务器的squid来浏览网页,通过代理服务器的socks5来使用QQ.MSN.证券等服务,下面简单介绍服务器的架设过程. 一.安装FreeBSD6.0Release ...

最新文章

  1. Java NIO与IO的区别和比较
  2. 一文帮你了解小型直流有刷电机内部结构
  3. 170多个Ionic Framework学习资源(转载)
  4. JAVA编码规约(阿里)
  5. malloc 结构体_算法与数据结构——结构体变量
  6. 数据链路层(学习笔记)
  7. ECSHOP设置默认配送方式和默认支付方式
  8. 中文乱码java_JAVA中文乱码问题应该怎么解决?
  9. 文章页网址有.html,Phpcms V9文章内容页自定义HTML网址技巧
  10. 如果我建一个外卖平台,不收取商家佣金和骑手提点,会不会成功?
  11. 好用的MARKDOWN编辑器一览
  12. Hadoop的详细配置(持续更新)
  13. Cocos BabeLua配置
  14. 跟着太白老师学python day10 函数嵌套, global , nonlocal
  15. python中save是什么意思_Python中的numpy.save()和joblib.dump()有什么区别?
  16. vue中后台管理登录后的token管理
  17. Flash页面的在线编辑
  18. python的scrapy爬虫模块间进行传参_小猪的Python学习之旅 —— 4.Scrapy爬虫框架初体验...
  19. (附源码)计算机毕业设计ssm个人人际关系管理软件
  20. win10如何设置有线和无线同时上内网和外网?

热门文章

  1. php 前端控制器,前端控制器模式
  2. 移动应用开发的六大编程语言
  3. 神经网络基础:(3)神经网络整体架构
  4. 一次失败的Pytorch模型量化尝试
  5. 【神经网络】(19) ConvNeXt 代码复现,网络解析,附Tensorflow完整代码
  6. 【机器学习入门】(8) 线性回归算法:正则化、岭回归、实例应用(房价预测)附python完整代码和数据集
  7. LeetCode刷题记录5——441. Arranging Coins(easy)
  8. 剑指offer:面试题38. 字符串的排列
  9. awk2.0 — awk分隔符
  10. Callgrind--函数调用分析工具以及可视化方法