这是建站与 CMS 方向的收官篇。回顾一下这个系列走过的路:装 Nginx、上证书、做缓存优化、加固 SSH、立防火墙、配 WAF。每次新开一台服务器,这些动作都要手工重来一遍——第二遍你还记得住,第三遍开始必然漏步骤,而安全配置漏一步就是裸奔。这篇把整条流水线收进一个 setup.sh:脚本化的最大收益不是快,是**每次执行都完整、都不走样**。这也是整个系列的最终形态:方法变成脚本,脚本沉淀成能力。
脚本分四段,对应系列的四组动作:系统初始化、安全加固、Web 环境、服务启动。先看骨架和第一段:
#!/bin/bash
# setup.sh —— 新服务器初始化(Ubuntu 22.04/24.04)
# 用法: sudo bash setup.sh yourdomain.com
set -euo pipefail # 出错即停,变量未定义即报错
DOMAIN=$1
log() { echo "[$(date +%H:%M:%S)] $1"; }
# ===== 第一段:系统初始化 =====
log "更新系统并装基础工具"
apt update && apt upgrade -y
apt install -y curl ufw fail2ban unattended-upgrades netdata
# 时区和时间同步(日志时间错乱是排查噩梦)
timedatectl set-timezone Asia/Shanghai
timedatectl set-ntp true
第二段是安全加固,把《SSH加固两板斧:密钥登录+fail2ban,让爆破脚本空手而归》和《UFW防火墙十分钟入门:先立规则再开门,别把自己锁外面》的动作固化。注意脚本里保留了人工检查点——关键步骤脚本只做准备,确认留给人:
# ===== 第二段:安全加固 =====
log "防火墙:先放行后开启(《UFW防火墙十分钟入门:先立规则再开门,别把自己锁外面》铁律)"
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp comment 'SSH'
ufw allow 80,443/tcp comment 'Web'
ufw --force enable
log "fail2ban 基础配置(《SSH加固两板斧:密钥登录+fail2ban,让爆破脚本空手而归》)"
cat > /etc/fail2ban/jail.local << 'EOF'
[sshd]
enabled = true
maxretry = 5
findtime = 600
bantime = 3600
bantime.increment = true
EOF
systemctl enable --now fail2ban
log "SSH加固(《SSH加固两板斧:密钥登录+fail2ban,让爆破脚本空手而归》)——只关密码登录,密钥确认后手工收尾"
# 脚本故意不改sshd端口、不直接关密码认证:
# 必须人工确认密钥能登录后再执行,防自锁
echo ">>> 请先确认: 新开终端用密钥登录成功后,再手动执行"
echo ">>> sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config && systemctl reload sshd
第三段装 Web 环境并按系列规范配置:
# ===== 第三段:Web环境 =====
log "LNMP安装(《Nginx 装好了只会看欢迎页:手把手部署你的第一个站点》《PHP 版本升级:8.2 系今年底停更,别让站点跑在悬崖边上》)"
apt install -y nginx mysql-server php8.3-fpm php8.3-mysql \
php8.3-curl php8.3-gd php8.3-xml php8.3-mbstring php8.3-opcache
log "性能配置落地(《Nginx开启gzip和静态资源缓存:两条配置让PageSpeed涨30分》《OPcache调优:一行php -m查缺失,六个参数把PHP提速一倍》《MySQL起步调优四个参数:buffer_pool给足,慢查询日志先开》)"
# gzip
cat > /etc/nginx/conf.d/perf.conf << 'EOF'
gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_vary on;
gzip_types text/css application/javascript application/json image/svg+xml;
EOF
# logrotate规则(《logrotate日志轮转:磁盘满的病根在日常,一次配置管三年》)
cat > /etc/logrotate.d/myapp << 'EOF'
/var/www/*/logs/*.log {
daily
rotate 14
compress
missingok
notifempty
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
EOF
log "数据库安全初始化(《备份不是拷个压缩包完事:一套能救命的最小备份体系》备份目录一并建好)"
mysql -e "DELETE FROM mysql.user WHERE User='';"
mkdir -p /var/backups/mysql
nginx -t && systemctl reload nginx
第四段收尾验证,逐项打勾:
# ===== 第四段:验证清单 =====
log "验证"
nginx -t # 配置语法
systemctl is-active nginx php8.3-fpm mysql fail2ban netdata
ufw status | head -5 # 防火墙规则
fail2ban-client status sshd # fail2ban活了
curl -sI http://localhost | head -3 # Web入口通了
log "脚本部分完成。剩余人工步骤:"
echo " 1. 密钥确认后关闭SSH密码登录(《SSH加固两板斧:密钥登录+fail2ban,让爆破脚本空手而归》)"
echo " 2. certbot签发证书(《HTTPS 免费证书实战:Certbot 十分钟搞定,续期全自动》): certbot --nginx -d $DOMAIN"
echo " 3. netdata面板绑回环+告警通知(《netdata一键装监控:每秒级仪表盘配告警,出事先于用户知道》)"
echo " 4. 备份cron与恢复演练(《备份不是拷个压缩包完事:一套能救命的最小备份体系》)"
echo " 5. 首个站点部署(《Nginx 装好了只会看欢迎页:手把手部署你的第一个站点》《WordPress 从下载到后台:一条干净路线,不抄广告教程》)"
echo " 6. 免费计划WAF与安全头(《Cloudflare免费CDN接入全流程:橙云一开,源站IP从此隐身》《WAF入门:免费计划里就有的托管规则,先把wp-login封一半》《安全响应头补齐战:CSP、X-Frame-Options一次配到位》,面板操作)"
脚本本身的存放和版本管理也有讲究。setup.sh 连同 compose 文件、各配置模板一起放进一个私有 Git 仓库(GitHub 私库或自建 Gitea 都行),每次改进提交留痕——三个月后你想不起某台机器当初为什么这么配,仓库历史就是答案。两个红线:密码绝不进仓库(用 .env 或运行时输入,.gitignore 写明白);仓库里放一份 README 记录每台服务器用了哪个版本、哪次执行的——多台机器环境漂移时,这份账最重要。另外注意幂等性:脚本重复执行要安全,apt 装过的包会跳过,ufw --force enable 重复无害,但 mysqldump 之类的动作别往初始化脚本里放,初始化和日常运维(crontab)分开两套脚本,边界就清楚。
关于这套脚本的正确使用姿势,说三点。第一,它不是按一下就完的黑盒子:刻意保留人工检查点是设计而不是偷懒——SSH 密码认证的关闭、证书签发这类“出错就自锁”的操作,脚本只提醒不代劳,宁可多花十分钟人工确认,不要一次自动失误把自己锁在服务器外面。第二,脚本要随系列迭代:你在某篇里学到了新的加固动作,就把它加进对应段落,让 setup.sh 成为整个建站知识体系的“可执行摘要”。第三,建议配一个 setup-checklist.md 放在同一目录,脚本跑完照着人工清单走一遍,两条腿走路。脚本的终极检验标准很简单:找一台全新的机器,从开机到第一个站点上线,只看脚本和清单、不翻系列文章,能在半小时内做到生产级——做到了,这个方向三十篇的功夫就算真正落袋。
── 延伸阅读 · 建站与CMS系列总目录(按 setup.sh 执行顺序)──
▍从零到上线
《Nginx 装好了只会看欢迎页:手把手部署你的第一个站点》
《HTTPS 免费证书实战:Certbot 十分钟搞定,续期全自动》
《WordPress 从下载到后台:一条干净路线,不抄广告教程》
《固定链接一改文章页全 404:Nginx 伪静态一次配对》
《PHP 版本升级:8.2 系今年底停更,别让站点跑在悬崖边上》
▍性能与安全加固
《Nginx开启gzip和静态资源缓存:两条配置让PageSpeed涨30分》
《WordPress页面缓存怎么选:插件格局2026盘点,附Nginx原生方案》
《OPcache调优:一行php -m查缺失,六个参数把PHP提速一倍》
《MySQL起步调优四个参数:buffer_pool给足,慢查询日志先开》
《SSH加固两板斧:密钥登录+fail2ban,让爆破脚本空手而归》
《Cloudflare免费CDN接入全流程:橙云一开,源站IP从此隐身》
《WAF入门:免费计划里就有的托管规则,先把wp-login封一半》
《SSL Labs冲A+:Mozilla配置生成器抄作业,HSTS加TLS1.3一步到位》
▍进阶运营
《netdata一键装监控:每秒级仪表盘配告警,出事先于用户知道》
《logrotate日志轮转:磁盘满的病根在日常,一次配置管三年》
《自动安全更新:unattended-upgrades配好,补丁不用你追》
《一机多站组织术:server块规范化、独立FPM池、权限隔离》
《安全响应头补齐战:CSP、X-Frame-Options一次配到位》
《Docker跑WordPress:compose一键起LNMP,换服务器就是换个目录》
申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!
