系统服务配置
一、Target单元
Target(目标):
在systemd中有一个叫做target的单元,也叫作目标单元。这个单元没有专用的配置选项,它只是以.target结尾的文件,它本身没有具体功能,你可以理解为类别,它的作用就是将一些单元汇聚在一起。通过下面的命令可以查看系统的target单元。
systemctl list-units-file --type =target/service
正如我们之前说到的Unit概念。常用的Target有:
名称 | 说明 |
---|---|
basic.target | 启动基本系统,该目标间接包含了所有的本地挂载点单元以及其他必须的系统初始化单元。 |
ctrl-alt-del.target | 当在控制台按下Ctrl+Alt+Del组合键时要启动的单元。 |
default.target | 默认的启动目标,通常指向multi-user.target或者graphical.target的目标。 |
graphical.target | 专用于启动图形化登陆界面的目标单元,其中包含了multi-user.target单元。 |
hibernate.target | 专用于系统休眠到硬盘时启动的单元。 |
halt.target | 专用于关闭系统单不切断电源时启动的单元。 |
local-fs.target | 专用于集合本地文件系统挂载点的目标单元。 |
multi-user.target | 专用于多用户且为命令行模式下启动的单元。所有用于要在命令行多用户模式下启动的单元,其[Install]段都应该加上WantedBy=multi-user.target指令。 |
reboot.target | 专用于重启系统时需要需要启动的单元。 |
rescure.target | 专用于启动基本系统并打开一个救援shell时需要启动的单元。 |
shutdown.target | 专用于在关机过程中关闭所有的单元。 |
sleep.target | 专用于进入休眠状态的目标单元。 |
timers.target | 专用于包含所有应该在系统启动时被启动的timer单元。 |
使用 systemctl
命令来管理和控制 .target
单元,例如:
查看当前默认的 `.target` 单元:`systemctl get-default`
设置默认的 `.target` 单元:`systemctl set-default <target>`
切换到特定的 `.target` 单元:`systemctl isolate <target>`
查看可用的 `.target` 单元:`systemctl list-units --type=target`
二、服务单元文件格式
Systemd 服务单元文件的标准格式包括以下部分:
-
[Unit]
部分:-
Description
:服务的简短描述。 -
Documentation
:提供有关服务的额外文档信息。 -
After
:指定服务应在哪些其他单元之后启动。 -
Before
:指定服务应在哪些其他单元之前启动。 -
Wants
:指定服务所需的其他单元,但不会因其失败而导致服务失败。
-
-
[Service]
部分:-
Type
:指定服务的类型,通常是simple
、forking
、oneshot
、dbus
、notify
等。 -
ExecStart
:指定启动服务的命令或脚本。 -
ExecStop
:指定停止服务的命令或脚本。 -
ExecReload
:指定重新加载服务配置的命令。 -
Restart
:指定在服务失败时自动重新启动的策略。 -
User
和Group
:指定以哪个用户和组的身份运行服务。 -
WorkingDirectory
:指定服务的工作目录。
-
-
[Install]
部分:-
WantedBy
:指定哪个目标单元会启用此服务(通常是multi-user.target
或graphical.target
)。 -
RequiredBy
:指定哪个目标单元必须要求此服务。
-
以下是一个示例 Systemd 服务单元文件的标准格式:
[Unit]
Description=My Example Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/my-service
ExecStop=/usr/bin/my-service-stop
Restart=on-failure
User=myuser
Group=mygroup
WorkingDirectory=/path/to/working/directory
[Install]
WantedBy=multi-user.target
这只是一个简单的示例,实际的服务单元文件可以包含更多选项,具体取决于你的服务的需求。你可以根据你的服务的需要来调整和扩展这些选项。
三、nginx集成到systemd
-
创建一个 systemd 服务文件:
在
/lib/systemd/system/
目录中创建一个新的 systemd 服务文件,例如nginx.service
,并使用 root 权限编辑它:sudo vim /lib/systemd/system/nginx.service
在这个文件中,添加以下内容:
[Unit] Description=The NGINX HTTP and reverse proxy server After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/local/nginx/sbin/nginx ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s quit PrivateTmp=true [Install] WantedBy=multi-user.target
说明:
PrivateTmp=true
是 Systemd 服务单元文件中的一个设置,用于指定服务是否应该使用私有的临时文件目录。这个选项用于增加服务的安全性和隔离性。当
PrivateTmp
设置为true
时,Systemd 会在服务启动时为该服务创建一个私有的临时文件目录,该目录只能由该服务自己访问和使用。这意味着服务无法访问系统范围的临时文件目录,从而提高了安全性,因为服务无法意外地覆盖或访问其他服务或系统进程的临时文件。这种隔离可以防止一些安全问题,例如竞争条件和信息泄漏,因为服务只能在其私有临时目录中进行操作。这在多个服务运行在同一系统上并且需要独立的临时空间时尤其有用。
需要注意的是,
PrivateTmp
仅影响服务的临时文件目录,不会影响其他文件系统或目录的隔离。这是 Systemd 提供的一种额外的安全和隔离层,用于服务的运行环境。请确保
ExecStart
、ExecReload
和ExecStop
的路径正确指向你通过源码编译安装的 Nginx 二进制文件。 -
重新加载 systemd 配置:
使用以下命令重新加载 systemd 配置,以便它可以识别新的服务文件:
sudo systemctl daemon-reload
-
启动 Nginx 服务:
现在你可以使用 systemctl 命令来启动、停止、重新加载和查看 Nginx 服务的状态了:
-
启动 Nginx 服务:
sudo systemctl start nginx
-
停止 Nginx 服务:
sudo systemctl stop nginx
-
重新加载 Nginx 配置:
sudo systemctl reload nginx
-
查看 Nginx 服务状态:
sudo systemctl status nginx
-
设置 Nginx 开机自启动:
sudo systemctl enable nginx
确保在修改了 systemd 服务文件后测试一下,以确保一切正常运行。
-
四、配置服务的并发连接数和资源限制
在 systemd 中,您可以配置服务的并发连接数和资源限制,以确保服务能够在受控的条件下运行。这可以通过在服务单元文件中的 [Service]
部分添加一些配置选项来实现。以下是一些常见的配置选项:
-
LimitNOFILE:限制文件描述符的数量。
-
例如,要限制文件描述符的数量为1000,可以添加以下行:
LimitNOFILE=1000
-
-
LimitNPROC:限制进程的数量。
-
例如,要限制进程的数量为200,可以添加以下行:
LimitNPROC=200
-
-
LimitFSIZE:限制进程的文件大小。
-
例如,要限制文件大小为100MB,可以添加以下行:
LimitFSIZE=100M
-
-
LimitDATA:限制数据段的大小。
-
例如,要限制数据段的大小为200MB,可以添加以下行:
LimitDATA=200M
-
-
LimitSTACK:限制堆栈的大小。
-
例如,要限制堆栈的大小为4MB,可以添加以下行:
LimitSTACK=4M
-
-
LimitCORE:限制核心转储文件的大小。
-
例如,要限制核心转储文件的大小为100MB,可以添加以下行:
LimitCORE=100M
-
这些配置选项可以根据您的服务的具体需求进行调整。将它们添加到您的服务单元文件的 [Service]
部分,然后通过 systemctl
命令来重新加载 systemd 并应用更改:
sudo systemctl daemon-reload
然后,通过 systemctl
命令来重新启动您的服务以使更改生效:
sudo systemctl restart your-service-name
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了