这是一个非常好的问题,也是部署流程中的关键细节。正确的顺序是:
先使用 root 安装软件,再创建专属用户进行配置和运行。
详细流程说明
让我用一个更直观的流程图来说明整个部署过程:
flowchart TD
A[开始部署] --> B[使用 root 安装软件]
B --> C[创建专属用户和组]
C --> D[创建目录并设置权限]
D --> E[配置文件调整]
E --> F[创建 systemd 服务]
F --> G[使用专属用户启动服务]
G --> H[验证和测试]
为什么要这个顺序?
-
安装阶段需要 root 权限:
- 安装软件通常需要向系统目录写入文件(如
/usr/local) - 需要设置全局的符号链接
- 需要安装系统级的依赖包
- 安装软件通常需要向系统目录写入文件(如
-
运行阶段需要降权:
- 日常运行时,服务不应该拥有 root 权限
- 遵循"最小权限原则"
具体操作步骤
阶段一:使用 root 安装(部署基础)
# 1. 安装 JDK
yum install java-11-openjdk-devel # CentOS/RHEL
# 或
apt install openjdk-11-jdk # Ubuntu/Debian
# 2. 安装 MySQL
# 方式1: 使用包管理器
yum install mysql-server
# 方式2: 下载官方二进制包解压(此时还是用root)
tar -xzf mysql-8.0.xx.tar.gz -C /usr/local/
cd /usr/local && ln -s mysql-8.0.xx mysql
# 3. 安装 Redis
yum install redis
# 或从源码编译
tar -xzf redis-7.0.x.tar.gz
cd redis-7.0.x && make && make install
# 4. 安装 Nginx
yum install nginx
# 或从源码编译
tar -xzf nginx-1.20.x.tar.gz
cd nginx-1.20.x && ./configure --prefix=/usr/local/nginx && make && make install
阶段二:创建专属用户和目录(安全加固)
现在创建我们之前讨论的专属用户和目录:
# 创建用户组和用户
groupadd -r mysql-group
useradd -r -g mysql-group -s /bin/false -d /usr/local/mysql mysql-user
groupadd -r redis-group
useradd -r -g redis-group -s /bin/false -d /var/lib/redis redis-user
groupadd -r nginx-group
useradd -r -g nginx-group -s /bin/false -d /usr/local/nginx nginx-user
groupadd -r app-group
useradd -r -g app-group -s /bin/false -d /opt/your-java-app app-user
# 创建数据/日志目录并授权
mkdir -p /usr/local/mysql/{data,logs,conf}
chown -R mysql-user:mysql-group /usr/local/mysql
chmod -R 750 /usr/local/mysql
mkdir -p /var/lib/redis /usr/local/redis/{logs,conf}
chown -R redis-user:redis-group /var/lib/redis /usr/local/redis
mkdir -p /usr/local/nginx/{logs,conf,html,cache}
chown -R nginx-user:nginx-group /usr/local/nginx
阶段三:配置和启动(以最小权限运行)
现在使用 root 来配置,但指定服务以专属用户运行:
以 MySQL 为例:
# 使用root初始化数据目录,但指定运行用户
mysqld --initialize --user=mysql-user --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 修改配置文件指定用户
echo "[mysqld]
user=mysql-user
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock" > /usr/local/mysql/conf/my.cnf
# 创建systemd服务(root操作)
cat > /etc/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server
[Service]
User=mysql-user
Group=mysql-group
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/conf/my.cnf
[Install]
WantedBy=multi-user.target
EOF
# 启动服务(实际运行时以mysql-user身份)
systemctl daemon-reload
systemctl start mysqld
阶段四:部署 Java 应用
# 1. 使用root创建应用目录
mkdir -p /opt/your-java-app/{logs,config,lib}
# 2. 上传你的jar包(root操作)
cp your-app.jar /opt/your-java-app/
# 3. 修改所有者(关键步骤!)
chown -R app-user:app-group /opt/your-java-app
# 4. 创建systemd服务
cat > /etc/systemd/system/your-app.service << EOF
[Unit]
Description=Your Java Application
[Service]
User=app-user
Group=app-group
WorkingDirectory=/opt/your-java-app
ExecStart=/usr/bin/java -jar /opt/your-java-app/your-app.jar
[Install]
WantedBy=multi-user.target
EOF
# 5. 启动服务(以app-user身份运行)
systemctl daemon-reload
systemctl start your-app
关键检查点
完成部署后,验证服务是否以正确用户运行:
# 检查进程运行用户
ps aux | grep mysql # 应该显示 mysql-user
ps aux | grep redis # 应该显示 redis-user
ps aux | grep nginx # worker进程应该显示 nginx-user
ps aux | grep java # 应该显示 app-user
# 检查文件和目录权限
ls -ld /usr/local/mysql/data/
ls -ld /var/lib/redis/
ls -ld /opt/your-java-app/
# 这些都应该是对应的专属用户,而不是root
总结
记住这个原则:
- 安装阶段:root 权限(因为需要系统级操作)
- 运行阶段:专属用户权限(为了安全合规)
这样的部署流程既满足了软件安装的技术要求,又符合二级等保的安全规范,是专业的做法。