在 Ubuntu Server 上部署企业级 Web 服务(如 Nginx + PostgreSQL),核心不在于“安装”,而在于稳定性、安全性、性能调优和可维护性。以下是一套经过生产环境验证的优化方案,涵盖系统层、应用层和运维层。
一、系统层优化:为高性能打底
Ubuntu Server 默认配置偏向通用性,需针对高并发场景调整。
1. 内核参数调优 (/etc/sysctl.conf)
重点优化网络栈和文件描述符限制,提升连接处理能力。
# 编辑 /etc/sysctl.conf,追加以下内容
net.core.somaxconn = 65535 # 增加监听队列长度,防止 SYN 丢包
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1 # 允许重用 TIME-WAIT sockets
net.ipv4.ip_local_port_range = 1024 65535 # 扩大临时端口范围
fs.file-max = 100000 # 系统级最大文件描述符数
kernel.pid_max = 65535 # 进程 ID 最大值
# 生效
sudo sysctl -p
2. 用户级资源限制 (/etc/security/limits.conf)
确保 Nginx 和 PostgreSQL 用户能打开足够多的文件句柄。
* soft nofile 65535
* hard nofile 65535
nginx soft nofile 65535
nginx hard nofile 65535
postgres soft nofile 65535
postgres hard nofile 65535
注意:修改后需重新登录会话或重启服务生效。
3. 时间同步与电源管理
- NTP 同步:使用
chrony或systemd-timesyncd确保时间精确,对日志分析和分布式系统至关重要。 - 禁用 CPU 节能模式:对于计算密集型任务,将 Governor 设为
performance:sudo apt install cpufrequtils echo "GOVERNOR=performance" | sudo tee /etc/default/cpufrequtils sudo systemctl restart cpufrequtils
二、Nginx 优化:高并发网关
1. Worker 进程配置
worker_processes auto;:自动匹配 CPU 核心数。worker_connections 65535;:每个 worker 最大连接数。- 总连接数 ≈
worker_processes * worker_connections。
2. 启用 HTTP/2 和 TLS 1.3
http {
server {
listen 443 ssl http2;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...';
ssl_prefer_server_ciphers off; # 让客户端选择更高性能的 cipher
}
}
3. 缓存与压缩
- 启用
gzip压缩静态资源(文本类)。 - 配置
proxy_cache反向X_X缓存,减轻后端压力。 - 设置合理的
expires头,利用浏览器缓存。
4. 安全加固
- 隐藏版本信息:
server_tokens off; - 限制请求体大小:
client_max_body_size 10m; - 使用
limit_req_zone防刷:limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; location /api/ { limit_req zone=one burst=20 nodelay; }
三、PostgreSQL 优化:数据库内核调优
1. 内存分配(关键!)
shared_buffers:建议设置为物理内存的 25%(不要超过 40%)。effective_cache_size:建议设置为物理内存的 75%(仅用于查询规划器估算)。work_mem:根据并发查询数谨慎设置,避免 OOM。例如:(可用内存 - shared_buffers) / (最大并发连接数 * 2)。
2. WAL 与持久化
wal_level = replica:若需主从复制。full_page_writes = on:保障数据一致性。commit_delay和commit_siblings:适当调整以提升批量写入性能(需谨慎测试)。
3. 连接池管理
- PostgreSQL 本身不擅长高并发短连接。务必在前端使用 PgBouncer 或 ProxySQL 做连接池。
max_connections不宜过大(默认 100),结合 PgBouncer 的pool_mode = transaction可支撑数千并发。
4. 索引与查询优化
- 定期运行
ANALYZE更新统计信息。 - 使用
EXPLAIN (ANALYZE, BUFFERS)分析慢查询。 - 对高频查询字段建立 B-tree 索引,对 JSONB 字段可使用 GIN 索引。
四、高可用与架构设计
1. 负载均衡
- 单点 Nginx 不可靠。使用 Keepalived + VRRP 实现双机热备 VIP。
- 或使用云厂商提供的 SLB/CLB(如阿里云 ALB、腾讯云 CLB),屏蔽底层复杂性。
2. 数据库高可用
- 推荐方案:Patroni + etcd/Consul + PostgreSQL。
- Patroni 自动故障转移,支持多节点 Leader 选举。
- 配合流复制(Streaming Replication)实现读写分离。
- 传统方案:PgPool-II 或 pglogical。
3. 备份策略
- 逻辑备份:
pg_dump定时全量备份。 - 物理备份:使用
barman或pg_basebackup+ WAL 归档,支持时间点恢复(PITR)。 - 异地容灾:将备份文件同步至对象存储(如 OSS/S3)。
五、监控与可观测性
1. 指标监控
- Prometheus + Node Exporter:采集服务器资源(CPU、内存、磁盘 I/O、网络)。
- Postgres Exporter:采集 PostgreSQL 内部指标(连接数、锁等待、缓冲命中率等)。
- Nginx Lua 模块:通过
ngx_http_stub_status_module暴露 Nginx 状态。
2. 日志集中
- Nginx access/error log → Filebeat → Logstash/Elasticsearch/Kibana(ELK)或 Loki。
- PostgreSQL log → 开启
log_statement = 'all'或至少'mod',并异步发送到日志平台。
3. 告警
- Prometheus Alertmanager 配置阈值告警:
- CPU > 80% 持续 5 分钟
- 磁盘使用率 > 85%
- PostgreSQL 连接数 > 90% max_connections
- Nginx 5xx 错误率突增
六、安全合规要点
-
最小权限原则:
- Nginx worker 以非 root 用户运行。
- PostgreSQL 不使用 root 启动。
- 防火墙仅开放必要端口(80/443,SSH,以及内网 DB 端口)。
-
加密传输:
- 全站 HTTPS,强制 HSTS。
- 内网通信使用 TLS(如 PG 的
ssl = on)。
-
定期更新:
- 订阅 Ubuntu Security Notices 和 PostgreSQL 安全公告。
- 使用
unattended-upgrades自动安装安全补丁。
-
容器化部署(可选但推荐):
- 使用 Docker/Kubernetes 隔离服务,便于弹性伸缩和回滚。
- 镜像基础 OS 选用
ubuntu-minimal或debian-slim减小攻击面。
总结 checklist
| 层级 | 关键动作 |
|---|---|
| 系统 | 调优 sysctl、limits、时间同步、关闭无关服务 |
| Nginx | Worker 匹配 CPU、HTTP/2、TLS 1.3、限流、缓存 |
| PostgreSQL | shared_buffers 设 25%、配 PgBouncer、建索引、WAL 归档 |
| 高可用 | Keepalived/VIP、Patroni 集群、异地备份 |
| 监控 | Prometheus + Grafana、ELK/Loki、Alertmanager 告警 |
| 安全 | 最小权限、HTTPS、定期补丁、防火墙规则 |
这套方案兼顾了性能、稳定性和安全性,适用于大多数中大型企业级场景。具体参数需根据实际硬件配置和业务负载进行压测微调。
CLOUD云枢