首页 > 系统相关 >CentOS7 云服务器上安装 Libmicrohttpd 库

CentOS7 云服务器上安装 Libmicrohttpd 库

时间:2023-12-03 17:55:07浏览次数:25  
标签:libmicrohttpd MHD 服务器上安装 CentOS7 命令 PATH Libmicrohttpd page

本周 web 课的课程作业是实现一个类似 top 命令的网络服务,用于监控远程服务器的进程,其中使用的 web 服务器是 Libmicrohttpd,于是在此记录下我的下载安装流程,如有错误,欢迎指正!

1. Libmicrohttpd

Libmicrohttpd 是一个小型的 C 语言库,用于嵌入 HTTP 服务器功能到应用程序中。

它支持 HTTP 1.1,可在 Unix-like 系统(如 Linux)和 Windows 上运行,它还提供简单的编程接口,用于监听网络连接、解析 HTTP 请求和发送响应。

以下是在 CentOS 7 上下载、配置、编译并安装 Libmicrohttpd 的详细步骤:

2. 准备工作

  • 安装依赖工具和库:确保系统具有编译源代码所需的基本工具和库,可以通过以下命令安装:
sudo yum groupinstall "Development Tools"
sudo yum install libtool libgcrypt-devel gnutls-devel

Development Tools:是一组工具,包括编译器、链接器、调试器等,它们是编译和构建软件的基础。(比如 gcc,make 等)

Libtool:是一个用于创建可移植库的脚本,与在不同系统上创建共享库(动态链接库)相关

Libgcrypt-devel:是 Libgcrypt 的开发文件(头文件和库),用于提供加密功能

Gnutls-devel:是 GnuTLS(一个安全通信库)的开发版本,它提供了网络通信中的加密和安全功能,例如支持 HTTPS

3. 下载和解压

  • 下载 Libmicrohttpd 源代码
wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-latest.tar.gz
  • 解压源代码包:使用 tar 命令解压下载的文件
tar -xzvf libmicrohttpd-latest.tar.gz

4. 编译和安装

  • 配置构建环境:进入解压后的目录,并配置构建环境

可以使用 ./configure 命令来配置 Libmicrohttpd,如

  • --prefix=PATH:指定软件安装的目录,默认通常是安装到 /usr/local 目录下
  • --enable-或-disable-OPTION:启用或禁用特定的功能或选项,例如:./configure --enable-https=yes 可以开启 HTTPS 支持
cd libmicrohttpd-0.9.77
./configure --prefix=/usr/local

  • 编译源代码
make
  • 安装库:安装编译好的库到系统中
sudo make install

5. 验证安装

  • 验证安装:验证 Libmicrohttpd 是否正确安装
pkg-config --libs --cflags libmicrohttpd

如果安装正确,这个命令会输出库的版本和编译选项

如果和我一样输出的不太对,也就是类似下面这样:Package libmicrohttpd was not found in the pkg-config search path. Perhaps you should add the directory containing libmicrohttpd.pc' to the PKG_CONFIG_PATH environment variable No package 'libmicrohttpd' found

那就接着配置下面的环境变量

6. 设置环境变量

  • 设置 PKG_CONFIG_PATH 环境变量:执行以下命令将 /usr/local/lib/pkgconfig 添加到 PKG_CONFIG_PATH 环境变量中
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
  • 验证设置:再次运行 pkg-config 命令来检查 Libmicrohttpd 是否能被正确识别:
pkg-config --libs --cflags libmicrohttpd

如果一切顺利,这次命令应该能输出 Libmicrohttpd 的链接和编译选项,然后我们就将环境变量永久添加到配置文件中

  • 永久添加环境变量:为了确保这个环境变量在每次登录或开机时都被自动设置,需要将这个 export 命令添加到 shell 配置文件中,如 ~/.bashrc
    • 执行以下命令编辑 .bashrc 文件:
echo 'export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH' >> ~/.bashrc
  • 使更改生效:为了使 .bashrc 中的更改立即生效,执行以下命令:
source ~/.bashrc

7. 运行测试代码

  • 先编写一个简单的小demo,用于获取系统top命令的输出并生成HTML页面返回响应
#include <microhttpd.h>  // 引入Libmicrohttpd库
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

#define PORT 8888

// 处理每个连接请求的函数
static int answer_to_connection (void *cls, struct MHD_Connection *connection, 
                                 const char *url, const char *method, 
                                 const char *version, const char *upload_data,
                                 size_t *upload_data_size, void **con_cls) {
    char *page;  // 存储生成的HTML页面内容
    FILE *fp;    // 文件指针,用于执行命令
    char path[1035];  // 存储命令输出的缓冲区

    // 执行系统命令top,以批处理模式运行一次
    fp = popen("top -b -n 1", "r");
    if (fp == NULL) {
        printf("Failed to run command\n");
        exit(1);
    }

    // 动态分配空间来存储HTML页面内容
    size_t page_size = 10000;
    page = malloc(page_size);
    if (!page) {
        perror("Malloc failed");
        exit(1);
    }

    strcpy(page, "<html><head><meta charset=\"UTF-8\"></head><body>");

    // 读取命令输出并添加到HTML页面
    while (fgets(path, sizeof(path)-1, fp) != NULL) {
        // 检查是否需要扩展缓冲区
        if (strlen(page) + strlen(path) + 8 > page_size) {
            page_size *= 2; // 加倍页面大小
            char *new_page = realloc(page, page_size);
            if (!new_page) {
                perror("Realloc failed");
                free(page);
                exit(1);
            }
            page = new_page;
        }
        strcat(page, path);
        strcat(page, "<br>");
    }
    strcat(page, "</body></html>");

    struct MHD_Response *response;
    int ret;

    // 创建响应对象,其中包含生成的HTML页面
    response = MHD_create_response_from_buffer(strlen(page), (void *)page, MHD_RESPMEM_MUST_FREE);
    ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
    MHD_destroy_response(response);

    pclose(fp);
    return ret;
}

int main () {
    struct MHD_Daemon *daemon;  // 定义服务器守护进程

    // 启动守护进程,监听指定端口
    daemon = MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, PORT, NULL, NULL, 
                              (MHD_AccessHandlerCallback) answer_to_connection, NULL, MHD_OPTION_END);
    if (NULL == daemon) return 1;  // 如果守护进程启动失败,返回1

    getchar();  // 等待用户输入以退出

    MHD_stop_daemon(daemon);  // 停止守护进程
    return 0;
}
  • 编译执行命令如下:
gcc test.c -o test -lmicrohttpd
./test
  • 好的,有可能还会遇到下面的报错:
error while loading shared libraries: libmicrohttpd.so.12: cannot open shared object file: No such file or directory

那就继续下面的步骤

8. 解决运行时库加载的问题

  • 设置 LD_LIBRARY_PATH 环境变量:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
  • 更新动态链接器缓存:
sudo ldconfig
  • 再次编译运行下:
gcc test.c -o test -lmicrohttpd
./test

  • 终于没有报错,此时访问下服务器地址,如:http://xxx.xxx.xxx.xxx:8888 (这里的8888端口是因为我代码里写着监听端口是8888),成功显示 top 命令的输出如下:

9. 卸载 Libmicrohttpd

如果需要卸载重试的话,可以尝试下面的命令

  • 进入之前编译 Libmicrohttpd 的目录

  • 执行卸载命令:

sudo make uninstall
  • 可选:清理环境变量配置(从 .bashrc 中删除相关行)

标签:libmicrohttpd,MHD,服务器上安装,CentOS7,命令,PATH,Libmicrohttpd,page
From: https://www.cnblogs.com/thr-0103/p/17873494.html

相关文章

  • Docker运行centos7
    Docker安装centos7:步骤:1.使用Docker创建虚拟网络:#创建一个网段为192.168.0.0/24的虚拟网络,名字为centosNetdockernetworkcreate--subnet=192.168.0.0/24centosNet#查看dockernetworkls2.创建容器;#"--privileged=true"参数使得容器具有对主机系统设备和内......
  • CentOS7 无法执行systemctl status ntpd的原因及解决方法
    在CentOS7中,NTP的服务名为ntpd.service,如果出现Unitntpd.servicecouldnotbefound的错误,可能是由于NTP没有安装或未正确启动所致。你可以尝试以下步骤来解决此问题:首先,检查系统是否已经安装NTP。可以运行以下命令:rpm-qntp如果返回packagentpisnotinstall......
  • Centos7 更新php7.1到7.4的方法
    因为WordPress要求最低php版本为7.4,故有此篇。系统版本:CentOS7.9第一步:查看已安装的php的所有包yumlistinstalled|grepphp第二步:卸载上述包yumremovephp*第三步:换下载源为remiyuminstallepel-releaserpm-ivhhttp://rpms.famillecollet.com/enterprise/re......
  • centOS7安装和卸载docker
    可参考docker官网文档:在CentOS上安装Docker引擎|Docker文档1)确定是CentOS7以上版本,命令如下:cat/etc/redhat-release2)卸载旧版本sudoyumremovedocker\docker-client\docker-client-latest\docker-c......
  • centos7-MQTT Server搭建(apache-apollo)搭建和配置
    #############################安装apache-apollo###################################################官方的安装文档:http://activemq.apache.org/apollo/documentation/getting-started.htmlhttp://www.apache.org/dyn/closer.cgi?path=activemq/activemq-apollo/1.7.1/apach......
  • 在centos7下搭建ftp server
    1、安装软件yuminstallvsftpd2、修改配置文件目的:1)将使用系统本地用户登陆2)将用户锁定在其家目录下,不能随意切换3)禁用匿名用户anonymous_enable=NOlocal_enable=YESwrite_enable=YESlocal_umask=022dirmessage_enable=YESxferlog_enable=YESconnect......
  • yanmay Centos7上安装jmeter
    下载:https://archive.apache.org/dist/jmeter/binaries/插件下载:https://jmeter-plugins.org/来源:https://www.cnblogs.com/mayyan/p/16054439.htmlJmeter需要java环境一、在Linux服务器先安装jdk:1、以jdk-8u172-linux-x64.tar.gz为例:下载地址:http://www.oracle.com/techne......
  • 全网最详细!Centos7.X 搭建Grafana+Jmeter+Influxdb 性能实时监控平台 (上)
    来源:https://developer.aliyun.com/article/907041本文涉及的产品可观测可视化Grafana版,10个用户账号1个月 立即试用 简介: 全网最详细!Centos7.X搭建Grafana+Jmeter+Influxdb性能实时监控平台(上)背景日常工作中,经常会用到Jmeter......
  • 关于 xshell 连不上远程 CentOS7 云服务器的问题
    前情提要:今天收到腾讯云发来短信提示我的云服务器在17:23分时异地登录,我震惊,因为今天貌似根本没登过云服务器于是我赶紧上腾讯云控制台查看,先修改密码,然后重启,最后关机在接近19点时我重新开机,再次修改了密码,然后按照网上的教程关闭定时任务,查找有没有守护进程或者挖矿病毒,无果......
  • CentOS7安装Docker
    1、前言安装参考文档:https://docs.docker.com/engine/install/centos/阿里镜像地址:https://www.aliyun.com/product/acr安装命令:基于root账户进行安装,非root命令采用sudo2、安装docker2.1、删除原有的dockeryumremovedocker\docker-client\docker......