一、前言
最近学习了systemd的相关特性及unit文件的组成,想尝试在编译安装完apache后,利用systemd管理启动apache服务,以此加深对systemd管理的理解。
二、Centos7 编译安装apache
此前已经写过关于如何在Centos 7上编译安装apache的博客,这里就不作详细介绍,只给相应的操作流程:
[root@localhost tmp]# yum install -y gcc gcc++ zlib zlib-devel expat-devel pcre-devel #安装相应的环境
[root@localhost tmp]# tar -zxf apr-1.6.3.tar.gz
[root@localhost tmp]# tar -zxf apr-util-1.6.1.tar.gz
[root@localhost tmp]# tar -zxf httpd-2.4.29.tar.gz
[root@localhost tmp]# # cd apr-1.6.3
[root@localhost apr-1.6.3]# ./configure --prefix=/usr/local/apr #编译安装apr
[root@localhost apr-1.6.3]# make && make install
[root@localhost apr-1.6.3] cd ../apr-util-1.6.1
[root@localhost apr-util-1.6.1] ./configure --prefix=/usr/loacl/apr-util --with-apr=/usr/local/apr #编译安装apr-util
[root@localhost apr-util-1.6.1] make && make install
[root@localhost apr-util-1.6.1] cd ../httpd-2.4.29
[root@localhost httpd-2.4.29] ./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr/ --with-apr-util=/usr/loacl/apr-util/ #编译安装httpd
[root@localhost httpd-2.4.29] make && make install
编译安装完后,记得关闭firewalld 和selinux,以免影响输出结果。
三、编辑apache的unit文件
在/usr/lib/systemd/system/目录下新建一个名为httpd.service的unit文件,其内容为:
[Unit]
Description=apache
[Service]
Type=simple #设置service类型为simple
EnvironmentFile=/usr/local/apache/conf/httpd.conf #指定service的环境配置文件
ExecStart=/usr/local/apache/bin/httpd -k start -DFOREGROUND
ExecReload=/usr/local/apache/bin/httpd -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID} #此处的${MAINPID}为特殊变量,对应着相应服务的主进程ID
[Install]
WantedBy=multi-user.target
上述内容为我参考使用yum install -y httpd 安装生成的 unit文件所编辑的,其内容详细解析可man一下systemd.unit和systemd.service进行查看。
另外,上述的-DFOREGROUND意味着相应的httpd进程不是作为前台进程运行在系统当中,而且由systemd进程代为管理其输入和输出,但是在进程层面来说,这跟前台进程的运行一样。此处我测试中,试过需要添加-DFOREGROUND才能使用systemctl对httpd服务进行管理启动;也许是因为不加-DFOREGROUND,该服务没办法由systemd管理???(求确认)
除此之外,在设置Type=simple时,我曾设置过notify类型,但是发现在执行了systemc start httpd后,执行会报错:

其执行的日志为:

httpd服务启动超时,后来经google后(这里得吹一波),有大神解释道:如果我们使用的是默认的httpd配置文件,那必须保证配置文件中包含module_systemd,那个module为获取apache启动成功信息所必须得(我这里检查我自己的配置文件,确实没有相应的module,但是我查了下对应的module好像是apache 2.5版本才有,我使用的是2.4版本,所以这里具体为什么使用notify就会出现超时的原因,目前我也没搞明白,欢迎指点。),如果不想启动对应的module,可以使用simple类型。
贴上相应的地址链接:https://www.apachelounge.com/viewtopic.php?p=28864
四、启动httpd服务并设置自动启动
编辑完成后,记得使用systemctl daemon-reload加载新建或编辑过的unit文件。
随后使用systemctl启动httpd服务:
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl status httpd
● httpd.service - apache
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since 六 2018-04-07 10:19:56 CST; 5s ago
Process: 3369 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)
Main PID: 3377 (httpd)
CGroup: /system.slice/httpd.service
├─3377 /usr/local/apache/bin/httpd -k start -DFOREGROUND
├─3378 /usr/local/apache/bin/httpd -k start -DFOREGROUND
├─3379 /usr/local/apache/bin/httpd -k start -DFOREGROUND
└─3380 /usr/local/apache/bin/httpd -k start -DFOREGROUND
4月 07 10:19:56 localhost.localdomain systemd[1]: Started apache.
4月 07 10:19:56 localhost.localdomain systemd[1]: Starting apache...
4月 07 10:19:56 localhost.localdomain httpd[3377]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdoma...is message
Hint: Some lines were ellipsized, use -l to show in full.
设置开机自动启动httpd服务:
[root@localhost ~]# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
此时查看相关的httpd服务端口,应该已经启动了:
[root@localhost ~]# netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 52 192.168.0.188:22 192.168.0.38:50923 ESTABLISHED
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 192.168.0.188:80 192.168.0.38:51271 ESTABLISHED
访问测试下:

well done!成功了,至此就成功使用unit文件管理启动apache了。这个systemd的使用目前我也是半知半解,如果有大神发现我写的有误的话,希望指点下。
附带:在Centos 7上使用chkconfig管理启动apache的方法
https://www.jianshu.com/p/f8e4046820d6
l
网友评论