1. Linux服务器基础环境搭建
刚拿到一台裸机Linux服务器时,系统初始化是重中之重。我通常会选择Ubuntu Server LTS版本作为起点,不仅因为其丰富的软件源和社区支持,更因为它的长期维护周期(通常5年)能保证系统稳定性。对于生产环境,CentOS Stream或Rocky Linux也是不错的选择,特别是需要与RHEL生态保持兼容的场景。
重要提示:无论选择哪个发行版,安装时务必选择"最小化安装"模式。这能有效减少攻击面,避免安装不必要的服务组件。我见过太多因为默认安装多余组件导致的安全事故。
网络配置是第一个需要解决的问题。DHCP动态分配IP在服务器环境简直是灾难,想象一下半夜服务器IP突然变更导致服务中断的场景。在Ubuntu中,Netplan的YAML配置文件需要特别注意缩进格式:
yaml复制network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]
应用配置后,别忘了测试网络连通性:ping -c 4 google.com && nslookup example.com。我习惯同时测试IPv4和DNS解析,确保双重验证。
系统更新是另一个容易被忽视的关键步骤。除了常规的apt update && apt upgrade,我强烈推荐启用无人值守更新:
bash复制sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
这能确保安全补丁自动安装,但要注意配置/etc/apt/apt.conf.d/50unattended-upgrades,排除可能影响稳定性的内核更新。曾经有次自动内核更新导致NVIDIA驱动崩溃,让我花了整个通宵回滚。
2. 用户与权限管理
直接使用root账户就像在雷区裸奔。我的标准做法是:
bash复制sudo adduser deploy --gecos "" # 禁用交互式提问
sudo usermod -aG sudo deploy
sudo passwd -l root # 直接锁定root账户
SSH加固是安全基线中的重中之重。这是我的/etc/ssh/sshd_config黄金配置:
code复制Port 2222 # 修改默认端口
PermitRootLogin no
PasswordAuthentication no # 强制密钥认证
MaxAuthTries 3
LoginGraceTime 1m
AllowUsers deploy
密钥认证的配置有个小技巧:在本地生成密钥时使用ssh-keygen -t ed25519 -a 100,这比传统的RSA更安全且更高效。上传公钥后,务必设置严格的权限:
bash复制chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
文件权限管理有个实用工具叫lsattr,可以查看文件的隐藏属性。我经常用chattr +i /etc/passwd防止用户账户被篡改,这在共享主机环境特别有用。
3. 基础服务部署
Web服务器选型上,Nginx已成为我的首选,特别是需要HTTP/2和TLS 1.3支持时。这个配置模板能应付大多数场景:
nginx复制server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
}
}
数据库安全初始化有个关键细节:MySQL 8.0+默认使用caching_sha2_password认证插件,如果老客户端连接有问题,可以创建用户时指定:
sql复制CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED WITH mysql_native_password BY 'complexPassword';
防火墙策略我偏好UFW的简洁性,但要注意执行顺序:
bash复制sudo ufw allow 2222/tcp # 先放行SSH
sudo ufw enable # 启用会立即生效
sudo ufw allow proto tcp to any port 80,443 # Web端口
4. 监控与维护
监控体系搭建我习惯用Prometheus+Alertmanager+Grafana组合。Node Exporter的配置有个细节:
yaml复制# /etc/prometheus/prometheus.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
metric_relabel_configs:
- source_labels: [__name__]
regex: '(node_network_receive_bytes_total|node_network_transmit_bytes_total)'
action: keep
这可以只收集网络流量指标,避免数据爆炸。对于日志管理,journalctl的几个实用参数:
bash复制journalctl -u nginx --since "1 hour ago" # 服务日志
journalctl -p err..alert # 只看错误日志
journalctl --disk-usage # 检查日志占用空间
备份策略中,我开发了个增量备份脚本:
bash复制#!/bin/bash
rsync -az --delete --link-dest=/backup/prev /data/ /backup/$(date +%Y%m%d)
rm -f /backup/prev && ln -s /backup/$(date +%Y%m%d) /backup/prev
配合crontab -e设置每日执行,既节省空间又保留完整版本历史。
5. 安全加固措施
SELinux的配置曾经让我头疼,直到发现这些实用命令:
bash复制semanage port -a -t http_port_t -p tcp 8080 # 放行非标准端口
restorecon -Rv /var/www # 修复上下文
setsebool -P httpd_can_network_connect_db 1 # 允许网络连接
Fail2ban的过滤规则可以很灵活,比如防止暴力破解MySQL:
ini复制# /etc/fail2ban/filter.d/mysql-auth.conf
[Definition]
failregex = ^%(__prefix_line)sAccess denied for user '\S+'@'<HOST>'
定期漏洞扫描我使用Trivy进行容器扫描和Vuls进行系统扫描的组合:
bash复制trivy image --security-checks vuln myapp:latest
vuls scan -report-json /tmp/report.json
6. 开发环境配置
Git全局配置我通常会设置:
bash复制git config --global core.autocrlf input # Linux换行符
git config --global credential.helper store --file ~/.git-credentials
git config --global alias.graph "log --all --graph --decorate --oneline"
Docker优化配置包括:
json复制{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Jenkins的Groovy初始化脚本可以自动化配置:
groovy复制import jenkins.model.*
import hudson.security.*
def instance = Jenkins.getInstance()
def hudsonRealm = new HudsonPrivateSecurityRealm(false)
hudsonRealm.createAccount('admin', 'complexPassword')
instance.setSecurityRealm(hudsonRealm)
7. 性能调优技巧
内核参数调优中,这个配置对高并发Web服务特别有效:
bash复制# /etc/sysctl.conf
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_fin_timeout = 30
vm.swappiness = 10
磁盘调度算法选择也有讲究,对于NVMe SSD:
bash复制echo none > /sys/block/nvme0n1/queue/scheduler
内存优化方面,我习惯使用zRAM:
bash复制sudo apt install zram-config
echo "PERCENT=50" | sudo tee -a /etc/default/zramswap
sudo systemctl restart zramswap.service
8. 故障排查方法
当服务异常时,我的诊断流程通常是:
ss -tulnp检查端口监听状态journalctl -xe --no-pager查看最新日志dmesg -T | tail -20检查内核消息strace -p <PID>跟踪进程系统调用
网络问题排查工具链:
bash复制mtr -rwbzc 10 example.com # 综合路由跟踪
tshark -i eth0 -Y "http.request" -T fields -e http.host # HTTP流量分析
nc -zv example.com 443 # 端口连通性测试
性能瓶颈定位我常用BCC工具集:
bash复制/usr/share/bcc/tools/opensnoop # 监控文件打开
/usr/share/bcc/tools/tcplife # TCP连接生命周期
/usr/share/bcc/tools/cpudist # CPU耗时分布
这些年来最大的教训是:永远要有回滚方案。每次重大变更前,我会确保:
- 完整系统快照
2 配置版本控制提交 - 详细变更记录
- 监控系统就绪
最后分享一个实用技巧:在~/.bashrc中添加这些别名能极大提升效率:
bash复制alias ports='ss -tulnp'
alias logs='journalctl -xe --no-pager -f'
alias disks='df -hT -x tmpfs -x devtmpfs'
alias topmem='ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'