低配置Ubuntu服务器跑站点,真正的瓶颈往往不是CPU或内存的数字,而是默认配置里大量“为了兼容性”而开启的服务和参数。1核1G甚至512MB内存的机器,如果直接用发行版默认的Apache+PHP+MySQL组合,装完可能就吃掉一半以上内存,再跑个数据库和几个PHP进程,SWAP频繁读写,站点响应时间直接飙到几秒。所以安全运维优化的核心思路不是“加功能”,而是做减法:砍掉一切不必要的模块、限制资源消耗上限、把攻击面缩到最小,同时用轻量组件替换重组件。
先处理软件栈:换掉Apache和MySQL
Apache的prefork模式每个连接一个进程,低配机器上十几个并发就能把内存打满。直接换成Nginx或者OpenLiteSpeed,单进程事件驱动模型,静态文件直接由Nginx返回,PHP请求通过FastCGI转发,内存占用能降低60%以上。数据库方面,MySQL 8默认占用约400MB内存,而MariaDB在低配场景下可以通过配置把InnoDB缓冲池压到64MB甚至32MB,性能损耗在低流量站点上几乎感知不到。如果站点数据量小且并发低,SQLite也是一个选择,但要注意写并发限制。
安装命令参考:
sudo apt update sudo apt install nginx mariadb-server php-fpm php-mysql php-gd php-xml php-mbstring php-curl sudo systemctl stop apache2 sudo systemctl disable apache2
这里直接停用Apache而不是卸载,防止依赖问题。确认Nginx和PHP-FPM正常运行后,再决定是否彻底移除Apache包。
PHP-FPM资源限制是低配机的命门
PHP-FPM默认的进程管理模式是dynamic,最大子进程数往往按服务器内存自动计算,但在低配机器上这个数字可能偏大。一个PHP-FPM子进程平均占用30-50MB内存,如果开了10个子进程,光PHP就吃掉300-500MB。对于1GB内存的机器,必须手动调低。编辑/etc/php/8.1/fpm/pool.d/www.conf:
pm = ondemand pm.max_children = 5 pm.process_idle_timeout = 10s pm.max_requests = 500
ondemand模式意味着没有请求时不启动任何PHP进程,空闲时内存几乎不占用,有请求时才按需拉起进程,空闲10秒后自动回收。max_requests设为500是为了防止PHP进程长期运行导致内存泄漏累积。同时限制每个请求的内存上限,在php.ini中设置memory_limit = 128M,防止某个脚本异常吃掉全部内存。
SWAP策略调整:不要完全禁用,但要控制行为
低配服务器上很多人建议直接关闭SWAP,这其实有风险。一旦内存耗尽,OOM Killer会直接杀掉MySQL或Nginx进程,导致服务完全不可用。更好的做法是保留SWAP但降低swappiness值,让系统尽量使用物理内存,只有在真正不足时才写入SWAP。编辑/etc/sysctl.conf:
vm.swappiness = 10 vm.vfs_cache_pressure = 50
swappiness=10表示物理内存用到90%左右才开始使用SWAP,vfs_cache_pressure=50让系统更倾向于保留目录缓存,提高文件读取速度。对于SSD硬盘的机器,SWAP写入速度尚可接受,如果是机械硬盘,建议swappiness设得更低,比如5。
Nginx层面做访问限制和缓存
低配机器扛不住大量恶意扫描和CC攻击,必须在Nginx层做基础防护。首先限制请求频率和并发连接数:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
limit_req zone=req_limit burst=10 nodelay;
limit_conn conn_limit 10;
...
}
这样单个IP每秒最多5个请求,突发允许10个,超过直接返回503。对于低配机器,这个限制能有效防止脚本小子用工具扫描漏洞时把服务器拖垮。同时开启静态文件缓存,让浏览器缓存图片、CSS、JS等资源,减少服务器重复处理:
location ~* \.(jpg|jpeg|png|gif|css|js|woff2|svg)$ {
expires 30d;
add_header Cache-Control "public, immutable";
access_log off;
}
关闭静态文件的访问日志也能减少磁盘IO,低配机器上IO往往是隐藏瓶颈。
数据库优化:InnoDB参数必须手动调
MariaDB/MySQL默认的InnoDB缓冲池大小是128MB,对于512MB内存的机器来说已经很大了,但还需要进一步压缩。编辑/etc/mysql/mariadb.conf.d/50-server.cnf:
[mysqld] innodb_buffer_pool_size = 64M innodb_log_buffer_size = 4M max_connections = 30 key_buffer_size = 8M query_cache_size = 0 query_cache_type = 0 performance_schema = OFF
innodb_buffer_pool_size设为物理内存的1/8到1/4,对于低流量站点足够。max_connections限制为30,防止连接数过多导致内存耗尽。关闭query_cache是因为它在高并发写场景下反而会造成锁竞争,现代MySQL/MariaDB已经不建议使用。performance_schema关闭可以节省约50-100MB内存,低配机器上这个监控功能性价比很低。
系统服务裁剪:干掉一切不需要的后台进程
Ubuntu Server默认会启动一些对Web服务器无用的服务,比如snapd、ModemManager、cups、avahi-daemon等。这些服务不仅占内存,还增加了攻击面。查看当前运行的服务:
systemctl list-units --type=service --state=running
逐个判断,对于不需要的服务直接停止并禁用:
sudo systemctl stop snapd sudo systemctl disable snapd sudo systemctl stop ModemManager sudo systemctl disable ModemManager sudo systemctl stop cups sudo systemctl disable cups sudo systemctl stop avahi-daemon sudo systemctl disable avahi-daemon
snapd在低配机器上尤其讨厌,它会在后台自动更新snap包,消耗CPU和内存。如果不需要snap安装的软件,建议彻底移除。另外检查cron任务,有些面板或监控脚本会定期执行消耗资源的操作,根据实际需求精简。
文件权限和用户隔离:最小权限原则落地
很多低配服务器被入侵后变成挖矿机,根本原因是Web目录权限设置过宽。Nginx和PHP-FPM运行用户是www-data,Web目录的所有者应该是部署用户,www-data只读。对于需要写入的目录,比如上传目录、缓存目录,单独设置写权限:
sudo chown -R deploy:www-data /var/www/site
sudo find /var/www/site -type d -exec chmod 750 {} \;
sudo find /var/www/site -type f -exec chmod 640 {} \;
sudo chmod 770 /var/www/site/upload
sudo chmod 770 /var/www/site/cache
这样即使某个PHP文件被上传了恶意代码,www-data用户也无法修改其他文件,只能写入指定目录。同时PHP配置中禁用危险函数,在php.ini中设置:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
curl_exec被禁用后,很多正常功能会受影响,比如调用外部API。如果站点需要这些功能,可以只禁用exec、shell_exec、system等直接执行系统命令的函数,保留curl。根据实际业务调整,不要一刀切。
日志轮转和监控:防止磁盘被写满
低配机器磁盘空间往往也不大,日志文件如果不加控制,几周就能写满。Ubuntu默认有logrotate,但Nginx和PHP-FPM的日志轮转配置需要确认。编辑/etc/logrotate.d/nginx,确保轮转周期和保留份数合理:
/var/log/nginx/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
保留7天日志,压缩存储,对于大多数站点足够排查问题。同时设置一个简单的内存和磁盘监控脚本,通过cron每小时检查一次,超过阈值就发邮件或记录告警:
#!/bin/bash
MEM=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}')
DISK=$(df / | awk 'NR==2 {printf "%.0f", $5}')
if [ $MEM -gt 90 ] || [ $DISK -gt 90 ]; then
echo "Alert: MEM=${MEM}% DISK=${DISK}%" >> /var/log/resource-alert.log
fi
这个脚本不需要额外安装监控软件,cron每5分钟跑一次即可,低配机器上避免使用Zabbix Agent或Node Exporter这类常驻监控程序,它们本身也会消耗资源。
内核参数和网络优化:小改动大效果
低配机器上TCP连接处理能力有限,通过sysctl调整内核网络参数,可以提高并发处理效率并减少TIME_WAIT状态堆积:
net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_syncookies = 1 net.core.somaxconn = 1024
tcp_fin_timeout从默认60秒降到15秒,加快TIME_WAIT状态回收,tcp_tw_reuse允许复用TIME_WAIT连接,对于Nginx作为反向代理的场景特别有用。tcp_syncookies开启SYN Cookie防护,防止SYN Flood攻击消耗内存。
定期更新与最小化安装的长期维护
安全运维不是一次性工作。Ubuntu的unattended-upgrades可以自动安装安全更新,但低配机器上自动更新可能会在业务高峰期占用CPU和内存。建议手动控制更新节奏,每周固定时间执行:
sudo apt update && sudo apt upgrade -y sudo systemctl restart nginx php8.1-fpm mariadb
更新前用uptime和free确认当前负载,选择低峰期操作。另外定期检查系统中是否有多余的软件包,用apt autoremove清理不再需要的依赖,保持系统精简。
低配Ubuntu服务器的安全运维优化,本质上是一个持续做减法的过程。每增加一个功能、一个模块、一个后台服务,都要问自己:这个真的必要吗?在资源极度有限的情况下,任何浪费都会被放大。把默认配置里的冗余全部剔除,把每个组件的资源上限卡死,把攻击面缩到最小,一台512MB内存的机器也能稳定跑起一个中小型站点,而且比那些堆配置但从不优化的服务器更安全、更可靠。
