Nginx采用主从多进程模型设计,由一个master进程和多个worker进程组成。这种架构设计是Nginx高性能的核心保障。master进程以root权限运行,主要负责读取配置文件、维护worker进程等工作;而worker进程则以nobody等非特权用户运行,实际处理网络请求。
这种设计带来的直接好处是:
在实际生产环境中,我通常会根据服务器CPU核心数来配置worker_processes参数。比如8核服务器可以配置:
nginx复制worker_processes 8; # 与CPU核心数保持一致
worker_rlimit_nofile 65535; # 每个worker能打开的最大文件描述符数
Nginx的跨平台特性使其能在绝大多数操作系统上稳定运行。根据我的部署经验,主要支持以下平台:
| 操作系统 | 架构支持 | 备注 |
|---|---|---|
| Linux | i386/amd64/arm/ppc64le | 内核2.6+版本兼容性最佳 |
| FreeBSD | i386/amd64 | 高性能网络栈优势明显 |
| Windows | i386 | 仅建议开发环境使用 |
| macOS | i386/arm64 | 开发调试便利 |
虽然系统包管理器安装方便,但生产环境我推荐源码编译安装,这样可以:
编译前需要准备的依赖库:
bash复制# 下载依赖源码包
wget http://nginx.org/download/nginx-1.25.3.tar.gz
wget https://www.openssl.org/source/openssl-3.1.2.tar.gz
wget https://sourceforge.net/projects/pcre/files/pcre2/10.42/pcre2-10.42.tar.gz
wget https://zlib.net/zlib-1.3.tar.gz
典型编译配置示例:
bash复制./configure \
--prefix=/opt/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-pcre=../pcre2-10.42 \
--with-zlib=../zlib-1.3 \
--with-openssl=../openssl-3.1.2 \
--with-threads \
--with-file-aio
关键编译参数说明:
--with-file-aio:启用异步文件IO提升性能--with-threads:启用线程池处理异步IO--with-http_v2_module:支持HTTP/2协议Nginx配置文件采用层次化结构:
code复制main # 全局配置
├── events # 事件模型配置
└── http # HTTP服务配置
├── server # 虚拟主机配置
│ ├── location # URI路由配置
│ └── ...
└── ...
worker配置优化:
nginx复制worker_processes auto; # 自动检测CPU核心数
worker_cpu_affinity auto; # CPU亲和处理
worker_rlimit_nofile 65535; # 文件描述符限制
events事件模型:
nginx复制events {
use epoll; # Linux高性能事件模型
worker_connections 8192; # 每个worker最大连接数
multi_accept on; # 一次accept多个连接
}
HTTP核心配置:
nginx复制http {
include mime.types;
default_type application/octet-stream;
sendfile on; # 零拷贝传输
tcp_nopush on; # 优化数据包发送
keepalive_timeout 65; # 长连接超时
gzip on; # 启用压缩
gzip_min_length 1k;
gzip_types text/plain application/json;
server {
listen 80 reuseport; # 端口复用
server_name example.com;
location / {
root /var/www/html;
index index.html;
}
}
}
最大并发连接数计算公式:
code复制最大并发 = worker_processes × worker_connections
对于4核CPU、每个worker 8192连接的情况:
code复制4 × 8192 = 32768 并发连接
需要调整的Linux内核参数:
bash复制# 增加最大文件描述符
echo "fs.file-max = 655350" >> /etc/sysctl.conf
# 优化网络栈
echo "net.ipv4.tcp_max_tw_buckets = 6000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 8192" >> /etc/sysctl.conf
# 生效配置
sysctl -p
避免过度日志记录影响性能:
nginx复制http {
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main buffer=32k flush=1m;
error_log /var/log/nginx/error.log warn;
open_log_file_cache max=1000 inactive=20s valid=1m;
}
错误:bind() to 0.0.0.0:80 failed (98: Address already in use)
解决方法:
bash复制# 查找占用端口的进程
sudo ss -tulnp | grep :80
# 停止冲突服务或修改Nginx监听端口
错误:nginx: [emerg] unknown directive "ssl"
解决方法:
bash复制# 重新编译安装--with-http_ssl_module模块
./configure --with-http_ssl_module
make && make install
bash复制netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
bash复制tail -f /var/log/nginx/access.log | awk '{print $1,$7,$9}'
bash复制# 安装sysstat工具包
sudo apt install sysstat
# 监控系统资源
sar -n DEV 1 # 网络流量
sar -q 1 # 负载队列
nginx复制server {
# 隐藏Nginx版本号
server_tokens off;
# 禁用非必要HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# 防止点击劫持
add_header X-Frame-Options SAMEORIGIN;
# XSS防护
add_header X-XSS-Protection "1; mode=block";
}
nginx复制location /admin {
# IP白名单限制
allow 192.168.1.0/24;
allow 10.0.0.1;
deny all;
# 基础认证
auth_basic "Admin Area";
auth_basic_user_file /etc/nginx/htpasswd;
}
nginx复制server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 协议与加密套件配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
# HSTS安全头
add_header Strict-Transport-Security "max-age=63072000" always;
}
在实际运维中,我发现很多性能问题都源于不当的配置参数。比如将worker_connections设置过高会导致内存耗尽,而设置过低又无法充分利用服务器资源。建议通过压力测试找到最佳平衡点,我的经验公式是:
code复制worker_connections = (总内存 - 系统预留) / 单个连接内存消耗
其中单个连接内存消耗通常在1KB左右,这个值可以通过实际监控获得。配置完成后,别忘了用nginx -t测试配置语法,然后优雅重启服务:
bash复制nginx -s reload