Httpd2.4源码编译安装并提供系统服务管理脚本(两种方法实现)

一、源码编译安装httpd 2.4

# 从官网下载httpd源代码
[root@openEuler-2 ~]# wget https://downloads.apache.org/httpd/httpd-2.4.62.tar.gz


# 解压并进入到该目录中
[root@openEuler-2 ~]# tar -zxvf httpd-2.4.62.tar.gz
[root@openEuler-2 ~]# cd httpd-2.4.62/


# 安装httpd编译所需的依赖包
[root@openEuler-2 httpd-2.4.62]# yum -y groupinstall "Development Tools"
[root@openEuler-2 httpd-2.4.62]# yum install -y pcre pcre-devel openssl-devel expat-devel


# 配置httpd源代码并进行编译和安装(编译过程中缺啥装啥)
[root@openEuler-2 httpd-2.4.62]# ./configure --prefix=/usr/local/apache2 --enable-so --enable-ssl --with-mpm=event
[root@openEuler-2 httpd-2.4.62]# make
[root@openEuler-2 httpd-2.4.62]# make install

# 配置环境变量
[root@openEuler-2 httpd-2.4.62]# echo "export PATH=$PATH:/usr/local/apache2/bin" > /etc/profile.d/httpd.sh
[root@openEuler-2 httpd-2.4.62]# source /etc/profile.d/httpd.sh

接下来创建一个快照,为了方便使用两种不同的方式提供系统服务管理脚本。

二、配置系统服务

1、第一种方法:systemctl

systemd 将过去所谓的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位依据功能来区分时,就分类为不同的类型 (type)。 基本的类型有包括系统服务、数据监听与交换的插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境 (target) 等等。 配置文件都放置在底下的目录中:

  • /usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的 /etc/init.d  底下的文件;
  • /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高!
  • /etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又比 /run/systemd/system/  高!

rhel7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下。

每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]

[Unit]——服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
表示如果network.target或sshd-keygen.service需要启动,那么nginx.service应该在它们之后启动。
     
[Service]——服务运行参数的设置
Type=forking是后台运行的形式
PIDFile: pid文件路径
ExecStartPre :启动服务之前执行的命令(启动前要做什么,上文中是测试配置文件 -t)
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
     
[Install]——服务安装的相关设置,可设置为多用户

Type字段定义启动类型。它可以设置的值如下:

  • Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
  • Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
  • Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes使得systemd在服务进程退出之后仍然认为服务处于激活状态
  • Type=notify:与 Type=simple相同,但约定服务会在就绪后向systemd发送一个信号。这一通知的实现由 libsystemd-daemon.so提供。
  • Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。

适用于RHEL 7以上的版本。

# 编辑httpd系统服务文件
[root@openEuler-2 httpd-2.4.62]# vim /etc/systemd/system/httpd.service
[root@openEuler-2 httpd-2.4.62]# cat /etc/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/apache2/bin/apachectl start
ExecStop=/usr/local/apache2/bin/apachectl stop
ExecReload=/usr/local/apache2/bin/apachectl graceful

[Install]
WantedBy=multi-user.target


# 重新加载systemd配置
[root@openEuler-2 httpd-2.4.62]# systemctl daemon-reload

# 启动httpd服务
[root@openEuler-2 httpd-2.4.62]# systemctl start httpd

# 停止httpd服务
[root@openEuler-2 httpd-2.4.62]# systemctl stop httpd

# 重启httpd服务
[root@openEuler-2 httpd-2.4.62]# systemctl restart httpd

# 设置开机自启动
[root@openEuler-2 httpd-2.4.62]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /etc/systemd/system/httpd.service.

# 查看服务状态
[root@openEuler-2 httpd-2.4.62]# systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/etc/systemd/system/httpd.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2025-01-10 14:14:48 CST; 20s ago
   Main PID: 34785 (httpd)
      Tasks: 82 (limit: 8932)
     Memory: 15.2M
...(已省略)

测试:

测试成功!

2、第二种方法:system v 脚本管理

适用于RHEL 6以下的版本。

# 编写脚本
[root@openEuler-2 httpd-2.4.62]# vim /etc/init.d/httpd
[root@openEuler-2 httpd-2.4.62]# cat /etc/init.d/httpd
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#        HTML files and CGI.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

exec="/usr/local/apache2/bin/httpd"
prog="httpd"

# Check for the existence of the binary.
if [ ! -f $exec ]; then
   echo "$exec not installed"
   exit 5
fi

start() {
    echo -n $"Starting$prog: "
    daemon $exec -k start
    echo "."
}

stop() {
    echo -n $"Stopping$prog: "
    daemon $exec -k stop
    echo "."
}

rh_status() {
    # service status check is done by checking httpd process
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart)
        $1
        ;;
    status)
        rh_status
        ;;
    *)
        echo $"Usage:$0 {start|stop|status|restart}"
        exit 2
esac

exit $?


# 添加执行权限
[root@openEuler-2 httpd-2.4.62]# sudo chmod +x /etc/init.d/httpd

# 使用chkconfig添加服务并设置它开机自启
[root@openEuler-2 httpd-2.4.62]# chkconfig --add httpd
[root@openEuler-2 httpd-2.4.62]# chkconfig httpd on

# 启动服务
[root@openEuler-2 ~]# service httpd start
Starting httpd (via systemctl):  [  OK  ]

# 停止服务
[root@openEuler-2 ~]# service httpd stop
Stopping httpd (via systemctl):  [  OK  ]

# 重启服务
[root@openEuler-2 ~]# service httpd restart
Restarting httpd (via systemctl):  [  OK  ]


# 查看状态
[root@openEuler-2 ~]# service httpd status
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
     Active: active (running) since Fri 2025-01-10 14:29:29 CST; 30s ago
       Docs: man:httpd.service(8)
   Main PID: 35328 (httpd)
     Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
      Tasks: 177 (limit: 8932)
     Memory: 16.3M
...(已省略)

测试:(这次使用不同的浏览器)

测试成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值