阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Linux下Apache安装及实例

468次阅读
没有评论

共计 5962 个字符,预计需要花费 15 分钟才能阅读完成。

Apache 模块开发

一、卸载原有 Apache
在源码安装 apache 之前,我们要先卸载系统中,已经通过 rpm 包安装的 apache。如下:
#rpm -qa |grep httpd
#rpm -e –nodeps httpd-2.2.15-29.el6.CentOS.x86_64
#rpm -e –nodeps httpd-tools-2.2.15-29.el6.centos.x86_64
#rpm -qa |grep httpd

二、安装
Apache HTTP 服务器是一个模块化的软件,使管理者可以选择核心中包含的模块以裁剪功能。可以在编译时选择被静态包含进 httpd 二进制映象的模块,也可以编译成独立于主 httpd 二进制映象的动态共享对象 DSO,DSO 模块可以在编译服务器之后编译,也可以用 Apache 扩展工具(apxs) 编译并增加。

1. 官网下载源码包
#wget http://apache.fayea.com/httpd/httpd-2.4.25.tar.gz
2.yum 安装 apache
#yum install httpd
#yum install httpd-devel
2. 随系统自启动
#chkconfig httpd on
3. 开启 apache
#service httpd start
4. 检查是否安装成功
#rpm -qa|grep httpd

PS: 在 CentOS 里 Apache 的默认文档路径的位置是在 /var/www/html,配置文件的路径是 /etc/httpd/conf/httpd.conf。其他的配置存储在 /etc/httpd/conf.d/ 文件夹里。

三、apache 中 apxs 扩展工具使用
apxs 是一个为 Apache 超文本传输协议(HTTP) 服务器编译安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用 mod_so 中的 LoadModule 指令 在运行时刻加载到 Apache 服务器中。
因此,要使用这个扩展机制,你的平台必须支持 DSO(动态模块)特性,而且 Apache 的 httpd 必须内建了 mod_so 模块。apxs 工具能自动探测是否具备这样的条件,你也可以自己用这个命令手动探测
  #httpd -l
core.c
mod_so.c
http_core.c

注:mod_so 包括 LoadFile 指令和 LoadModule 指令

概要:
apxs -g [-S name=value] -n modname
apxs -q [-S name=value] query …
apxs -c [-S name=value] [-o dsofile] [-I incdir] [-D name=value] [-L libdir] [-l libname] [-Wc,compiler-flags] [-Wl,linker-flags] files ..
apxs -i [-S name=value] [-n modname] [-a] [-A] dso-file …
apxs -e [-S name=value] [-n modname] [-a] [-A] dso-file …

选项
一般选项
-n modname
    它明确设置了 -i(install) 和 -g (template generation)选项的模块名称。对 - g 选项,它是必须的;对 - i 选项,apxs 工具会按文件名判断至少是推测出这个模块名称。

查询选项
-q
    查询某种 apxs 设置的信息。query 参数可以是下列一个或多个字串:CC, CFLAGS, CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, LDFLAGS_SHLIB, LIBEXECDIR, LIBS_SHLIB, SBINDIR, SYSCONFDIR, TARGET.
    这个参数用于手动查询某些设置。比如,要手动处理 Apache 的 C 头文件,可以在 Makefile 中使用
    INC=-I`apxs -q INCLUDEDIR`

配置选项
-S name=value
    此选项可以改变 apxs 的上述设置。

模板生成选项
-g
    此选项生成一个名为 name 的子目录(见选项 -n) 和其中的两个文件:一个是名为 mod_name.c 的样板模块源程序,可以用作建立你自己的模块的模板,或是学习使用 apxs 机制的良好开端;另一个则是对应的 Makefile,用于编译和安装此模块。

DSO 编译选项
-c
    此选项表示需要执行编译操作。它首先会编译 C 源程序(.c)files 为对应的目标代码文件(.o),然后,连接这些目标代码和 files 中其余的目标代码文件(.o and .a),以生成动态共享对象 dsofile。如果没有指定 - o 选项,则此输出文件名由 files 中的第一个文件名推测得到,所以,缺省时,它一般会是 mod_name.so.
-o dsofile
    明确指定所建立的动态共享对象的文件名。如果没有明确指定,而且也不能从 files 文件列表中推测得到,则其文件名将为 mod_unknown.so。
-D name=value
    此选项定义直接提交给编译器的,以增加用于编译的变量。
-I incdir
    此选项定义直接提交给编译器的变量,以增加用于编译的你自己的头文件目录。
-L libdir
    此选项定义直接提交给编译器的变量,以增加用于编译的你自己的库文件目录。
-l libname
    此选项定义直接提交给编译器的变量,以增加用于编译的你自己的库文件。
-Wc,compiler-flags
    此选项用于附加编译参数 compiler-flags 到编译命令中,以增加编译器特有的参数。
-Wl,linker-flags
    此选项用于附加连接参数 linker-flags 到连接命令中,以增加连接器特有的参数。

DSO 的安装和配置选项
-i
    此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的 modules 目录中。
-a
    此选项自动在 httpd.conf 文件中增加一个 LoadModule 行,以激活此模块,或者,如果此行已经存在,则启用之。
-A
    与 - a 选项类似,但是它增加的 LoadModule 指令由一个井号前缀(#),即,此模块已经准备就绪,但尚处于禁用状态。
-e
    此选项表示需要执行编辑操作,它可以与 - a 和 - A 选项配合使用,与 - i 操作类似,修改 Apache 的 httpd.conf 配置文件,但是并不安装此模块。

 

四、具体开发步骤:
1. 利用 Apache 自带都 apxs 建立 hello 模块:
#apxs -g -n hello
这样就会在当前目录下新建一个 hello 模块的文件目录,可以看到里面有:Makefile mod_hello.c modules.mk 这样的文件。
Creating [DIR]  hello
Creating [FILE] hello/Makefile
Creating [FILE] hello/modules.mk
Creating [FILE] hello/mod_hello.c
Creating [FILE] hello/.deps

2. 预览下 mod_hello.c,可以看到里面 apxs 自动帮你生成一堆代码了,我们需要的只是修改里面的代码部分,先简单都介绍下里面的函数说明。
include 部分就是引入了一些必要都头文件
hello_handler 这个就是 hello 模块都主体部分,所有的显示、处理请求什么的都在这里。
hello_register_hooks,hello_module 这俩个是需要导出的函数所必须的,先可以不管他们,按照生成的不动即可。

3. 修改 hello_handler 函数,里面可以看到 request_rec *r,r 有很多函数和变量,具体要参见文档了。里面的 ap_rputs 是输出,可以简单的理解为把字符串输出到 r。
static int hello_handler(request_rec *r)
{
    if (strcmp(r->handler, “hello”)) {// 判断 apache 配置文件里 handler 是否等于 hello,不是就跳过
        return DECLINED;
  }
  r->content_type = “text/html”; // 设置 content-type
  if (!r->header_only)
      ap_rputs(“The sample page from mod_hello.c\n”, r); // 输出一段文字
  return OK; // 返回 200 OK 状态
}
增加 #include “mysq.h”,查询需要用到这个头文件。

4. 编译模块
#apxs -c -a -i -L/usr/lib64/mysql/ -lmysqlclient mod_hello.c
可以看到一堆编译指令,加上 - I 和 - l 是编译 mysql 必须的,编译完会自动在 httpd.conf 加上 LoadModule hello_module modules/mod_hello.so

5. 修改 httpd.conf

LoadModule hello_module modules/mod_hello.so    #编译完会自动在 httpd.conf 加上
<Location /hello>    #中间有空格
    SetHandler hello
</Location >

6. 重启 apache,访问 http://localhost/hello,看是否成功。

数据库 systeminfo

数据库:test
表:systeminfo

CREATE TABLE `systeminfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ip_info` varchar(50) NOT NULL,   
  `serv_info` varchar(50) NOT NULL,   
  `cpu_info` varchar(50) NOT NULL,   
  `disk_info` varchar(50) NOT NULL,   
  `mem_info` varchar(50) NOT NULL,   
  `load_info` varchar(50) NOT NULL,   
  `mark_info` varchar(50) NOT NULL,   
  PRIMARY KEY (`id`),
  UNIQUE KEY `ip_info` (`ip_info`),
  UNIQUE KEY `ip_info_2` (`ip_info`)
);

systeminfo

代码:

#include “httpd.h”
#include “http_config.h”
#include “http_protocol.h”
#include “ap_config.h”
/* 头文件,本文用到了 ap_rprintf 函数 */
#include “apr.h”
#include “apr_lib.h”
#include “apr_strings.h”
#include “apr_want.h”
#include “/usr/include/mysql/mysql.h”

/* 定义 mysql 数据变量 */
const char *host = “localhost”;
const char *user = “root”;
const char *pass = “root”;
const char *db  = “test”;

/* The sample content handler */
static int hello_handler(request_rec *r)
{
    if (strcmp(r->handler, “hello”)) {
        return DECLINED;
    }
    r->content_type = “text/html”;
    /* 定义 mysql 变量 */
    MYSQL mysql;
    MYSQL_RES *rs;
    MYSQL_ROW row;
    mysql_init(&mysql); /* 初始化 */
    if (!mysql_real_connect(&mysql, host, user, pass, db, 0, NULL, 0)) {/* 连接数据库 */
        ap_rprintf(r, “<li>Error : %d %s</li>\n”, mysql_errno(&mysql), mysql_error(&mysql));
        return OK;
    }
    char *sql = “select ip_info,mark_info from systeminfo order by rand()”;
    if (mysql_query(&mysql, sql)!=0) {/* 查询 */
        ap_rprintf(r, “<li>Error : %d %s</li>\n”, mysql_errno(&mysql), mysql_error(&mysql));
        return OK;
    }
    rs = mysql_store_result(&mysql); /* 获取查询结果 */
    while ((row = mysql_fetch_row(rs))) {/* 获取每一行记录 */
        ap_rprintf(r, “<li>%s – %s</li>\n”, row[0], row[1]);
    }
    mysql_free_result(rs); /* 释放结果集 */
    mysql_close(&mysql); /* 关闭连接 */
    return OK;
}

static void hello_register_hooks(apr_pool_t *p)
{
    ap_hook_handler(hello_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

/* Dispatch list for API hooks */
module AP_MODULE_DECLARE_DATA hello_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                  /* create per-dir    config structures */
    NULL,                  /* merge per-dir    config structures */
    NULL,                  /* create per-server config structures */
    NULL,                  /* merge per-server config structures */
    NULL,                  /* table of config file commands      */
    hello_register_hooks /* register hooks                      */
};

mod_hello.c

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/140800.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5962字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7984174
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用AI做了一个1978年至2019年中国大陆企业注册的查询网站

我用 AI 做了一个 1978 年至 2019 年中国大陆企业注册的查询网站 最近星哥在 GitHub 上偶然...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛NAS硬件03:五盘位+N5105+双网口的成品NAS值得入手吗

星哥带你玩飞牛 NAS 硬件 03:五盘位 +N5105+ 双网口的成品 NAS 值得入手吗 前言 大家好,我...
星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛NAS-1:安装飞牛NAS

星哥带你玩飞牛 NAS-1:安装飞牛 NAS 前言 在家庭和小型工作室场景中,NAS(Network Atta...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...