Nginx 概述
Nginx 是一款由俄罗斯程序员 Igor Sysoev 开发的轻量级、高性能 HTTP 和反向代理服务器,同时也支持 IMAP/POP3/SMTP 代理。自 2004 年发布以来,凭借其高并发处理能力、低内存消耗和稳定性,成为全球最受欢迎的 Web 服务器之一,广泛应用于静态资源服务、反向代理、负载均衡及 API 网关等场景。
一、安装与编译
源码编译安装
推荐使用源码编译以获取最佳性能并定制模块。解压压缩包后进入目录:
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0
执行 configure 脚本时,建议指定用户组、SSL 支持及常用模块:
./configure --prefix=/usr/local/nginx \
--user=nginx --group=nginx \
--with-http_ssl_module --with-http_v2_module \
--with-http_realip_module --with-http_stub_status_module \
--with-pcre --with-stream --with-stream_ssl_module \
--with-stream_realip_module
make && make install
验证版本及编译参数:
/usr/local/nginx/sbin/nginx -V
自定义版本号
若需修改显示的版本号,可在编译前编辑 src/core/nginx.h:
#define NGINX_VERSION ""
#define NGINX_VER "CustomVersion/" NGINX_VERSION
重新编译后,nginx -v 将显示自定义信息。
二、平滑升级与回滚
升级流程
- 编译新版本:解压新包,运行 configure(无需 make install),仅执行 make。
- 备份旧二进制:保留当前运行的
/usr/local/nginx/sbin/nginx。 - 替换新二进制:将新编译的
objs/nginx覆盖旧文件。 - 重载配置:发送信号让主进程加载新代码,Worker 进程会优雅重启。
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)
若发现问题,可通过 kill 旧进程或恢复备份快速回滚。
回滚操作
如果新版本存在严重问题,可重新拉起旧版本 Worker 进程。建议先备份新版文件:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.new
# 恢复旧版
mv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx
systemctl reload nginx
三、Systemd 服务管理
编写 systemd 配置文件便于统一管理:
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
生效配置并启动:
systemctl daemon-reload
systemctl enable --now nginx
四、核心配置详解
1. 配置文件结构
主配置文件分为四个逻辑块:
- main block: 全局配置段。
- event: 事件驱动相关配置。
- http: Web 服务器相关配置(包含多个 server)。
- mail/stream: 邮件或 TCP 代理配置。
2. 全局配置块
user nginx nginx;
worker_processes auto; # 自动匹配 CPU 核心数
worker_cpu_affinity 00000001 00000010; # 绑定 CPU 核,减少上下文切换
worker_rlimit_nofile 100000; # 限制打开文件数
error_log logs/error.log warn; # 错误日志级别
pid logs/nginx.pid; # PID 文件路径
CPU 绑定示例:
worker_processes auto;
worker_cpu_affinity 000001 000010 000100 001000 010000 100000;
3. events 块配置
控制连接处理机制,高并发场景下至关重要:
events {
worker_connections 10000; # 单进程最大并发数
use epoll; # Linux 下推荐 epoll
accept_mutex on; # 避免惊群效应
multi_accept on; # 批量接受连接
}
调优提示:若遇到 Too many open files 错误,需调整系统限制:
ulimit -n 100000
vim /etc/security/limits.conf
* - nofile 100000
4. http 块配置
这是功能最丰富的部分,涵盖缓存、代理、日志等:
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer"';
access_log logs/access.log main;
sendfile on; # 零拷贝优化
keepalive_timeout 65; # 长连接超时
gzip on; # 开启压缩
include "/usr/local/nginx/conf.d/*.conf";
}
MIME 类型处理:
若 PHP 文件默认被识别为 application/octet-stream,可调整 default_type:
default_type text/html;
五、站点发布与 Location 匹配
基于域名的虚拟主机
创建子配置文件并引入主配置:
server {
listen 80;
server_name www.czg.org;
root /webdata/nginx/czg.org/czg/html;
}
Root 与 Alias 的区别
- root: 拼接 URI 到根目录,适合标准映射。
- alias: 替换 URI 路径,常用于重定向特定目录。
Location 优先级
匹配顺序通常为:=, ^~, ~, ~*, 无符号。精确匹配优先级最高。
location = /test { return 200 "exact match"; }
location ^~ /static { return 200 "prefix match"; }
六、高级功能实战
1. 账户认证
使用 htpasswd 生成加密密码:
htpasswd -cmb /usr/local/nginx/.htpasswd user password
在 location 中启用认证:
location /admin {
auth_basic "login passwd";
auth_basic_user_file "/usr/local/nginx/.htpasswd";
}
2. 自定义错误页
error_page 404 502 /error;
location /error {
alias /usr/local/nginx/errorpage/errormessage;
}
3. 文件检测 (try_files)
用于 SPA 路由或默认页面回退:
try_files $uri $uri.html $uri/index.html /errorpage/default.html;
4. HTTPS 全站加密
生成证书并配置 SSL:
openssl req -newkey rsa:2048 -nodes -sha256 \
-keyout certs/czg.org.key -x509 -days 365 \
-out certs/czg.org.crt
server {
listen 443 ssl;
ssl_certificate /usr/local/nginx/certs/czg.org.crt;
ssl_certificate_key /usr/local/nginx/certs/czg.org.key;
ssl_session_cache shared:sslcache:20m;
if ($scheme = http) {
rewrite ^/(.*) https://$host/$1 permanent;
}
}
5. 防盗链
基于 Referer 头限制访问:
location ~* \.(jpg|png)$ {
valid_referers none blocked server_names *.czg.org;
if ($invalid_referer) {
return 403;
}
}
6. 反向代理
七层代理 (HTTP)
location / {
proxy_pass http://backend_server:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
四层代理 (TCP)
需在 stream 块中配置:
stream {
server {
listen 3306;
proxy_pass 172.25.254.50:3306;
}
}
7. FastCGI 集成 PHP
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
8. 缓存加速
结合 Memcached 实现动态内容缓存:
location ~ \.php$ {
set $key $uri$args;
srcache_fetch GET /memc $key;
srcache_store PUT /memc $key;
fastcgi_pass 127.0.0.1:9000;
}
七、IO 模型原理
理解 IO 模型有助于深入掌握 Nginx 的高性能机制。
- 阻塞 IO: 等待数据就绪,简单但效率低。
- 非阻塞 IO: 立即返回状态,需轮询,消耗 CPU。
- 多路复用 (Select/Poll/Epoll): 一个线程监控多个描述符,Nginx 默认使用 Epoll。
- 异步 IO: 内核完成读写后通知应用,Linux 下支持尚不完善。
Nginx 采用 Epoll + 事件驱动模型,实现了高并发下的低资源占用。
八、OpenResty 扩展
OpenResty 是基于 Nginx 与 Lua 的高性能平台,适合需要复杂逻辑处理的场景。编译时需卸载原生 Nginx,并添加 Lua 模块支持。
