在 Ubuntu Server 上优化部署企业级 Web 服务(如 Nginx 和 PostgreSQL)需兼顾性能、可靠性、安全性、可观测性与可维护性。以下为经过生产验证的系统化优化指南,分模块说明,并附关键配置示例和最佳实践:
一、系统层基础优化(所有服务共用)
1. 内核与资源调优(/etc/sysctl.conf)
# 网络优化(提升并发连接处理能力)
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535
# 内存与OOM控制(避免关键服务被kill)
vm.swappiness = 1 # 减少swap使用(SSD/NVMe建议设为1,纯内存充足可设0)
vm.vfs_cache_pressure = 50 # 降低inode/dentry缓存回收压力
# 应用生效
sudo sysctl -p
2. 文件系统与I/O
- 文件系统:使用
ext4(启用barrier=1,commit=30)或XFS(推荐高IO负载,mkfs.xfs -f -l size=128m -d agcount=16 /dev/sdb) - 挂载选项(
/etc/fstab):UUID=... /var/lib/postgresql xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0 UUID=... /var/www xfs defaults,noatime,nodiratime 0 0 - I/O调度器(NVMe建议
none,SATA SSD 用deadline或mq-deadline):echo 'mq-deadline' | sudo tee /sys/block/nvme0n1/queue/scheduler # 永久化:/etc/default/grub 中添加 `elevator=mq-deadline`
3. 用户资源限制(/etc/security/limits.conf)
postgres soft nofile 65535
postgres hard nofile 65535
www-data soft nofile 65535
www-data hard nofile 65535
* soft memlock unlimited
* hard memlock unlimited
✅ 启用
pam_limits.so(检查/etc/pam.d/common-session是否含@include common-session-noninteractive)
二、Nginx 高性能部署优化
1. 主配置优化(/etc/nginx/nginx.conf)
user www-data;
worker_processes auto; # 自动匹配CPU核心数
worker_rlimit_nofile 65535;
events {
use epoll; # Linux专用高效事件模型
worker_connections 65535; # 单worker最大连接数
multi_accept on; # 一次性接受多个连接
accept_mutex off; # 高并发下减少锁竞争(>=1.11.3)
}
http {
sendfile on; # 内核零拷贝
tcp_nopush on; # 合并小包(配合sendfile)
tcp_nodelay on; # 禁用Nagle算法(降低延迟)
keepalive_timeout 30 30; # 客户端keepalive时间
keepalive_requests 10000; # 单连接最大请求数
# Gzip压缩(节省带宽,注意CPU开销)
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 缓存静态资源(CDN前置时可关闭)
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# 日志优化(异步写入,减少阻塞)
access_log /var/log/nginx/access.log main buffer=16k flush=5s;
error_log /var/log/nginx/error.log warn;
}
2. 安全加固(关键头 & TLS)
# 在 server 块中添加
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';" always;
# TLS 1.3 + 强密码套件(需 OpenSSL ≥ 1.1.1)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
3. 运维增强
- 使用
systemd管理:确保nginx.service启用Restart=on-failure和OOMScoreAdjust=-100 - 监控:集成
nginx-module-vts(实时状态页)或 Prometheus Exporter - 日志轮转:配置
logrotate每日切割 +gzip压缩
三、PostgreSQL 生产级优化
1. 内存与连接(/etc/postgresql/*/main/postgresql.conf)
# 内存(根据总内存合理分配,避免OOM)
shared_buffers = 4GB # 物理内存的25%(≥16GB RAM时)
effective_cache_size = 12GB # 物理内存的75%
work_mem = 16MB # 复杂排序/哈希操作内存(按并发连接数计算:total_mem / max_connections)
maintenance_work_mem = 1GB # VACUUM/CREATE INDEX等维护操作
# 连接与并发
max_connections = 200 # 避免过高(连接数过多反降性能)
superuser_reserved_connections = 5
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 5
# WAL 与写入性能
wal_level = replica # 支持流复制
synchronous_commit = off # 提升写入吞吐(若允许少量数据丢失风险)
wal_buffers = 16MB # 至少16MB(≥shared_buffers/32)
checkpoint_completion_target = 0.9 # 平滑检查点,减少IO尖峰
max_wal_size = 2GB
min_wal_size = 1GB
# 查询优化
random_page_cost = 1.1 # SSD场景(HDD用4.0)
effective_io_concurrency = 200 # NVMe可设200,SATA SSD设100
2. 表空间与存储优化
-- 创建高速表空间(指向NVMe盘)
CREATE TABLESPACE fastssd LOCATION '/mnt/nvme/pg_fast';
-- 将大表/索引迁移到高速表空间
ALTER TABLE orders SET TABLESPACE fastssd;
ALTER INDEX idx_orders_user_id SET TABLESPACE fastssd;
3. 安全与高可用
- 认证:
pg_hba.conf严格限制来源IP +scram-sha-256密码加密 - 备份:每日
pg_basebackup+ WAL 归档(archive_command),结合pgbackrest或wal-g - 高可用:采用 Patroni + etcd/ZooKeeper 实现自动故障转移(不推荐仅用 repmgr)
- 监控:集成
pg_stat_statements(启用)、pgBadger分析日志、Prometheus +postgres_exporter
4. 关键运维脚本
# 自动VACUUM分析(避免手动干预)
# /etc/cron.d/pg-maintenance
0 2 * * * postgres /usr/bin/vacuumdb --all --analyze-in-stages >/dev/null 2>&1
# 检查WAL归档健康度
0 * * * * postgres psql -c "SELECT pg_is_in_recovery(), pg_last_wal_receive_lsn() IS NOT NULL AS wal_received;" 2>/dev/null | grep "t.*t" || echo "WAL archive alert!" | mail -s "PG WAL Alert" admin@example.com
四、统一可观测性与自动化
| 维度 | 工具方案 |
|---|---|
| 日志聚合 | Filebeat → Elasticsearch + Kibana(结构化Nginx/PG日志) |
| 指标监控 | Prometheus(Node Exporter + nginx_exporter + postgres_exporter)+ Grafana |
| 告警 | Alertmanager(配置CPU>90%、PG连接数>95%、磁盘<10%等关键规则) |
| 配置管理 | Ansible(版本化Playbook,支持一键部署/回滚) |
| 容器化 | Docker + Podman(Nginx/PG可容器化,但生产数据库强烈建议裸机部署) |
五、必须规避的常见陷阱
| ❌ 错误做法 | ✅ 正确做法 |
|---|---|
直接修改 root 用户运行 Nginx/PG |
使用专用用户(www-data/postgres),禁用shell(/usr/sbin/nologin) |
将 PG 数据目录放在 / 或 /home |
独立挂载高性能磁盘(XFS/ext4),预留 ≥20% 空间 |
启用 huge_pages 但未配置内核参数 |
如启用,需 vm.nr_hugepages = 1024 + huge_pages = on(仅对 >64GB RAM 有效) |
Nginx proxy_pass 到 localhost:5432(绕过Unix Socket) |
PostgreSQL 用 Unix Socket(unix_socket_directories = '/var/run/postgresql')提升本地连接性能 |
忽略 autovacuum 调优导致膨胀 |
autovacuum_vacuum_scale_factor = 0.05, autovacuum_analyze_scale_factor = 0.02 |
六、快速验证清单(部署后必做)
-
Nginx
nginx -t && systemctl reload nginx ab -n 10000 -c 1000 http://localhost/ # 测试并发能力 ss -s | grep "TCP:" # 查看连接状态 -
PostgreSQL
SHOW shared_buffers; SELECT name, setting, unit FROM pg_settings WHERE name IN ('shared_buffers','work_mem','max_connections'); SELECT * FROM pg_stat_database WHERE datname = 'your_db'; -
系统级
ulimit -n # 检查进程文件句柄 dmesg -T | grep -i "out of memory|oom" # 检查OOM iostat -x 1 5 # 观察 %util, await, r/s w/s
💡 终极建议:
- 压测先行:使用
wrk(Nginx)和pgbench(PostgreSQL)模拟真实负载,再调整参数;- 渐进式优化:每次只改1~2个参数,监控效果后再继续;
- 文档化所有变更:记录配置项、修改原因、预期效果及回滚步骤;
- 定期审计:每季度执行安全扫描(
lynis audit system)、日志分析、备份恢复演练。
如需具体某环节(如 Patroni 部署细节、TLS 证书自动续期、Ansible Playbook 模板),我可提供完整可执行代码。欢迎进一步指定场景! 🚀
云服务器