首页 / 帮助文档 / ubuntu服务器低配置站点安全运维优化

ubuntu服务器低配置站点安全运维优化

低配置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内存的机器也能稳定跑起一个中小型站点,而且比那些堆配置但从不优化的服务器更安全、更可靠。