程序部署方案
为了标准化程序部署,便于后续维护,每个待部署的程序需要准备以下几个文件
- systemd 服务配置文件
- firewalld 防火墙服务配置文件
Systemd 配置
创建 Systemd 服务
通常情况下,systemd 服务保存在/usr/lib/systemd/system/路径下。
创建并编辑文件/usr/lib/systemd/system/<服务名>.service:
bash
sudo nano /usr/lib/systemd/system/<服务名>.service编写以下内容:
ini
[Unit]
Description=服务描述
# 确保服务在其他某个服务或目标就绪之后执行,适用于需要顺序执行场景,通常需要网络的服务需要After=network.target
After=something/other/unit.target
# 断言路径存在,不存在则启动失败
AssertPathExists=/path/to/file
[Service]
# 运行服务时使用的账户
User=user
# 运行时使用的用户组
Group=group
# 服务程序运行时附加的环境变量
Environment=key=value
# 运行服务的方式
# simple 主进程启动就算启动完成
# notify 启动后能与 systemd 建立联系就算启动完成
# forking 服务程序是依靠fork完成启动的
Type=simple
# 服务运行时使用的命令
ExecStart=/path/to/executable
# 如果选择type为forking,需要告知systemd,其main process的pid是什么(通常服务程序会写入自己的pid到某个文件)
# PIDFile=/path/to/pid/file
# 服务运行时的工作目录
WorkingDirectory=/path/to/
# 当服务出现何种情况时,重新启动
# always: 任何情况下
# on-success: 成功结束时(exit code = 0)
# on-failure: 非预期退出码,意外终止,超时,触发看门狗,OOM
# on-abnormal: 和on-failure类似,不会在非预期退出码时重启
# on-abort: 仅在意外终止时
# on-watchdog: 仅在触发看门狗时
Restart=on-failure
# 需要重新启动时,等待的时长
RestartSec=5s
# 日志
# 标准输出重定向到journal
StandardOutput=journal
# 标准错误重定向到 journal
StandardError=journal
# journal 中给定的标识
SyslogIdentifier=your-identifier
[Install]
# enable 时,你期望服务在何种模式下自动启用
# multi-user.target: 多用户模式(正常的模式)
WantedBy=multi-user.target在服务创建完成后,需要通过以下命令重载配置文件:
bash
systemctl daemon-reload启动服务
在服务创建完成后,我们需要启动服务。 服务需要通过以下命令启动:
bash
systemctl start <服务名>NOTE
如果服务无法启动,且在 systemctl status <服务名> 中存在以下信息:
plain
Unable to locate executable '/path/to/executable': Permission denied则可以尝试临时关闭 SELinux:
bash
setenforce 0如果恢复正常,则问题出自 SELinux,可以尝试恢复 SELinux 安全上下文:
bash
restorecon -v /path/to/executable可以设置服务为开机启动:
bash
systemctl enable <服务名>Firewalld 配置
创建 Firewalld 服务
通常情况下,firewalld 服务保存在/etc/firewalld/services/路径下。
创建并编辑文件/etc/firewalld/services/<服务名>.xml:
IMPORTANT
服务名中不能包含.等不合法的符号。
bash
sudo nano /etc/firewalld/services/<服务名>.xml编写以下内容:
xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>服务名</short>
<description>服务描述</description>
<!-- 开放的端口 -->
<port protocol="tcp" port="8080"/>
</service>重新加载防火墙配置:
bash
firewall-cmd --complete-reload可以通过以下命令查看服务是否配置成功:
bash
firewall-cmd --get-services | grep <服务名>TIP
如果发现就连原有的自定义服务都消失了的话,可能是配置存在错误。 若要验证配置是否正确,可以使用此命令:
bash
firewall-offline-cmd --check-config配置防火墙规则
在配置完服务后,需要在激活的区域配置中启用服务。
查看当前活动的区域配置的方法是:
bash
firewall-cmd --get-active-zones可能返回以下内容
plain
public (default)
interfaces: eth0此时,这里的public就是活动区域。
在确认了活动区域后,通过以下命令来激活配置:
bash
firewall-cmd --zone=<活动区域> --add-service=<服务名> --permanent重新加载防火墙配置:
bash
firewall-cmd --complete-reload