# 更新系统
sudo apt update && sudo apt upgrade -y
# 创建新用户并设置sudo权限
adduser deploy
usermod -aG sudo deploy
# 禁用root SSH登录
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# 设置防火墙
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable
# 修改SSH端口(可选)
sudo sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config
# 启用密钥认证
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 限制SSH访问IP(可选)
echo "AllowUsers deploy@your_ip" | sudo tee -a /etc/ssh/sshd_config
sudo systemctl restart sshd
# /etc/nginx/nginx.conf 主配置
server_tokens off; # 隐藏NGINX版本信息
# 限制HTTP方法
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy "default-src 'self' https:";
# 禁用不必要的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# SSL配置示例
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# 防止MIME类型混淆
add_header X-Content-Type-Options "nosniff";
# 启用XSS保护
add_header X-XSS-Protection "1; mode=block";
# 限制文件上传大小
client_max_body_size 10M;
# 以非root用户运行
pm2 start app.js --name "my-app" --user deploy
# 设置日志轮转
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
# 启用集群模式(根据CPU核心数)
pm2 start app.js -i max --name "my-app"
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-app',
script: 'app.js',
instances: 'max',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'production',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
}
}]
};
# 设置PM2开机启动
pm2 startup
pm2 save
# 监控应用状态
pm2 monit
# 设置自动重启策略
pm2 start app.js --name "my-app" --exp-backoff-restart-delay=100
# 创建备份脚本 /usr/local/bin/backup.sh
#!/bin/bash
DATE=$(date +%Y-%m-%d)
BACKUP_DIR="/backups"
mkdir -p $BACKUP_DIR/$DATE
# 备份数据库
mysqldump -u root -p'password' --all-databases > $BACKUP_DIR/$DATE/db.sql
# 备份应用数据
tar -czvf $BACKUP_DIR/$DATE/app.tar.gz /var/www/html
# 备份NGINX配置
tar -czvf $BACKUP_DIR/$DATE/nginx.tar.gz /etc/nginx
# 保留最近7天备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
# 设置cron定时任务
0 3 * * * /usr/local/bin/backup.sh
# MySQL安全设置
mysql_secure_installation
# 创建应用专用用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'strong_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
# 设置正确的文件权限
sudo chown -R deploy:deploy /var/www/html
sudo find /var/www/html -type d -exec chmod 755 {} \;
sudo find /var/www/html -type f -exec chmod 644 {} \;
# 保护敏感文件
sudo chmod 600 /etc/nginx/ssl/private.key
# 安装常用监控工具
sudo apt install -y htop nmon sysstat
# 配置日志轮转
sudo apt install -y logrotate
# 安装fail2ban防止暴力破解
sudo apt install -y fail2ban
# 配置NGINX防护
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
# 启用[nginx-http-auth]和[nginx-botsearch]
# 检查系统漏洞
sudo apt install -y lynis
sudo lynis audit system
# 检查开放端口
sudo netstat -tulnp
sudo ss -tulnp
# 检查用户登录
last
入侵响应流程:
数据恢复流程:
联系信息:
通过以上配置和策略,您可以构建一个相对安全的VPS环境,运行NGINX和PM2托管的应用程序。请记住,安全是一个持续的过程,需要定期更新和维护所有组件。