首页
Linux常用
docker常用
关于
Search
1
docker安装MDCX
286 阅读
2
iStoreOS上使用WireGuard
234 阅读
3
麒麟KylinV10离线下载安装包及安装
223 阅读
4
麒麟v10系统openssh升级OpenSSH_10.0p2-OpenSSL 3.4.2
93 阅读
5
UNRAID增加和缩小虚拟机虚拟磁盘大小
73 阅读
默认分类
docker
容器安装
Linux
数据库
群辉
软路由
unRAID
PVE
Nginx
Tomcat
wow
杂项
图床
飞牛
转载微信公众号文章
Docker学习
Linux学习
硬件
登录
Search
标签搜索
nginx
数据库
unraid
PVE
麒麟
dockerfile
同步
wow服务器
装机硬件
宏
v2ray
直通
电视盒子
相册
黑裙7.0.1
远程穿透
定时
ssh
emby
symlink
奥黛丽·逐爱者
累计撰写
136
篇文章
累计收到
7
条评论
首页
栏目
默认分类
docker
容器安装
Linux
数据库
群辉
软路由
unRAID
PVE
Nginx
Tomcat
wow
杂项
图床
飞牛
转载微信公众号文章
Docker学习
Linux学习
硬件
页面
Linux常用
docker常用
关于
搜索到
38
篇与
默认分类
的结果
2026-05-22
【第23期】Linux系统初始化脚本:从裸机到生产级的一键方案
做运维这么多年,我见过太多这样的场景:新服务器到货,上架装好系统,丢那儿就不管了。等到业务跑上去,三天两头出状况——SSH被爆破、OOM被杀进程、磁盘写满没人管、连接数爆了服务直接挂。回过头一问:系统装完之后,你做了什么初始化?对方一脸茫然:装完不就用了么? 这就是问题所在。一个裸装的 Linux 系统,说白了就是一间毛坯房——能住人,但住得不舒服,也不安全。今天这篇,我就把这套压箱底的初始化脚本完整分享出来。从安全加固到性能调优,再到常用软件的自动化部署,一键跑完,你的系统就直接达到生产标准。 适用范围:CentOS 7/8/9、Rocky Linux、AlmaLinux、Ubuntu 20.04/22.04/24.04、Debian 11/12。脚本里会自动识别发行版,不用你操心。一、安全加固:别让服务器裸奔 安全这事儿,怎么强调都不为过。我见过一台新服务器,从装好系统到被黑客拿下,只用了不到48小时。攻击者扫到了默认22端口,用弱口令字典暴力破解,进去之后直接装了挖矿程序。等我们发现的时候,CPU已经满载跑了一个星期。 所以第一步,先把门焊死。 1.1 SSH 加固 SSH 是服务器的第一道门,也是最容易被盯上的一扇门。默认配置下,它几乎就是在向攻击者招手:端口22、允许root登录、密码认证。改起来其实很简单: # 备份原始配置 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 修改关键参数 sed -i 's/^#\?Port 22/Port 2222/' /etc/ssh/sshd_config sed -i 's/^#\?PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/^#\?PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config sed -i 's/^#\?X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config sed -i 's/^#\?MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config sed -i 's/^#\?LoginGraceTime 2m/LoginGraceTime 30/' /etc/ssh/sshd_config # 追加禁止空密码 echo 'PermitEmptyPasswords no' >> /etc/ssh/sshd_config # 重启生效 systemctl restart sshd 几个要点挨个说: • 改端口:把22改成2222(或者随便一个高位端口)。这不是什么高级安全手段,但能挡住90%以上的自动化扫描。那些扫22端口的脚本,可不会傻到从1扫到65535。 • 禁止 root 直登:这是铁律。先用普通用户登录,再 su 或 sudo 提权。就算密码泄露了,攻击者拿到的也是个低权限账号。 • 关闭密码认证:改用密钥登录。密钥的强度远比密码靠谱,而且丢了可以立刻吊销。 • 最大尝试次数:从6降到3,减少暴力破解的时间窗口。配合后面的 fail2ban,基本就把SSH爆破这条路堵死了。 1.2 配置密钥登录 禁用密码之前,得先配好密钥。不然把自己锁在外面,那可真叫一个尴尬: # 生成密钥对(本地电脑执行) ssh-keygen -t ed25519 -C "admin@company.com" # 复制公钥到服务器 ssh-copy-id -p 2222 user@server_ip # 验证密钥登录(关闭密码认证前务必测试!) ssh -p 2222 user@server_ip 这里推荐用 ed25519 算法,比传统的 RSA 更快更安全,密钥也更短。RSA 当然也能用,但已经是上一代方案了。 1.3 防火墙配置 防火墙不是万能的,但没有防火墙是万万不能的。很多人觉得云服务器有安全组就够了,这话没错,但主机层面的防火墙是最后一道防线。安全组是云厂商层面的,万一配置出错呢?多层防御总归更靠谱。 CentOS/RHEL 系列用 firewalld,Ubuntu/Debian 用 ufw: # CentOS/RHEL - firewalld systemctl enable firewalld systemctl start firewalld firewall-cmd --permanent --remove-service=ssh firewall-cmd --permanent --add-port=2222/tcp firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" accept' firewall-cmd --reload # Ubuntu/Debian - ufw apt install -y ufw ufw default deny incoming ufw default allow outgoing ufw allow 2222/tcp ufw allow 80/tcp ufw allow 443/tcp ufw allow from 10.0.0.0/8 ufw --force enable 这里有个很实用的技巧:允许内网段(比如 10.0.0.0/8)的全部流量。这样内网服务器之间通信不受限制,但来自外网的访问只能走开放的几个端口。 1.4 用户与权限管理 一个新系统,第一件事就是创建管理用户。永远不要用 root 跑业务,这不是建议,是规定: # 创建管理用户 useradd -m -s /bin/bash admin # 设置强密码(16位以上,包含大小写、数字、特殊字符) passwd admin # 添加到 wheel/sudo 组 usermod -aG wheel admin # CentOS/RHEL usermod -aG sudo admin # Ubuntu/Debian # 配置 sudo 免密码(可选,仅限密钥登录场景) echo 'admin ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/admin chmod 440 /etc/sudoers.d/admin # 锁定不需要的系统账号 for user in games lp news uucp proxy list irc gnats; do usermod -L $user 2>/dev/null done 密码策略也得配上。别指望用户自觉设置强密码,用 pam_pwquality 模块强制要求: # 密码复杂度策略 echo 'minlen=12' >> /etc/security/pwquality.conf echo 'minclass=3' >> /etc/security/pwquality.conf echo 'maxrepeat=3' >> /etc/security/pwquality.conf echo 'difok=5' >> /etc/security/pwquality.conf # 密码过期策略 sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 7/' /etc/login.defs sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN 12/' /etc/login.defs sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 14/' /etc/login.defs • minlen=12:密码最少12位 • minclass=3:至少包含3种字符类型(大写、小写、数字、特殊字符) • maxrepeat=3:不允许同一个字符连续出现3次以上 • difok=5:新密码必须与旧密码至少5个字符不同 • PASS_MAX_DAYS=90:密码90天强制更换 1.5 安装 fail2ban fail2ban 是个好东西。它监控日志文件,发现某个 IP 在短时间内多次认证失败,就直接把它拉进防火墙黑名单。简单、粗暴、有效: # CentOS/RHEL yum install -y epel-release yum install -y fail2ban # Ubuntu/Debian apt install -y fail2ban # 配置 cat > /etc/fail2ban/jail.local << 'EOF' [DEFAULT] bantime = 3600 findtime = 600 maxretry = 3 banaction = firewallcmd-ipset [sshd] enabled = true port = 2222 maxretry = 3 bantime = 86400 findtime = 300 EOF systemctl enable fail2ban systemctl start fail2ban 配置里的参数含义很简单:600秒内失败3次,封禁24小时。这招对付SSH爆破特别管用,日志里能看到大量被ban的IP,心里踏实。 1.6 系统安全基线 还有一些系统级别的安全设置,不起眼但很关键: # 禁止 Ctrl+Alt+Del 重启 systemctl mask ctrl-alt-del.target # 限制 su 命令只能被 wheel 组使用 sed -i 's/^#\?auth.*pam_wheel.so/\auth\trequired\tpam_wheel.so use_uid/' /etc/pam.d/su # 设置 umask echo 'umask 027' >> /etc/profile echo 'umask 027' >> /etc/bashrc # 锁定关键文件防止篡改 chattr +i /etc/passwd /etc/shadow /etc/group /etc/gshadow # 注意:如果需要添加用户,需要先 chattr -i 解锁 # 历史命令记录增强 echo 'export HISTSIZE=10000' >> /etc/profile echo 'export HISTFILESIZE=20000' >> /etc/profile echo 'export HISTTIMEFORMAT="%F %T "' >> /etc/profile echo 'export PROMPT_COMMAND="history -a"' >> /etc/profile # 禁用不用的文件系统模块 echo 'install cramfs /bin/true' >> /etc/modprobe.d/disablefs.conf echo 'install freevxfs /bin/true' >> /etc/modprobe.d/disablefs.conf echo 'install jffs2 /bin/true' >> /etc/modprobe.d/disablefs.conf echo 'install hfs /bin/true' >> /etc/modprobe.d/disablefs.conf echo 'install hfsplus /bin/true' >> /etc/modprobe.d/disablefs.conf echo 'install squashfs /bin/true' >> /etc/modprobe.d/disablefs.conf echo 'install udf /bin/true' >> /etc/modprobe.d/disablefs.conf 那个 chattr +i 要注意,锁定之后连 root 都不能修改这些文件。需要添加用户的时候,记得先 chattr -i 解锁,改完再锁回去。我一开始用这个功能的时候,就把自己坑过好几次。 二、内核参数调优:让系统跑得更快更稳 安全搞定了,接下来是性能。Linux 内核的参数默认值偏向保守,什么场景都能用,但什么场景都不是最优。调优的核心思路就一条:根据实际业务需求,把系统资源的利用效率拉到最高。 所有内核参数都写在 /etc/sysctl.conf 里,一条 sysctl -p 就能生效。下面是我经过多次实战打磨后的参数组合: cat >> /etc/sysctl.conf << 'EOF' # ===== 网络优化 ===== # 开启SYN Cookie,防止SYN洪水攻击 net.ipv4.tcp_syncookies = 1 # SYN队列大小,默认128太小,调到1024 net.ipv4.tcp_max_syn_backlog = 1024 # 已建立连接队列 net.core.somaxconn = 2048 # TIME_WAIT状态的连接最大数量 net.ipv4.tcp_max_tw_buckets = 6000 # 快速回收TIME_WAIT连接(NAT环境下不建议开启) net.ipv4.tcp_tw_recycle = 0 # 允许重用TIME_WAIT连接 net.ipv4.tcp_tw_reuse = 1 # TCP keepalive时间,默认7200秒太长,改为600秒 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 5 # 启用TCP快速打开 net.ipv4.tcp_fastopen = 3 # 连接跟踪表大小(根据内存调整,公式:CONNTRACK_SIZE=内存GB*200000) net.netfilter.nf_conntrack_max = 655360 # 本地端口范围,默认32768-60999太窄 net.ipv4.ip_local_port_range = 1024 65535 # ===== 内存优化 ===== # 减少swap使用倾向(0=尽量不用,100=积极使用) vm.swappiness = 10 # 允许超量分配内存 vm.overcommit_memory = 1 # 内存溢出时杀死进程的策略 vm.overcommit_ratio = 90 # OOM时保护系统进程 vm.panic_on_oom = 0 # ===== 文件系统优化 ===== # 单进程最大文件打开数 fs.file-max = 1048576 # inode缓存最大数量 fs.inotify.max_user_watches = 524288 # ===== 其他 ===== # 核心转储 kernel.core_pattern = /var/crash/core-%e-%p-%t # 禁止普通用户访问内核日志 kernel.dmesg_restrict = 1 # 限制ptrace(防止进程调试注入) kernel.yama.ptrace_scope = 1 EOF sysctl -p 挑几个重点参数解释一下: • net.core.somaxconn = 2048:这个参数控制每个监听端口能排队的最大连接数。默认128在高并发场景下根本不够用。Nginx、Redis 这类服务,一旦连接数上来,超出这个值的请求直接就被内核丢掉了,你的应用层甚至收不到这些请求。 • vm.swappiness = 10:告诉内核尽量用物理内存,少用swap。对于跑数据库或缓存服务的机器,swap一上来性能就断崖式下跌。设成10意味着只有内存用到90%以上才会考虑swap。 • vm.overcommit_memory = 1:允许超量分配内存。很多应用(比如Redis fork子进程做RDB快照)需要短时间内申请大量内存,实际上并不会全部用完。默认策略0会在某些情况下拒绝合理的内存申请,导致进程启动失败。 • net.ipv4.tcp_tw_reuse = 1:高并发短连接场景下,大量连接会进入 TIME_WAIT 状态。开启复用可以让这些端口尽快被新连接使用,避免端口耗尽。 配合 sysctl 调优,用户级别的资源限制也得配上: cat >> /etc/security/limits.conf << 'EOF' * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 * soft core unlimited * hard core unlimited root soft nofile 65535 root hard nofile 65535 EOF nofile 是最大打开文件数,nproc 是最大进程数。这两个值对高并发服务影响巨大。我之前调过一个电商系统,峰值QPS上到2万的时候,Nginx 疯狂报错 "too many open files",查了一下发现默认的 nofile 只有1024。改到65535之后,问题立消失。 三、系统优化与清理 系统跑久了,日志文件越来越大、临时文件堆成山、无用服务占用资源。这些事儿不处理,再好的硬件也扛不住。 3.1 日志管理 日志是排查问题的利器,但不加限制地记录日志,磁盘分分钟被撑爆。见过一台生产服务器,/var/log 占了50GB,系统盘一共才40GB,直接导致磁盘写满服务全挂: # 配置 journald 日志限制 mkdir -p /etc/systemd/journald.conf.d cat > /etc/systemd/journald.conf.d/limit.conf << 'EOF' [Journal] SystemMaxUse=500M SystemMaxFileSize=100M MaxRetentionSec=30day ForwardToSyslog=no EOF systemctl restart systemd-journald # 配置 logrotate cat > /etc/logrotate.d/custom << 'EOF' /var/log/messages /var/log/secure /var/log/cron { daily rotate 7 compress delaycompress missingok notifempty create 0640 root root sharedscripts postrotate /bin/kill -HUP $(cat /var/run/syslogd.pid 2>/dev/null) 2>/dev/null || true endscript } EOF 核心思路:系统日志最多保留500MB,单文件不超过100MB,超过30天自动清理。业务日志用 logrotate 按天切割,保留7天压缩存档。 3.2 禁用无用服务 新装系统通常会启动一堆你用不到的服务。每个服务都是潜在的攻击面,也是资源消耗者: # 禁用无用服务 for svc in avahi-daemon cups bluetooth postfix \ ModemManager accounts-daemon; do systemctl stop $svc 2>/dev/null systemctl disable $svc 2>/dev/null done # 关闭图形界面(服务器不需要) systemctl set-default multi-user.target # 关闭IPv6(如果内网不用) echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf echo 'net.ipv6.conf.default.disable_ipv6 = 1' >> /etc/sysctl.conf sysctl -p3.3 NTP 时间同步 时间不同步,认证会失败、日志对不上、分布式系统会出问题。这事儿必须配: # 安装并配置 chrony yum install -y chrony 2>/dev/null || apt install -y chrony systemctl enable chronyd systemctl start chronyd # 或者用 ntpdate 快速同步一次 ntpdate ntp.aliyun.com3.4 系统更新 新装系统的第一件事就是打补丁。安全漏洞的修复等不起: # CentOS/RHEL yum update -y --exclude=kernel* yum clean all # Ubuntu/Debian apt update && apt upgrade -y apt autoremove -y apt clean 注意我加了 --exclude=kernel*。为什么?因为内核升级需要重启,我们先把用户空间的包更新完,内核单独处理,避免更新过程中服务中断。 四、常用软件自动化部署 每台服务器都应该有一套标准工具集。运维人员登上去,基本的排查工具得随手可用,不能临时去装。 # 系统工具 yum install -y vim wget curl net-tools lsof tree \ htop iotop iftop nmon ncdu bash-completion \ lrzsz bind-utils tcpdump strace sysstat \ lsof telnet rsync unzip bzip2 xz psmisc 2>/dev/null # 或者 Ubuntu/Debian apt install -y vim wget curl net-tools lsof tree \ htop iotop iftop nmon ncdu bash-completion \ lrzsz dnsutils tcpdump strace sysstat \ telnet rsync unzip bzip2 xz psmisc -y 几个常用工具说一下用途: • htop:比 top 好看100倍,进程树、CPU/内存柱状图一目了然 • iftop:实时网络流量监控,哪个 IP 占带宽一目了然 • iotop:IO 占用排行,排查磁盘瓶颈必备 • ncdu:交互式磁盘占用分析,比 du -sh 好用太多 • strace:系统调用追踪,进程卡住、报错时用它跟踪到底 • tcpdump:抓包分析,网络问题的终极武器 4.1 配置 Vim 默认的 Vim 配置很难用,花一分钟调一下,编辑效率高不少: cat > /etc/vimrc.local << 'EOF' set number set tabstop=4 set shiftwidth=4 set expandtab set autoindent set smartindent set ruler set showmode set showcmd set hlsearch set incsearch set ignorecase set smartcase syntax on EOF # 让所有用户的 vim 加载这个配置 echo 'source /etc/vimrc.local' >> /etc/vimrc4.2 配置 bash 增强 让终端用起来更舒服: cat >> /etc/profile.d/custom.sh << 'EOF' # 彩色 ls alias ls='ls --color=auto' alias ll='ls -lh' alias la='ls -lha' # 常用快捷 alias grep='grep --color=auto' alias df='df -h' alias du='du -h' alias free='free -h' alias netstat='netstat -tlnp' # 中文支持 export LANG=en_US.UTF-8 export LC_ALL=en_US.UTF-8 # 退出时清屏(防止敏感信息残留) # trap 'history -w' EXIT EOF4.3 安装 Docker(可选) 现在的服务器,不装 Docker 都不好意思说自己是运维。当然,不是所有场景都需要,但装上总没错: # 一键安装 Docker curl -fsSL https://get.docker.com | sh -s docker --mirror Aliyun # 配置 Docker 镜像加速 mkdir -p /etc/docker cat > /etc/docker/daemon.json << 'EOF' { "registry-mirrors": [ "https://mirror.baidubce.com", "https://docker.1ms.run" ], "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" }, "storage-driver": "overlay2", "live-restore": true } EOF systemctl enable docker systemctl start docker # 添加当前用户到 docker 组 usermod -aG docker admin五、完整初始化脚本 把上面所有操作整合到一个脚本里,新服务器到手,传上去跑一遍就完事。脚本自动识别发行版,不用手动切换命令: #!/bin/bash # ============================================ # Linux 服务器初始化脚本 v2.0 # 适用于: CentOS/RHEL 7+, Ubuntu 20.04+, Debian 11+ # 用法: bash init_server.sh # ============================================ set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' info() { echo -e "${GREEN}[+] $1${NC}"; } warn() { echo -e "${YELLOW}[!] $1${NC}"; } error() { echo -e "${RED}[-] $1${NC}"; exit 1; } # 检测发行版 if [ -f /etc/redhat-release ]; then OS="centos" elif [ -f /etc/debian_version ]; then OS="debian" else error "不支持的系统" fi info "检测到系统: $OS" # 检查 root 权限 if [ "$(id -u)" -ne 0 ]; then error "请使用 root 权限运行此脚本" fi # ---- 1. SSH加固 ---- info "正在加固 SSH 配置..." cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak sed -i 's/^#\?Port 22/Port 2222/' /etc/ssh/sshd_config sed -i 's/^#\?PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config sed -i 's/^#\?PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config sed -i 's/^#\?X11Forwarding yes/X11Forwarding no/' /etc/ssh/sshd_config sed -i 's/^#\?MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config echo 'PermitEmptyPasswords no' >> /etc/ssh/sshd_config # ---- 2. 创建管理用户 ---- info "创建管理用户..." if ! id admin &>/dev/null; then useradd -m -s /bin/bash admin echo "请为 admin 用户设置密码:" passwd admin if [ "$OS" = "centos" ]; then usermod -aG wheel admin else usermod -aG sudo admin fi echo 'admin ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/admin chmod 440 /etc/sudoers.d/admin fi # ---- 3. 防火墙 ---- info "配置防火墙..." if [ "$OS" = "centos" ]; then systemctl enable firewalld systemctl start firewalld firewall-cmd --permanent --remove-service=ssh firewall-cmd --permanent --add-port=2222/tcp firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload else apt install -y ufw ufw default deny incoming ufw allow 2222/tcp ufw allow 80/tcp ufw allow 443/tcp ufw --force enable fi # ---- 4. 内核调优 ---- info "优化内核参数..." cat >> /etc/sysctl.conf << 'SYSCTL' net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 1024 net.core.somaxconn = 2048 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 30 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_fastopen = 3 net.ipv4.ip_local_port_range = 1024 65535 vm.swappiness = 10 vm.overcommit_memory = 1 fs.file-max = 1048576 kernel.dmesg_restrict = 1 kernel.yama.ptrace_scope = 1 SYSCTL sysctl -p # 文件描述符限制 cat >> /etc/security/limits.conf << 'LIMITS' * soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535 LIMITS # ---- 5. 日志管理 ---- info "配置日志管理..." mkdir -p /etc/systemd/journald.conf.d cat > /etc/systemd/journald.conf.d/limit.conf << 'JOURNAL' [Journal] SystemMaxUse=500M SystemMaxFileSize=100M MaxRetentionSec=30day ForwardToSyslog=no JOURNAL systemctl restart systemd-journald # ---- 6. 时间同步 ---- info "配置时间同步..." if [ "$OS" = "centos" ]; then yum install -y chrony systemctl enable chronyd systemctl start chronyd else apt install -y chrony systemctl enable chrony systemctl start chrony fi # ---- 7. 安装常用工具 ---- info "安装常用工具..." if [ "$OS" = "centos" ]; then yum install -y epel-release yum install -y vim wget curl net-tools lsof tree \ htop iotop iftop nmon ncdu bash-completion \ lrzsz bind-utils tcpdump strace sysstat \ rsync unzip bzip2 xz psmisc fail2ban else apt install -y vim wget curl net-tools lsof tree \ htop iotop iftop nmon ncdu bash-completion \ lrzsz dnsutils tcpdump strace sysstat \ rsync unzip bzip2 xz psmisc fail2ban fi # ---- 8. 禁用无用服务 ---- info "禁用无用服务..." for svc in avahi-daemon cups bluetooth; do systemctl stop $svc 2>/dev/null systemctl disable $svc 2>/dev/null done systemctl set-default multi-user.target # ---- 9. Vim配置 ---- info "配置 Vim..." cat > /etc/vimrc.local << 'VIM' set number set tabstop=4 set shiftwidth=4 set expandtab set autoindent set hlsearch set incsearch syntax on VIM grep -q "vimrc.local" /etc/vimrc 2>/dev/null || echo 'source /etc/vimrc.local' >> /etc/vimrc # ---- 10. 系统更新 ---- info "正在更新系统..." if [ "$OS" = "centos" ]; then yum update -y --exclude=kernel* yum clean all else apt update && apt upgrade -y apt autoremove -y apt clean fi info "==========================================" info "服务器初始化完成!" info "请执行以下操作:" info "1. 测试密钥登录: ssh -p 2222 admin@IP" info "2. 确认密钥登录正常后重启: reboot" info "3. 重启后验证服务状态" info "=========================================="六、验证清单:跑完脚本之后做什么 脚本跑完不是结束,验证才是关键。以下清单建议逐一过一遍: • SSH验证:新开一个终端窗口,用密钥 + 2222 端口登录 admin 用户,确认能正常进入。这一步必须在关闭当前root会话之前完成! • 防火墙验证:firewall-cmd --list-all 或 ufw status,确认端口规则正确 • 内核参数验证:sysctl -a | grep somaxconn 确认值已生效 • fail2ban验证:fail2ban-client status sshd • 时间同步验证:chronyc tracking • 服务验证:systemctl list-units --type=service --state=running 查看运行中的服务 • 磁盘验证:df -h 确认磁盘正常 • 重启验证:reboot 之后确认所有配置仍然生效(尤其是 sysctl 和 limits.conf 是否持久化) 总结一下 系统初始化这事儿,说白了就是把"毛坯房"变成"精装房"。安全加固是门锁和防盗窗,内核调优是水电改造,常用工具是家具家电。一套脚本跑完,新服务器直接达到生产标准,不用每次手动折腾。 这套脚本在我手里迭代了好几个版本,每台新机器都用它。最开始是几行命令,后来发现漏了日志管理,补上;又发现 fail2ban 没装,再加;内核参数也是踩过坑才调到最优。现在这套算是比较完整了,直接拿去用就行。 当然,不同业务场景可能还需要额外调整。比如跑数据库的机器,IO 调度器和内存参数要再细调;跑容器的机器,cgroup 和网络配置要额外关注。这些咱们后面慢慢聊。 下期预告: 系统初始化搞定了,下一篇咱们来讲讲——如何搭建一套完整的监控告警体系。Prometheus + Grafana + Alertmanager,从安装到配置到自定义告警规则,让你的服务器永远处在你的掌控之中。
2026年05月22日
5 阅读
0 评论
0 点赞
2026-04-03
可视化Docker Compose构建器VCompose
简介什么是 VCompose ?VCompose 是一个开源的可视化 Docker Compose 构建器,可以通过拖拽操作、绘制连接在浏览器中直接生成可用于生产的 docker-compose.yml 文件。而手动编写docker-compose.yml 意味着要处理缩进、记住镜像标签,还要对照 depends_on 条目。主要特点可视化拖拽:通过拖拽服务、绘制连接线来构建 Docker Compose 配置实时预览:实时生成 YAML 输出,带语法高亮AI 生成:支持 OpenAI、Anthropic、Gemini、GLM 等大模型,用自然语言描述生成配置MCP 集成:支持 MCP 协议,可从 Claude、Cursor 等 AI 工具中调用YAML 导入:支持粘贴现有 compose 文件进行可视化编辑智能推荐:自动推荐配套服务(如 postgres 搭配 pgadmin)无需后端:所有操作在浏览器中完成,数据不会离开本地应用场景开发者快速部署:开发人员可以快速搭建和可视化复杂的 Docker 开发环境Docker 学习:初学者可以通过可视化操作理解 docker-compose 的配置结构团队协作:团队成员可以通过可视化界面共享和讨论 Docker 配置VCompose 是一个让 Docker Compose 配置变得简单直观的可视化工具安装在群晖上以 Docker 方式安装。由于镜像托管在 ghcr.io,群晖 Docker 套件无法直接搜索,需要通过命令行拉取镜像。docker cli 安装如果你熟悉命令行,可能用 docker cli 更快捷docker run -d \ --name=vcompose \ --restart=unless-stopped \ -p 7482:80 \ ghcr.io/zbrave/vcompose:latestdocker-compose 安装也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件version: '3.8'services: vcompose: image: ghcr.io/zbrave/vcompose:latest container_name: vcompose restart: unless-stopped ports: - "7482:80"然后通过 SSH 登录到您的群晖,执行下面的命令:# 新建文件夹 vcompose 和 子目录mkdir -p /volume1/docker/vcompose进入 vcompose 目录cd /volume1/docker/vcompose将 docker-compose.yml 放入当前目录一键启动docker-compose up -d运行在浏览器中访问 http://<群晖IP>:7482 即可进入 VCompose Web 界面。点下方的 Open VCompose 按钮,进入主界面Stacks 中是编排好的,像 Smart Home 包含了 6 个 services从侧边栏拖拽服务到画布配置镜像、端口、卷、环境变量绘制连接线自动生成 depends_on复制或下载生成的 docker-compose.yml而 Marketplace 中则是单个的镜像,也可以添加自定义镜像设置 AI 之后,可以进行优化VCompose 还可以作为 MCP 使用,但是看文档 http://<群晖IP>:7482/mcp 似乎应该只支持 stdio 传输注意事项无需配置:这是一个纯前端应用,不需要环境变量和持久化存储数据安全:所有数据保存在浏览器 localStorage 中,不会发送到任何服务器版本更新:如需更新镜像,重新拉取最新版本即可参考文档VCompose: Visual Docker Compose Builder地址:https://github.com/zbrave/vcomposevcompose - Docker Image地址:https://ghcr.io/zbrave/vcomposeVCompose 在线版地址:https://vcompose.cc@所有人:写文不易,如果你都看到了这里,请点个赞和在看,分享给更多的朋友;为确保你能收到每一篇文章,请主页右上角设置星标。
2026年04月03日
9 阅读
0 评论
0 点赞
2026-01-22
工控机sata硬盘电源线序调整
黄色线是+12V,红色是+5V,粉色(实际上电源用的线一般是橙色)是+3.3V,黑色是地线(GND)硬盘线序定义黄12,红5 才对。 实际拿万用表测试挑线,重新排下顺序电源接错,会烧硬盘的。
2026年01月22日
23 阅读
0 评论
1 点赞
2026-01-08
nginx配置「锦上添花」的小修小补
1. 统一 SSL 配置块(可维护性)把重复的 ssl_* 指令抽成一个独立文件,主配置里 include 即可,例如:# /etc/nginx/ssl/ssl_best.conf ssl_certificate /etc/nginx/ssl/_baidu.com.crt; ssl_certificate_key /etc/nginx/ssl/_baidu.com.key; ssl_trusted_certificate /etc/nginx/ssl/_baidu.com.crt; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA^...............:ECDHE-RSA-AE^.............-GCM-SHA384;然后在每个 443 段里写一句:include ssl_best.conf; 配上路径,容器运行注意! 比如include /etc/nginx/ssl/ssl_best.conf;以后换证书/调加密套件只改一行。2. 补充安全响应头(看情况用吧)新建 /etc/nginx/conf.d/security_headers.conf:add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; # 如需上传或外链,按需调整 CSP add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;在 所有 443 段 的 location / 里加:include security_headers.conf; 配上路径,容器运行注意! 比如include /etc/nginx/conf.d/security_headers.conf;(Tomcat 已自带 X-Frame-Options,nginx 再统一一次无冲突。)3. 代理头统一模板把 proxy 头也抽成 /etc/nginx/conf.d/proxy_headers.conf:proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header REMOTE-HOST $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";以后 location / 里只要写:proxy_pass http://backend_5800; include proxy_headers.conf; 比如include /etc/nginx/conf.d/proxy_headers.conf;Tomcat 路径同理。4. 小优化:正则 location 加 breaklocation ~ ^/(test|oa|ob|oc) { proxy_pass http://tomcat; include proxy_headers.conf; }• 正则 ~ 会顺序匹配,保持放在「普通 location /」前面即可。• 若担心性能,可改为:location /oa { ... } location /ob { ... }5. 可选:Tomcat 真实 IP 日志Tomcat 要记录访客真实 IP,在 server.xml 里加:<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto" />nginx 已传头,直接可用。{lamp/}附配置:{collapse}{collapse-item label="一、nginx的default.conf的配置"}# ---------- upstream ---------- upstream tomcat { server tomcat:8080; } upstream backend_5800 { server 172.25.194.247:5800; } # ---------- 80 → 443 统一跳转 ---------- server { listen 80; listen [::]:80; server_name baidu.com *.baidu.com *.cloud.baidu.com; return 301 https://$host$request_uri; } # ---------- 主域名 + 通配证书 ---------- server { listen 443 ssl; listen [::]:443 ssl; server_name baidu.com *.baidu.com *.cloud.baidu.com; #ssl_best统一SSL配置块,要配路径,容器运行注意! include /etc/nginx/ssl/ssl_best.conf; # 根目录 → 5800 location / { proxy_pass http://backend_5800; #代理头proxy_header,要配路径容器运行要注意! include /etc/nginx/conf.d/proxy_headers.conf; #安全响应头security_headers,要配路径容器运行要注意! include /etc/nginx/conf.d/security_headers.conf; } # 子路径 → tomcat location ~ ^/(ixjkj|oa|ob|oc) { proxy_pass http://tomcat; #代理头proxy_header,要配路径容器运行要注意! include /etc/nginx/conf.d/proxy_headers.conf; #安全响应头security_headers,要配路径容器运行要注意! include /etc/nginx/conf.d/security_headers.conf; } } # ---------- oa.cloud.baidu.com 专用 ---------- server { listen 443 ssl; listen [::]:443 ssl; server_name oa.cloud.baidu.com; #ssl_best统一SSL配置块,要配路径,容器运行注意! include /etc/nginx/ssl/ssl_best.conf; # 根目录 → tomcat /oa(去掉路径前缀) location / { proxy_pass http://tomcat/oa/; #代理头proxy_header,要配路径容器运行要注意! include /etc/nginx/conf.d/proxy_headers.conf; #安全响应头security_headers,要配路径容器运行要注意! include /etc/nginx/conf.d/security_headers.conf; } } # ========== ob.cloud.baidu.com 专用 ========== server { listen 443 ssl; listen [::]:443 ssl; server_name ob.cloud.baidu.com; #ssl_best统一SSL配置块,要配路径,容器运行注意! include /etc/nginx/ssl/ssl_best.conf; # 根目录反向代理到 Tomcat 的 /ob(去掉前缀) location / { proxy_pass http://tomcat/ob/; # 注意末尾斜杠 #代理头proxy_header,要配路径容器运行要注意! include /etc/nginx/conf.d/proxy_headers.conf; #安全响应头security_headers,要配路径容器运行要注意! include /etc/nginx/conf.d/security_headers.conf; } }{/collapse-item}{collapse-item label="二、统一SSL配置块的配置"}ssl_certificate /etc/nginx/ssl/_.cloud.baidu.com.crt; ssl_certificate_key /etc/nginx/ssl/_.cloud.baidu.com.key; ssl_trusted_certificate /etc/nginx/ssl/_.cloud.baidu.com_issuerCertificate.crt; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers ECDHE-ECDSA-....................................................SHA384;{/collapse-item}{collapse-item label="三、安全响应头的配置"}add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;{/collapse-item}{collapse-item label="四、统一代理头的配置"}proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header REMOTE-HOST $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";{/collapse-item}{collapse-item label="2026年1月16日配置重写路径"}虽然页面转过来了,但页面资源元素全部404,随后添加一个server块server { listen 8888 ssl; listen [::]:8888 ssl; server_name jxzy2.baidu.com; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'; ssl_prefer_server_ciphers on; location / { # 保留请求的 URI set $backend_uri $request_uri; # 如果请求的不是 /hzsjapi/ 开头,则添加前缀 if ($request_uri !~ ^/hzsjapi/) { set $backend_uri /hzsjapi$request_uri; } proxy_pass http://tomcat2$backend_uri; #设置正确的 Host 头,包含端口 proxy_set_header Host $host:$server_port; #proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Original-URI $request_uri; client_max_body_size 20000m; #重写重定向 proxy_redirect http:// https://; }{/collapse-item}{/collapse}
2026年01月08日
17 阅读
0 评论
0 点赞
2026-01-07
Tomcat强制跳转https
不使用nginx代理Tomcat直接服务1 全局Tomcat的conf/server.xml找到这一段默认是这样<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" <!-- 改回 8443,不再强制 443 --> maxParameterCount="1000" URIEncoding="utf-8"/>需要https<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" maxParameterCount="1000" uRIEncoding="utf-8"2 单个应用里webapps/你的项目/WEB-INF/web.xml默认<!-- <security-constraint> ... <transport-guarantee>CONFIDENTIAL</transport-guarantee> </security-constraint> -->需要强制https<!--跳转--> <security-constraint> <web-resource-collection> <web-resource-name>Secure Area</web-resource-name> <url-pattern>/*</url-pattern> <!-- 匹配所有 URL --> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> <!-- 强制 HTTPS --> </user-data-constraint> </security-constraint>“作用域”速查表文件位置作用域优先级说明conf/server.xml全局(整个 Tomcat)最低里面的 Connector、Host、Context 对所有应用生效。conf/web.xml全局默认(所有应用共用)中Tomcat 自带的默认部署描述符,相当于“父模板”。webapps/xxx/WEB-INF/web.xml单个应用最高只影响 xxx 这个应用;与上面冲突时以它为准。
2026年01月07日
16 阅读
0 评论
0 点赞
1
2
...
8