服务器配置是运维和开发工作中最基础也最关键的环节。无论是部署个人博客、小型企业应用,还是支撑高并发的电商平台,一台配置不当的服务器都可能成为性能瓶颈或安全隐患。很多新手在完成服务器配置时,往往只关注安装软件和启动服务,却忽略了系统参数调优、安全加固和长期维护策略。本文将从实战角度出发,分享我在多年运维中积累的服务器配置技巧与最佳实践,帮助你避开常见陷阱,构建稳定、高效、安全的运行环境。
初始系统配置:打好地基
操作系统选型与最小化安装
选择操作系统是服务器配置的第一步。对于大多数Web应用,Ubuntu LTS(如22.04)和CentOS Stream(或Rocky Linux)是主流选择。我推荐使用最小化安装(Minimal Install),只包含核心系统组件,不安装GUI、打印服务等无关软件。这样不仅能减少攻击面,还能降低资源占用。安装完成后,立即执行系统更新:
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo yum update -y # CentOS/RHEL
创建非root用户并配置SSH密钥
永远不要直接使用root用户进行日常操作。创建一个具有sudo权限的普通用户,并配置SSH密钥登录,禁用密码登录。这是服务器配置中最基本的安全措施。
sudo adduser deploy
sudo usermod -aG sudo deploy
ssh-copy-id deploy@your_server_ip
sudo vim /etc/ssh/sshd_config
sudo systemctl restart sshd
注意:在修改SSH配置前,务必保持一个已登录的终端会话,以防配置错误导致无法连接。我曾见过有人因为忘记测试新配置就关闭了所有会话,不得不联系机房重启。
配置防火墙与时间同步
使用UFW(Ubuntu)或firewalld(CentOS)配置防火墙,只开放必要端口。同时,确保系统时间准确,这对日志分析和证书验证至关重要。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo timedatectl set-timezone Asia/Shanghai
sudo apt install ntp -y
sudo systemctl enable ntp && sudo systemctl start ntp
Web服务器配置:性能与安全并重
Nginx作为反向代理的调优
Nginx是目前最流行的Web服务器之一。在服务器配置中,合理调整Nginx的worker进程数和连接数能显著提升并发处理能力。以下是一个经过实战验证的配置模板:
user www-data;
worker_processes auto; # 自动匹配CPU核心数
worker_rlimit_nofile 65535; # 文件描述符上限
events {
worker_connections 4096; # 每个worker最大连接数
use epoll; # Linux高性能事件模型
multi_accept on; # 一次accept多个连接
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Gzip压缩
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# 限制请求速率(防止暴力破解)
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/s;
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri; # HTTP强制跳转HTTPS
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/certs/example.crt;
ssl_certificate_key /etc/ssl/private/example.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_pass http://127.0.0.1:8080; # 转发到后端应用
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /login {
limit_req zone=login burst=10 nodelay; # 登录接口限流
proxy_pass http://127.0.0.1:8080;
}
}
}
PHP-FPM池调优
如果后端使用PHP,PHP-FPM的配置直接影响响应速度。根据服务器内存大小,合理调整pm.max_children、pm.start_servers等参数。一个常见的错误是设置过大的max_children导致内存溢出。
; /etc/php/8.1/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 50 # 每个进程约20-30MB,1GB内存建议50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500 # 每个进程处理500个请求后重启,防止内存泄漏
; 慢日志记录,便于排查性能问题
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log
数据库配置:从默认到最优
MySQL/MariaDB参数调优
数据库是服务器配置中容易忽视但影响巨大的部分。默认配置通常针对低配开发机,生产环境必须调整。以下是一个针对2GB内存服务器的my.cnf配置示例:
[mysqld]
innodb_buffer_pool_size = 512M # 设置为物理内存的25%-50%
innodb_log_file_size = 128M # 适当增大,减少日志切换频率
innodb_flush_log_at_trx_commit = 2 # 平衡性能与安全性(设为1最安全但最慢)
innodb_file_per_table = 1 # 每个表独立表空间
max_connections = 200 # 根据应用调整,避免过多连接
query_cache_type = 0 # MySQL 8.0已废弃,直接关闭
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
调优原则:不要盲目复制网上的配置。先用mysqltuner或pt-query-digest分析当前状态,再针对性调整。我曾遇到过有人把innodb_buffer_pool_size设为总内存的80%,结果系统因OOM被杀。
连接池与读写分离
对于高并发应用,在应用层或中间件层配置连接池(如PHP的PDO持久连接、Java的HikariCP)能显著减少数据库连接开销。更进一步的服务器配置方案是引入读写分离:主库处理写操作,从库处理读操作。可以使用ProxySQL或MySQL Router实现透明代理。
sudo apt install proxysql -y
mysql -u admin -padmin -h 127.0.0.1 -P 6032 <<EOF
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (0, '192.168.1.10', 3306); -- 主库
INSERT INTO mysql_servers (hostgroup_id, hostname, port) VALUES (1, '192.168.1.11', 3306); -- 从库
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup, apply) VALUES (1, 1, '^SELECT', 1, 1);
LOAD MYSQL SERVERS TO RUNTIME;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
SAVE MYSQL QUERY RULES TO DISK;
EOF
安全加固与监控:防患于未然
入侵检测与日志审计
服务器配置完成后,安全加固是持续的过程。安装Fail2ban可以自动封禁

评论框