【Linux】编译安装nginx,手写service配置文件,深度理解systemd控制管理服务底层原理

目录

一、了解服务

1、服务的本质

2、centos7的systemd的服务

3、service unit file配置文件的组成以及掌握常用选项

4、关于systemd管理的命令学习

5、运行级别

二、编译安装nginx,以及手写service配置文件,请看注释

​编辑


一、了解服务

1、服务的本质

“服务”的本质是一种程序,“服务”分两种:

程序服务程序:对内,为保证计算机的正常运行,比如systemd,协助管理程序

用户服务程序:对外,给网络上用户提供各种功能,比如购物、游戏等,常见httpd

服务一般是后台运行,已准备随时调用

2、centos7的systemd的服务

centos 6采用init初始化进程,是一个一个串行启动

centos7采用systemd作为祖宗进程,systemd也是一种init程序,①解决依赖关系并行启动;②按需启动(根据服务配置设定启动)③负责在系统启动或者运行时,激活系统资源、服务进程等

systemd还提供叫醒服务,举例,安装rpcbind,将其关闭,然后用另一台主机进行探测连接,查看进程状态,实验看一下

systemd可以向后兼容sysvinit,systemd可以将多个程序进行单元管理,单元类型分类:

单元类型扩展名说明
Serviceservice描述一个系统服务软件(这是我们最需要知道的)
Socket.socket描述一个进程间通信的套接字
Device.device描述一个内核识别的设备文件
Mount.mount描述一个文件系统的挂载点
Automount.automount描述一个文件系统的自动挂载点
Swap.swap描述一个内存交换设备或交换文件
Path.path描述一个文件系统中文件或目录
Timertimer描述一个定时器 (用于实现类似cron的调度任务)
Snapshot.snapshot用于保存一个systemd的状态
Scope.scope使用systemd的总线接口以编程的方式创建外部进程
Slice.slice描述居于Cgroup的一组通过层次组织的管理系统进程
Target.taget描述一组systemd的单元(我觉得可以理解为运行级别)

3、service unit file配置文件的组成以及掌握常用选项

要知道,yum和rpm安装的时候系统,安装的是软件包,是已经写好了,会自动将service配置文件放到/usr/lib/systemd/system/这个文件夹中,让这个服务程序自动被systemd管理,但是编译安装是不会自动被管理,那么如果想要被systemd管理,则需要手动编写service配置文件。

这里拓展一下,systemd统一管理的好处:

1、对计算机而言,systemd有一套自己的启动、关闭等命令规则,这样可以套公式一样进行所有程序的管理,也可以理解为这是为了有一套制度,更好的调度计算机理解需求;

2、对于电脑面前的运维工程师,可以更好的去查看记忆程序状态,尤其是管理大量不同程序的情况下,可以统一规则。

关于配置文件的书写格式:

service unit file文件通常由三部分组成:

[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等

[Service]:与特定类型相关的专用选项;此处为Service类型
#service这一步非常非常重要!!!

[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到
的一些选项
Unit段的常用选项
Description描述信息(一般会写一个描述,等下看实操案例)
After/Before自定义unit的启动顺序,表示当前unit应该晚于或者优先于哪些unit启动
Requires依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活
Wants依赖到的其它units,弱依赖
Conflicts定义units间的冲突关系
Service段的常用选项                                                                                  
Type定义影响ExecStart及相关参数的功能的unit进程启动类型
simple默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
forking由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
oneshot与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
dbus与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
notify在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
idle与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
notify在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd 接收消息
idle与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
EnvironmentFile环境配置文件
ExecStart指明启动unit要运行命令或脚本的绝对路径(最最最重要)
ExecStartPre ExecStart前运行
ExecStartPost ExecStart后运行
ExecStop指明停止unit要运行的命令或脚本的绝对路径(最最最重要)
ExecReload指明程序重新加载unit要运行的命令或脚本的绝对路径(最最最重要)
Restart当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务
RestartSec设置在重启服务( Restart= )前暂停多长时间。 默认值是100毫秒(100ms)。 如果未指定时间单位,那么将视为以秒为单位。 例如设为"20"等价于设为"20s"。
PrivateTmp设定为yes时,会在生成/tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/目录
Install字段的常用选项
Alias别名,可使用systemctl command Alias.service
RequiredBy被哪些units所依赖,强依赖
WantedBy被哪些units所依赖,弱依赖(一般会写一个弱依赖,等下看实操案例)
Also安装本服务的时候还要安装别的相关服务

4、关于systemd管理的命令学习

命令功能
systemctl   start 软件名开启进程
systemctl   stop 软件名关闭进程
systemctl  status 软件名查看进程状态
systemctl   restart 软件名重启进程(先关闭后启动)
systemctl   reload 软件名重新加载(不关闭的状态下更新)
systemctl   enable 软件名开机自启动
systemctl   enable --now 软件名开启自启动并现在启动
systemctl   disable 软件名开机不自启
systemctl   disable  --now 软件名开机不自启并现在关闭
systemctl   daemon-reload 

重新加载新服务,让系统识别
就是/usr/lib/systemd/system/这个文件夹加入内容后需要刷新一下

daemon是守护进程的意思

5、运行级别

运行级别Systemd的target说明
0target关机状态(也可以用poweroff关机)
1rescue.target单用户模式,不需要密码验证即可登录系统,多用于系统维护
2multi-user.target与3的区别是不支持nfs功能。默认等同于3
3multi-user.target字符界面的完整多用户模式,大多数服务器主机运行在此级别(支持nfs)
4multi-user.target保留的运行级别。默认等同于3
5graphical.target图形界面的多用户模式,提供了图形桌面操作环境
6reboot.target重新启动(也可以用reboot)

查看当前的默认运行级别:systemctl  get-default

修改默认运行级别:systemctl set-default 加运行级别英文表达式

查看当前运行级别:runlevel

[root@localhost ~]#runlevel
N 5

# N表示前一次的运行级别
# 5表示当前运行级别

[root@localhost ~]#init 3

[root@localhost ~]#runlevel
5 3

二、编译安装nginx,以及手写service配置文件,请看注释

cd  /opt
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar xf   nginx-1.18.0.tar.gz
cd  nginx-1.18.0
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel 
#安装依赖环境

mkdir /apps/nginx -p    

./configure   --prefix=/apps/nginx
##检测安装环境,安装去指定目录,或者选择安装功能

##指明安装路径
make
##编译 将人类的高级语言翻译成二进制
make  install
##将安装好的软件放入指定路径

ln -s /apps/nginx/sbin/nginx   /usr/sbin/nginx 
#做软链接 
##手写service配置文件

vim  /usr/lib/systemd/system/nginx.service

[Unit]
Description=The nginx HTTP and reverse proxy server
#描述软件的功能,查看进程状态的时候,会有这一段描述

[Service]
PIDFile=/apps/nginx/logs/nginx.pid
#这里指明了这个pid号的配置文件存放位置,约定俗成一般存放在安装服务的logs中,以上nginx服务编译安装在/apps/nginx中,所以路径更改为/apps/nginx/logs/nginx.pid,一旦启动进程,nginx.pid文件会自动创建

ExecStart=/apps/nginx/sbin/nginx
#使用绝对路径启动

ExecStop=/usr/bin/kill -s TERM $MAINPID
#杀死进程

ExecReload=/apps/nginx/sbin/nginx -s reload
#重新加载

[Install]
WantedBy=multi-user.target
安装在字符界面(3)




##结束以后加上  让系统识别到这个程序
systemctl daemon-reload