奋斗
努力

企业级Web服务(如Nginx、PostgreSQL)在Ubuntu Server上如何优化部署?

云计算

在 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 用 deadlinemq-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-failureOOMScoreAdjust=-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),结合 pgbackrestwal-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

六、快速验证清单(部署后必做)

  1. Nginx

    nginx -t && systemctl reload nginx
    ab -n 10000 -c 1000 http://localhost/  # 测试并发能力
    ss -s | grep "TCP:"  # 查看连接状态
  2. 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';
  3. 系统级

    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 模板),我可提供完整可执行代码。欢迎进一步指定场景! 🚀

未经允许不得转载:云服务器 » 企业级Web服务(如Nginx、PostgreSQL)在Ubuntu Server上如何优化部署?