在企业级环境中,于 Ubuntu Server 上优化 Nginx 和 PostgreSQL 的部署需要兼顾性能、安全性、可维护性与高可用性。以下是一套经过实战验证的优化方案,涵盖系统层、服务层、架构层及运维实践:
一、系统层面优化(Ubuntu Server)
1. 内核参数调优
# /etc/sysctl.conf 或 /etc/sysctl.d/99-nginx-postgres.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
vm.swappiness = 10
vm.vfs_cache_pressure = 50
应用生效:sudo sysctl -p
✅ 建议:对 SSD/NVMe 存储,额外启用
vm.dirty_ratio=20,vm.dirty_background_ratio=5提升写吞吐。
2. 文件系统与挂载优化
- 使用 ext4 或 XFS(推荐 XFS 用于大文件/高并发日志)
- 挂载选项示例:
# /etc/fstab /dev/sdb1 /var/lib/postgresql xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 2 /dev/nvme0n1p1 /srv/nginx ext4 rw,noatime,discard 0 1 - 禁用不必要的挂载选项(如
noexec仅用于/tmp)
3. 资源隔离与 Cgroups v2(推荐 Ubuntu 22.04+)
# 限制 PostgreSQL 内存上限(防止 OOM)
sudo systemd-run --scope --slice=postgres.slice --property MemoryMax=4G
systemctl start postgresql.service
二、Nginx 深度优化
1. 核心配置(/etc/nginx/nginx.conf)
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 16384;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
# Gzip 压缩(仅对文本类)
gzip on;
gzip_types text/plain application/json application/javascript text/css;
gzip_min_length 1024;
gzip_vary on;
# 缓存静态资源
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:100m max_size=10g inactive=60m;
upstream backend {
least_conn;
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1 backup;
}
server {
listen 80 default_server;
server_name _;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
}
# 静态资源缓存
location ~* .(jpg|png|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
proxy_cache static_cache;
proxy_cache_valid 200 30d;
proxy_cache_key $scheme$request_method$host$request_uri;
}
}
}
2. 安全加固
- 隐藏版本号:
server_tokens off; - 限制请求体大小:
client_max_body_size 10M; - 启用 HTTP/2 + TLS 1.3(配合 Let’s Encrypt)
- 定期运行
nginx -T | grep -i ssl | sort -u检查弱加密套件
三、PostgreSQL 极致调优
1. postgresql.conf 关键参数(根据硬件调整)
shared_buffers = 25% of RAM (e.g., 8GB → 2GB)
effective_cache_size = 50–75% of RAM
work_mem = 64MB (单查询会话,谨慎设置!)
maintenance_work_mem = 1GB
max_connections = 200 # 结合 pg_stat_activity 监控
checkpoint_completion_target = 0.9
wal_buffers = 16MB
default_statistics_target = 100
random_page_cost = 1.1 # SSD 环境显著降低此值
seq_page_cost = 1.0
2. pg_hba.conf 最小权限原则
# 仅允许应用服务器 IP 连接
hostssl all app_user 10.0.0.5/32 scram-sha-256
hostssl replication replicator 10.0.0.6/32 md5
⚠️ 禁止
0.0.0.0/0,生产环境强制 SSL (hostssl)
3. 索引与查询优化
- 使用
EXPLAIN (ANALYZE, BUFFERS)分析慢查询 - 为高频 WHERE/JOIN 列创建合适索引(B-tree / GiST / BRIN)
- 定期执行
VACUUM FULL(低峰期)+ANALYZE - 启用
pg_stat_statements扩展监控 Top SQL
4. 备份与高可用
- WAL 归档 + PITR:
archive_mode = on archive_command = 'cp %p /mnt/wal_archive/%f' - 流复制主从:至少 1 个同步备用节点(
synchronous_commit = remote_apply) - 工具推荐:
pgBackRest(支持并行备份、增量、压缩)、Patroni(自动故障转移)
四、架构级最佳实践
| 层级 | 方案 | 说明 |
|---|---|---|
| 前端 | Nginx + Let’s Encrypt + Cloudflare CDN | 静态资源缓存 + DDoS 防护 |
| 应用层 | Docker/Kubernetes 部署微服务 | 进程隔离、弹性伸缩 |
| 数据层 | PostgreSQL 主从 + Patroni + HAProxy | 自动故障切换(<30s RTO) |
| 监控 | Prometheus + Grafana + Alertmanager | 自定义指标:pg_stat_database_tup_returned, nginx_active_connections |
| 日志 | Loki + Promtail 或 ELK Stack | 结构化日志(JSON),集中检索 |
五、自动化与可观测性
1. Ansible 部署模板(片段)
- name: Tune kernel for high concurrency
sysctl:
name: "{{ item.name }}"
value: "{{ item.value }}"
state: present
reload: yes
loop:
- { name: net.core.somaxconn, value: 65535 }
- { name: vm.swappiness, value: 10 }
- name: Deploy optimized Nginx config
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'
notify: restart nginx
2. 健康检查脚本示例
#!/bin/bash
# check_service_health.sh
curl -sf http://localhost:80/health || exit 1
psql -h localhost -U app_user -c "SELECT 1" > /dev/null 2>&1 || exit 1
echo "All services healthy"
六、常见陷阱规避
| 问题 | 解决方案 |
|---|---|
| 数据库连接池耗尽 | 应用层使用 PgBouncer(事务池模式) |
| Nginx 502 Bad Gateway | 增加 proxy_read_timeout,检查后端是否阻塞 |
| 磁盘 I/O 瓶颈 | 将 WAL 目录单独挂载到高速 NVMe;开启 direct_io(慎用) |
| 内存泄漏 | 监控 RSS vs Shared,排查未释放游标/长事务 |
七、持续改进建议
- 压测验证:使用
wrk(HTTP)、pgbench(DB)模拟负载,对比优化前后 QPS/延迟。 - A/B 测试:灰度发布新配置,观察错误率与 P99 延迟变化。
- 文档化:维护《运维手册》包含回滚步骤、应急联系人、依赖版本矩阵。
💡 提示:所有优化需基于真实业务负载画像(QPS、连接数、读写比、数据增长趋势),避免过度调优导致反效果。
如需针对特定场景(如X_X交易、物联网时序数据、AI推理服务)定制方案,我可进一步提供专项优化路径。
云知道CLOUD