服务器开发系列


文章目录

  • 服务器开发系列
  • 前言
  • 一、如何配置systemd?
  • 二、journalctl的用法
  • 三、系统日志
  • 四、系统日志限制
  • 总结



前言

服务器开发中,为了保证应用进程可靠性与稳定,防止机器宕机、进程crash导致进程不能故障后,不能恢复,因此监控进程状态尤为重要,CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来代替。systemd还包含了一个叫做journalctl的辅助组件,其主要作用是管理系统的事件日志记录。journalctl可以查看所有的系统日志文件,由于日志信息量很大,journalctl还提供了各种参数帮助用户更快速的定位到日志信息。


一、如何配置systemd?

Centos 上配置开机自启动的 3 种方式
方式一:直接在 / etc/rc.d/rc.local 中添加服务启动命令
方式二:通过 chkconfig 配置服务自启动
方式三:Centos7 通过 systemctl enble 配置服务开机自启动(中文讲解systemctl)

当我们提到systemctl就一定需要知道systemd,因为Linux 服务管理有两种方式service和systemctl。而systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动,systemd对应的进程管理命令就是systemctl。值得一提的是,systemctl命令兼容了service。

每一个 Unit都有一个配置文件,告诉 Systemd 怎么启动这个 Unit,Systemd 默认从目录/etc/systemd/system/读取配置文件,但是里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,其是真正的配置文件存放在那个目录。systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动

命令格式:
systemctl [command] [–type=TYPE] [–all]
配置如下,参考nginx.service配置

ln -s /opt/app/nginx/nginx.service /usr/lib/systemd/system/nginx.service;
    systemctl enable nginx;     #建立符号链接关系        
    systemctl start nginx;      #启动服务
    
	最终会生成两个链接地址:分别如下
	/etc/systemd/system/nginx.service
	/usr/lib/systemd/system/nginx.service
systemctl start nginx.service   #启动网络服务
systemctl stop nginx.service    #停止网络服务
systemctl restart nginx.service #重启网络服务
systemctl status nginx.serivce  #查看网络服务状态
systemctl mask nginx.serivce    #注销网络服务
systemctl unmask nginx.serivce  #取消注销网络服务
systemctl is-active network.service #查看服务是否启动
systemctl poweroff #系统关机
systemctl reboot   #重新启动

systemctl daemon-reload #因配置改动重新加载
systemctl list-dependencies module #查看模块依赖

nginx.service具体配置如下,具体可以网上找下参数含义,start_nginx.sh 为启动进程的脚本

[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
Restart=always
RestartSec=1
PIDFile=/opt/vplatform/nginx/logs/nginx.pid
ExecStartPre=/usr/bin/rm -f /opt/vplatform/nginx/logs/nginx.pid
ExecStartPre=/opt/vplatform/nginx/sbin/nginx -t
ExecStart=/opt/vplatform/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true

[Install]
WantedBy=multi-user.target

通过 tail /var/log/messages可以查看系统操作日志。
remote-fs.target 是一个特殊的目标单元,它表示所有的远程文件系统(例如通过 NFS、SMB 或 SSHFS 挂载的文件系统)都已经挂载完成。

nss-lookup.target 是 systemd 中的一个特殊目标单元,代表了基本的网络名称解析可以使用。这通常意味着 /etc/nsswitch.conf 中配置的所有服务都已经启动并可以使用。

network.target是一个systemd单元,代表系统网络服务的启动和停止。当该单元启动时,系统会启动所有的网络服务,包括网络接口、DNS解析器、网络安全等。当该单元停止时,所有网络服务都会被关闭。该单元通常在系统启动时自动启动,以确保网络服务可用。

local-fs.target 是 systemd 中的一个特殊 target,用于表示本地文件系统的挂载状态。它是一个虚拟的 target,不对应任何具体的服务或单元,但可以用来控制一组相关的服务或单元的启动顺序和依赖关系。local-fs.target 的作用是等待本地文件系统全部挂载完毕,然后再启动依赖于本地文件系统的服务。在启动过程中,systemd 会按照一定的顺序挂载本地文件系统,并在挂载完成后触发 local-fs.target。

二、journalctl的用法

CentOS系统中有两个日志服务,分别是传统的 rsyslog 和 systemd-journal

cypress 日志 systemctl日志_nginx

查看日志占用的磁盘空间;

journalctl --disk-usage

临时的清理日志,设置日志空间大小

journalctl --vacuum-size=500M     
journalctl --vacuum-time=1month

查看日志

journalctl -u talk -f
journalctl -u talk -n 20 --no-pager
journalctl -u talk -n 20 --no-pager --since today
journalctl -u talk -n 20 --no-pager --since "2020-08-26 05:25" --until "2020-08-26 05:30"
journalctl -u talk -n 20 --no-pager --since "5 minutes ago"
journalctl -u talk -n 20 --no-pager --since "2 hours ago"
journalctl -u talk -f -n 20 |grep -C50 over    //over 是待查字段

配置持久性容量500m,且重启日志不被清理
以System开头的选项用于限制磁盘使用量, 也就是 /var/log/journal 的使用量。 以Runtime开头的选项用于限制内存使用量, 也就是 /run/log/journal 的使用量

journalctl --vacuum-size=5000M 
mkdir /var/log/journal && chgrp systemd-journal /var/log/journal && chown 2775 /var/log/journal                
echo "SystemMaxUse=5000M" >> /etc/systemd/journald.conf && echo "ForwardToSyslog=no" >> /etc/systemd/journald.conf
systemctl restart systemd-journald.service

三、系统日志

Linux系统日志是记录了系统运行状态、程序运行情况以及系统事件的文件。它包含了各种级别的信息,从调试信息和错误报告到警告和系统事件等。Linux系统日志主要分为四个部分:内核日志、系统日志、安全日志和应用程序日志。

内核日志:记录了系统内核的运行状态和事件,例如系统启动和关机时间、硬件错误等。
系统日志:记录了系统服务和进程的运行情况,例如登录信息、网络连接等。
安全日志:记录了系统的安全事件,例如认证失败、攻击尝试等。
应用程序日志:记录了应用程序的运行状态和事件,例如数据库服务器的连接信息、Web服务器的请求信息等。
通过查看系统日志,管理员可以了解系统的状态和运行情况,诊断问题并进行故障排除。

/var/log/dmesg 内核引导信息日志
/var/log/message 标准系统错误信息日志
/var/log/maillog 邮件系统信息日志
/var/log/cron 计划任务日志
/var/log/secure 安全信息日志

查看标准系统日志
cat /var/log/messages |grep “Out of memory”
cat /var/log/messages |grep “Nov 15 14:18”
dmesg |grep “Out”

四、系统日志限制

经常发现内部日志频繁打印时,journalctl日志输出不完整,只有一部分,怀疑是journalctl最大缓存限制导致。
当系统中出现大量的日志消息时,为了避免日志过度占用系统资源,systemd-journald 会对日志消息的发送速率进行限制。RateLimitBurst 选项指定了在一个时间周期内最多可以发送的日志消息数量,单位是条/秒。例如,如果将 RateLimitBurst 设置为 1000,表示在一个时间周期内最多可以发送 1000 条日志消息。
当达到 RateLimitBurst 的限制时,systemd-journald 会暂时停止接收新的日志消息,直到时间周期结束。时间周期的长度由 RateLimitInterval 选项指定,默认为 30秒。
因此,如果您需要在短时间内发送大量的日志消息,可以将 RateLimitBurst 的值增加,以提高日志消息的发送速率。但是,需要注意的是,增加 RateLimitBurst 的值可能会导致系统资源被过度占用,因此需要根据实际情况进行调整。

在 /etc/systemd/journald.conf 文件中,RateLimitBurst 是一个控制日志消息发送速率的选项。因此可以修改此参数

cypress 日志 systemctl日志_nginx_02


方式1:不限制

RateLimitInterval=0

RateLimitBurst=0

方式2:增大条目
RateLimitBurst=30000

并重启解决
sudo systemctl restart systemd-journald

总结

通过上面的讲解大家应该清楚了systemctl与journalctl基本用法,更加高深的用法查找其他的资料!