安装Nginx需从编译、配置结构到参数全程按高密度低开销设计,坚持精简(禁用非必需模块)、复用(提取公共配置)、隔离(分层管理站点)三原则。

安装 Nginx 时就为大规模虚拟主机做准备,关键不是“装完再调”,而是从编译、配置结构到初始参数都按高密度、低开销逻辑来设计。重点在精简、复用、隔离三原则。
编译阶段:只留必需模块
默认编译会带上大量非生产所需模块(如 perl、xslt、geoip2 等),每个模块即使未启用也会占用基础内存和启动解析开销。应显式禁用:
- 运行
nginx -V查看当前加载模块,对比业务实际需求 - configure 时用
--without-xxx_module明确剔除,例如:--without-http_perl_module --without-http_xslt_filter_module --without-stream_geoip2_module - 保留核心模块即可:ssl、v2、realip、stub_status、gzip_static、stream(如需 TCP/UDP 代理)
配置组织:物理分离 + 逻辑复用
避免把所有 server 块堆进一个文件。推荐分层结构:
-
/etc/nginx/sites-available/存各站点独立配置(每个文件仅含 1 个 server 块,不含重复 listen/ssl 配置) -
/etc/nginx/conf.d/common.conf提取共用段:统一 access_log 格式、log_not_found off、client_max_body_size、keepalive_timeout -
/etc/nginx/conf.d/ssl.conf统一定义:ssl_session_cache shared:SSL:10m;ssl_session_timeout 4h;ssl_protocols TLSv1.2 TLSv1.3; - 主配置 nginx.conf 中用
include conf.d/*.conf;和include sites-enabled/*;加载
监听与 SSL:合并端口,避免 per-server 重复加载
每多一个 listen 443 ssl 就多一份证书解析、SNI 匹配上下文。正确做法是:
- 所有 HTTPS 站点共用同一组
listen 443 ssl http2;指令,放在 http 块或单独的公共 server 块中 - 证书路径统一由 SNI 自动匹配,无需每个 server 块写
ssl_certificate(除非有特殊证书绑定需求) - HTTP 站点同理:用单个
listen 80;server 块配合return 301 https://$host$request_uri;全局跳转,而非每个域名单独 listen
进程与连接:匹配硬件,不盲目堆高
worker 进程数和连接数不是越大越好,要兼顾内存与调度效率:
-
worker_processes设为 CPU 物理核心数(非 auto),容器环境尤其注意避免误判 -
worker_connections控制在 2048–4096:足够支撑数百个轻量虚拟主机;超过 8192 会明显增加单 worker 内存占用和锁竞争 - 搭配
multi_accept off;,让连接更均匀分发,避免某个 worker 突然承载过多 server 上下文 - 必须同步调整系统级限制:
ulimit -n 100000并在 systemd service 文件中设置LimitNOFILE=100000
上线前必做:删注释、清测试路径、验语法
这些操作不改功能,但直接影响内存加载量:
- 删除所有被注释掉的 location(如
#location /phpmyadmin { ... })、废弃 server_name 或临时测试块 - 检查并移除
underscores_in_headers on;、gzip_vary on;等低价值调试配置 - 每次新增站点后执行
nginx -t,确认无隐式语法错误导致配置重载失败


















