1.
准备工作与前提条件
- 确认服务器操作系统(Debian/Ubuntu/CentOS/RHEL)。- 拥有可 SSH 登录的管理账号(root 或 sudo 权限)。- 在本地准备 SSH 私钥并将公钥加入服务器 ~/.ssh/authorized_keys。- 确认服务器可访问互联网并开放 22/80/443 端口(或按需修改)。
2.
设置时区与语言(德区最佳实践)
- 设置时区:sudo timedatectl set-timezone Europe/Berlin。- 设置系统语言与 locale:sudo apt-get install -y locales (Debian/Ubuntu),然后 sudo locale-gen de_DE.UTF-8 && sudo update-locale LANG=de_DE.UTF-8。- 重启会话:exit 再重连,确保 locale 与时区生效(date / locale 命令验证)。
3.
基础安全与用户管理
- 创建非 root 管理用户并赋予 sudo:sudo adduser deploy && sudo usermod -aG sudo deploy。- 上传 SSH 公钥:mkdir -p /home/deploy/.ssh && echo "你的公钥" >> /home/deploy/.ssh/authorized_keys && chown -R deploy:deploy /home/deploy/.ssh && chmod 700 /home/deploy/.ssh && chmod 600 /home/deploy/.ssh/authorized_keys。- 可选:编辑 /etc/ssh/sshd_config 禁用密码登录 PasswordAuthentication no,随后 sudo systemctl restart sshd。
4.
写自动化脚本的总体结构(Bash 示例)
- 建议文件名 install_stack.sh,开头加 set -euo pipefail 并记录日志。- 基本部分:检测发行版、更新包索引、安装依赖、配置时区/locale、安装目标软件、生成 TLS、启用并启动服务、清理。- 示例头部:
#!/bin/bash
set -euo pipefail
OS="$(. /etc/os-release && echo $ID)"
5.
实际安装 Nginx 与常用组件(Debian/Ubuntu 示例)
- 更新并安装:
sudo apt-get update && sudo apt-get install -y nginx certbot python3-certbot-nginx ufw。- 启动并开机自启:sudo systemctl enable --now nginx。- 验证:curl -I http://localhost 查看 200/301。
6.
自动化配置 Nginx 虚拟主机与站点目录
- 在脚本中创建目录:mkdir -p /var/www/example.com/html && chown -R www-data:www-data /var/www/example.com。- 生成最小 server 块文件:/etc/nginx/sites-available/example.com,内容指定 root、server_name、proxy_pass 等。- 激活站点并重载:ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ && nginx -t && systemctl reload nginx。
7.
自动申请与续期 Let’s Encrypt 证书(Certbot)
- Certbot 自动化:certbot --nginx -d example.com -d www.example.com --non-interactive --agree-tos -m admin@example.com。- 在脚本中检查 certbot 返回码并在成功时设置 crontab(或 systemd timer)确保证书续期:echo "0 3 * * * /usr/bin/certbot renew --quiet" | crontab -u root -。
8.
防火墙与网络规则(UFW/iptables)
- UFW (Debian/Ubuntu)示例:ufw allow OpenSSH && ufw allow 'Nginx Full' && ufw --force enable。- 如果使用 iptables,则在脚本中添加持久化规则并安装 iptables-persistent:sudo apt-get install -y iptables-persistent。
9.
安装数据库与应用依赖(示例:MySQL / PostgreSQL)
- 安装 MySQL:sudo apt-get install -y mysql-server && sudo systemctl enable --now mysql。- 在脚本中通过 mysql_secure_installation 自动化基本安全(或使用 SQL 脚本重设 root 密码、移除匿名用户、删除测试库)。- 创建应用专用数据库与用户:mysql -e "CREATE DATABASE appdb; CREATE USER 'app'@'localhost' IDENTIFIED BY '密码'; GRANT ALL PRIVILEGES ON appdb.* TO 'app'@'localhost'; FLUSH PRIVILEGES;"
10.
服务管理与 systemd 单元文件
- 若需运行自定义后台程序,建议写 systemd 单元:/etc/systemd/system/myapp.service,示例包含 ExecStart、Restart、User。- 在脚本中使用 systemctl daemon-reload && systemctl enable --now myapp 来启用服务并验证日志:journalctl -u myapp -f。
11.
日志、监控与备份策略
- 指定日志位置并使用 logrotate:/etc/logrotate.d/myapp,示例每周轮转并保留 4 份。- 建议配置简单的监控(如 node-exporter + Prometheus)或使用 cloud provider 的监控服务。- 备份数据库与应用文件:在脚本中添加定时任务,使用 mysqldump + rsync 同步到外部存储(S3、FTP 等)。
12.
部署脚本完整示例片段与执行方式
- 示例运行:scp install_stack.sh root@server:/root && ssh root@server 'bash /root/install_stack.sh'。- 脚本片段示例(简化):
if [ "$OS" = "ubuntu" ]; then apt-get update; apt-get install -y nginx certbot; fi。- 在脚本中添加错误处理、输出日志到 /var/log/install_stack.log 并在失败时回滚关键步骤(删除已创建的用户、配置文件)。
13.
常见问题诊断与调试步骤
- SSH 无法登录:检查安全组/防火墙、sshd 服务、authorized_keys 权限。- Nginx 报错:nginx -t 查看配置语法,查看 /var/log/nginx/error.log。- Certbot 失败:确认域名 DNS 已指向服务器公网 IP,HTTP(80) 必须可达以完成 HTTP-01 验证。
14.
问:脚本如何兼容不同 Linux 发行版(Debian vs CentOS)?
- 答:在脚本开头检测发行版(/etc/os-release),根据 ID 值分支执行不同包管理器命令(apt-get vs yum/dnf)、不同服务管理包名与路径;把公共逻辑(创建用户、配置时区、写 systemd 文件)抽象为函数,按需调用。
15.
问:自动化过程中如何确保安全性(密钥与秘密管理)?
- 答:不要把密码明文写入脚本,使用环境变量或外部密钥管理(HashiCorp Vault、云 KMS 等);脚本运行时从安全凭证仓库拉取;对敏感文件设置严格权限;在 CI/CD 中使用受限变量并定期轮换密钥。
16.
问:如果安装失败如何回滚或恢复服务器到初始状态?
- 答:在脚本中实现幂等与事务式步骤:每步执行前做状态检测并记录成功标记(/var/log/install_markers),失败时执行逆操作(停止服务、删除配置、还原数据库快照)。若无自动回滚,可用最近快照/备份恢复完整系统。
来源:自动化脚本实现德国服务器软件下载安装与配置流程