背景
CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,而systemctl的使用也使得以往系统服务的/etc/init.d的启动脚本的方式就此改变,也大幅提高了系统服务的运行效率。但服务的配置和以往也发生了极大的不同,说实在的,变的简单而易用了许多。
背景生产环境中采用nginx + uwsgi + django 来部署web服务,这里需要实现uwsgi的启动和停止,简单的处理方式可以直接在命令行中启动和kill掉uwsgi服务,但为了更安全、方便的管理uwsgi服务,配置uwsgi到systemd服务中,同时实现开启自启的功能;
另,鉴于supervisor不支持python3,没采用supervisor来管理uwsgi服务;
文件配置
uwsgi
*.service 配置
创建配置文件:
/etc/systemd/system/server_uwsgi.service
填入以下内容
[Unit]
Description=HTTP Interface Server
After=syslog.target
[Service]
KillSignal=SIGQUIT
#uwsgi.ini文件是你项目下的uwsgi.ini
ExecStart=/usr/bin/uwsgi --ini /path/uwsgi.ini
Restart=always
Type=notify
NotifyAccess=all
StandardError=syslog
[Install]
WantedBy=multi-user.target
可以使用 whereis 查看uwsgi 位置
将该服务加入到systemd中
systemctl enable /etc/systemd/system/server_uwsgi.service
然后就可以通过systemctl来控制服务的启停
systemctl stop server_uwsgi.service 关闭uwsgi服务
systemctl start server_uwsgi.service 开启uwsgi服务
systemctl restart server_uwsgi.service 重启uwsgi服务
注意事项:
如果uwsgi配置文件中配置了 daemonize=/path/uwsgi.log (uwsgi服务以守护进程运行)
会导致sytemctl启动时多次重启而导致启动失败
需改为 logto=/path/uwsgi.log
如果你单独执行,并且项目的uwsgi.ini配置文件中设置了logto【daemonize就不用看了】需要执行uwsgi -d --ini uwsgi.ini。这就在后台运行了。
Created symlink from /etc/systemd/system/multi-user.target.wants/nx_uwsgi.service to /etc/systemd/system/nx_uwsgi.service.
补充:
添加到服务
# 重载系统服务,因添加了 server_uwsgi.service
sudo systemctl daemon-reload
# 启动 uwsgi
sudo systemctl start uwsgi
# 停止 uwsgi
sudo systemctl stop uwsgi
# 查看 uwsgi 状态
sudo systemctl status uwsgi
# 设置开机启动
sudo systemctl enable uwsgi
# 取消开机启动
sudo systemctl disable uwsgi
#查看所有已启动的服务
sudo systemctl list-units --type=service
uwsgi 配置
[uwsgi]
# 监听端口
socket = 127.0.0.1:9090
#socket = 127.0.0.1:3031
# 运行状态
#stats = 127.0.0.1:9191
# 工作路径
chdir = /root/yzq/djangos/blog
# django wsgi 路径 (不与nginx 联系)
wsgi-file = /root/yzq/djangos/blog/joyoo/wsgi.py
# nginx 联系
# module = Joyo.wsgi
# python 虚拟环境路径
virtualenv = /root/.virtualenvs/joyoo
# uwsig pid 号
pidfile = /root/yzq/running/uwsgi_joyoo.pid
# 重启的时候使用的 pid 号
touch-reload = /root/yzq/running/uwsgi_joyoo.pid
# post 请求超过 字节 就缓存值磁盘
post-buffering = 8192
# 缓冲区大小
buffer-size = 32768
# 设置进程 processes 和 workers 一样的意思
# processes = 2
workers = 2
# 每个进场下面的线程数
threads = 4
# 未使用 systemd 时日志文件,会一直保持在后台,使用 docker 应该使用 logto
# daemonize = /root/yzq/logs/uwsgi_joyoo.log
# 使用 systemd 时 日志文件
logto = /root/yzq/logs/uwsgi_joyoo.log
# 设置平滑启动 (处理完接受到的请求) 的等待时间(秒)
reload-mercy = 10
# 设置工作进程使用虚拟内存超过 MB 就回收重启
reload-on-as = 1024
# python 文件修改后自动重启
py-autoreload = 1
# 设置一个请求超时(秒),就丢弃掉
harakiri = 60
# 当一个请求被 harakiri 掉,输出一条日志
harakiri-verbose = true
*.service参数解释
配置文件解释如下:
[Unit] ===> 服务的说明
Description:描述服务
After:描述服务类别
[Service] ===> 服务运行参数的设置
Type=forking:是后台运行的形式
ExecStart:为服务的具体运行命令
ExecReload:为重启命令
ExecStop:为停止命令
PrivateTmp=True:表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install] ===> 服务安装的相关设置,可设置为多用户
服务脚本也可以,以754的权限保存在/usr/lib/systemd/system目录下
nginx
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
# nginx 的路径
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
命令:
systemctl enable nginx.service
#就会在/etc/systemd/system/multi-user.target.wants/目录下新建一个/etc/systemd/system/nginx.service 文件的链接。
查看日志
[root@iZ2zeb system]# journalctl -f -u nginx.service
-- Logs begin at Wed 2021-06-23 11:33:27 CST. --
8月 09 17:48:13 iZ2zeb4a0aarg9whwtql83Z systemd[1]: nginx.service: Unit cannot be reloaded because it is inactive.
8月 09 17:49:13 iZ2zeb4a0aarg9whwtql83Z systemd[1]: Starting The nginx HTTP and reverse proxy server...
8月 09 17:49:13 iZ2zeb4a0aarg9whwtql83Z nginx[28509]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
8月 09 17:49:13 iZ2zeb4a0aarg9whwtql83Z nginx[28509]: nginx: configuration file /etc/nginx/nginx.conf test is successful
8月 09 17:49:13 iZ2zeb4a0aarg9whwtql83Z systemd[1]: Started The nginx HTTP and reverse proxy server.
8月 11 09:41:58 iZ2zeb4a0aarg9whwtql83Z systemd[1]: /etc/systemd/system/nginx.service:1: Missing '='.
8月 11 09:42:21 iZ2zeb4a0aarg9whwtql83Z systemd[1]: nginx.service: Succeeded.
8月 11 09:42:57 iZ2zeb4a0aarg9whwtql83Z systemd[1]: /etc/systemd/system/nginx.service:1: Missing '='.
参数详细解释
[Unit]
Description : 服务的简单描述
Documentation : 服务文档
Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。
[Service]
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认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload:指定单元停止时执行的命令或者脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
PrivateTmp:True表示给服务分配独立的临时空间
Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的值为假,这个选项只有在Type=oneshot时需要被配置。
[Install]
Alias:为单元提供一个空间分离的附加名字。
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also:指出和单元一起安装或者被协助的单元。
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。
服务权限
systemd有系统和用户区分;系统(/user/lib/systemd/system/)、用户(/etc/lib/systemd/user/).一般系统管理员手工创建的单元文件建议存放在/etc/systemd/system/目录下面。
参考:https://blog.csdn.net/lishuoboy/article/details/89925957
centos8.4 系统nginx样例
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Ubuntu 22.04.4 /lib/systemd/system/nginx.service
# Stop dance for nginx
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the nginx process.
# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
来源:https://blog.csdn.net/w710537643/article/details/118419504