nginx 详解
[TOC]
1.什么是 Nginx?
1.高性能Web服务器
Nginx采用事件驱动的异步非阻塞架构,能高效处理静态文件请求,单台服务器可支持30,000至50,000个并发连接,显著优于传统服务器如Apache
2.反向代理与负载均衡
作为反向代理服务器,Nginx可隐藏后端服务器并分配流量,支持轮询、加权轮询等策略,适用于高并发场景如电商秒杀或直播
官网:https://nginx.org
2.Nginx 可以做什么?
- 正向代理
- 反向代理
- 负载均衡
- HTTP服务器
正向代理
简单来说就是Nginx代理客户端来访问互联网。典型代表:VPN。
最大特点是:客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式隐藏了真实客户端信息。
# 在 nginx.conf 的 http 块中添加
server {
listen 3128; # 代理服务监听端口
server_name proxy.example.com;
resolver 8.8.8.8; # 必须配置DNS解析器
location / {
proxy_pass http://$http_host$request_uri; # 关键指令:透传原始请求
proxy_set_header Host $http_host; # 保留原始Host头
# 基础性能优化
proxy_connect_timeout 5s;
proxy_buffers 16 32k;
proxy_buffer_size 64k;
}
}
反向代理
简单来说就是Nginx作为反向代理服务器接收来自客户端的请求,并将请求转发给后端的真实服务器集群中的一台。典型代表:负载均衡
最大特点:主要用于服务器进群分布式部署的情况下,隐藏了服务器的真实信息!
server {
listen 31393;
server_name lipeilong.space;
location / {
proxy_pass http://127.0.0.1:8081; #添加后端代理服务器地址
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_set_header X-Forwarded-Proto $scheme;
}
}
负载均衡
Nginx通过反向代理实现负载均衡
注意:upstream{}配置在http块中的全局块中
1.轮询
默认模式,每个请求按照顺序逐一分配到不同的后端服务器。
优点:配置简单,只需要将服务器列表加入到upstream模块中即可
#负载中有三台服务器,当请求到达时,nginx按照时间顺序将请求分配给这三台服务器
upstream serverList {
server 192.168.1.100;
server 192.168.1.101;
server 192.168.1.102;
}
2.加权轮询
加权轮询
每个请求按照5:3:2的权重分配到后端服务器
#当请求到达时,nginx按照时间顺序和权重把请求分配给三台服务器处理。例如10个请求,30%的4处理,30%的3处理,20%的2处理
upstream backend {
server 10.0.0.1:8080 weight=3 max_fails=3 fail_timeout=30s;
server 10.0.0.2:8080 weight=2 max_fails=3 fail_timeout=30s;
}
3.ip_hash
每个请求按照IP的hash结果分配,同一个IP客户端访问一个固定的后端服务器。
优点:可以保证来自同一个IP的请求,被打到固定的机器上,可以解决session的问题。
#负载中有三台服务器,当请求到达时,nginx会优先按照ip_hash的结果进行分配,其他则按照时间顺序把请求分配给三台服务器处理。
upstream serverList {
ip_hash
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
}
4.url_hash
按访问url的hash结果来分配请求,相同url固定转发到同一个后端服务器进行处理。
upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
hash $request_uri;
hash_method crc32;
}
5.fair
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
fair;
}
每种模式可携带的参数有:
- down:当前服务器暂不参与负载;
- weight:权重,值越大,服务器的负载量越大;
- max_fails:允许请求失败的次数,默认为1;
- fail_timeout:max_fails次失败后暂停的时间;
- backup:备份机,只有其他所有的非backup机器down或者忙时才会请求backup机器。
# 负载中三台服务器,服务器4的失败超时时间 60s,服务器5暂不参与负载,服务器6只是作为备份机。
# upstream:是负载的配置模块,serverList是名称,随便起
upstream serverList {
server 1.2.3.4 fail_timeout=60s;
server 1.2.3.5 down;
server 1.2.3.6 backup;
}
HTTP 服务器
也就是静态 web 服务器
server {
listen ;
server_name www.xxx.com; #静态网站访问的域名地址;
client_max_body_size 1024M;
location / {
root /var/www/static; #直接静态项目绝对路径的根目录;
index index.html;
}
}
3.Nginx 调优
调整工作进程和线程数
1.作用:定义 Nginx 启动的工作进程数量(处理请求的核心单元)。
推荐值:
CPU 密集型场景:设置为与 CPU 物理核心数相同(或 auto 自动检测)。
I/O 密集型场景(如高延迟后端):可适当增加(如 CPU核心数 × 2)。
2.配置示例
worker_processes
# /etc/nginx/nginx.conf
worker_processes auto; # 自动检测 CPU 核心数
或手动指定
worker_processes 8; # 8 核服务器
验证 CPU 核心数
grep processor /proc/cpuinfo | wc -l # 查看逻辑 CPU 核心数
worker_connections
events {
worker_connections 10240; # 单个进程允许 10240 个连接
use epoll; # Linux 高性能事件模型(必选)
multi_accept on; # 同时接受多个新连接
}
- 总并发连接数 =
worker_processes × worker_connections
优化文件句柄
1.📌 为什么需要优化文件句柄?
高并发场景下的瓶颈
- 每个 TCP 连接、静态文件访问、反向代理连接都会消耗文件句柄。
- 默认限制较低(通常 1024 或 4096),导致 Nginx 在并发量高时抛出
Too many open files
错误,拒绝新请求。
影响范围
- 静态文件服务:每个文件读取占用一个句柄。
- 反向代理:每个后端连接占用一个句柄。
- 长连接(Keepalive):保持的连接持续占用句柄。
2.配置示例
events {
worker_connections 10240; # 建议值:1万~5万(需结合系统限制调整)
}
临时修改
ulimit -n 65535 # 设置当前会话的文件句柄数上限
永久生效
修改 /etc/security/limits.conf
# 针对所有用户
* soft nofile 65535
* hard nofile 65535
# 针对 Nginx 用户(如 www-data)
www-data soft nofile 65535
www-data hard nofile 65535
3.验证是否生效
ab -n 1000 -c 300 http://lipeilong.space:31392/
启用 Gzip 压缩
在 Nginx 中启用 Gzip 压缩 可以显著减少传输数据量,提升网页加载速度(尤其是文本类资源)
1.配置示例
http {
gzip on; # 启用 Gzip 压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024; # 最小压缩文件大小(小于此值不压缩)
gzip_comp_level 6; # 压缩级别(1-9,6 是性价比最高的级别)
gzip_vary on; # 添加 Vary: Accept-Encoding 响应头
}
2.参数说明
指令 | 作用 |
---|---|
gzip on | 开启 Gzip 压缩功能。 |
gzip_types | 指定需要压缩的 MIME 类型(默认只压缩 text/html ,需手动添加其他类型)。 |
gzip_min_length | 仅压缩大于此值的文件(单位:字节,避免小文件压缩后反而变大)。 |
gzip_comp_level | 压缩级别(1 速度最快压缩率低,9 速度最慢压缩率高,推荐 6)。 |
gzip_vary | 告知客户端支持压缩,避免代理服务器返回未压缩内容。 |
3.验证是否开启gzip
curl -H "Accept-Encoding: gzip" -I http://www.lipeilong.space:31392/
含有Content-Encoding: gzip字段,代表已经开启 gzip 压缩
Nginx 缓存
在 Nginx 中配置缓存可以显著提升网站性能,尤其是对静态资源(如 CSS、JS、图片)和动态内容的加速
📌 1.缓存类型及适用场景
缓存类型 | 适用场景 | 优势 |
---|---|---|
静态资源缓存 | CSS/JS/图片等静态文件 | 减少带宽消耗,提升加载速度 |
代理缓存 | 反向代理动态内容(如API、PHP页面) | 降低后端压力,加速动态内容响应 |
浏览器缓存 | 控制客户端缓存行为 | 减少重复请求,提升用户体验 |
# 在 http 块中添加(一般放在 nginx.conf 顶部)
http {
# 静态资源缓存(图片/CSS/JS等)
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:50m inactive=7d use_temp_path=off;
gzip_static on; # 优先使用预压缩文件(需提前生成 .gz 文件)
}
# 在 server 块中添加(你的站点配置中)
server {
listen 80;
server_name yourdomain.com;
root /var/www/html;
# 静态文件缓存(1年)
location ~* \.(css|js|jpg|jpeg|png|gif|ico|woff2|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
try_files $uri =404;
}
# 动态内容缓存(10分钟)
location / {
proxy_pass http://localhost:3000; # 你的后端服务地址
proxy_cache my_cache;
proxy_cache_valid 200 302 10m; # 缓存200/302响应10分钟
proxy_cache_valid 404 1m; # 缓存404响应1分钟
add_headZZche-Status $upstream_cache_status; # 调试用
}
# 禁止缓存HTML(适合频繁更新的页面)
location ~ \.html$ {
add_header Cache-Control "no-cache, must-revalidate";
expires 0;
}
}
2.验证是否生效
通过相应头检查
# 第一次请求(应返回MISS)
curl -I http://lipeilong.space:31391/umi.fcd9e33e.css | grep -E "X-Cache-Status|Cache-Control"
# 第二次请求(应返回HIT)
curl -I http://lipeilong.space:31391/umi.fcd9e33e.css | grep -E "X-Cache-Status|Cache-Control"
对比响应时间
# 首次请求(较慢)
time curl -s -o /dev/null http://lipeilong.space:31391/umi.fcd9e33e.css
# 后续请求(应极快)
time curl -s -o /dev/null http://lipeilong.space:31391/umi.fcd9e33e.css
开启高性能传输模式
http {
# 零拷贝技术(内核直接传输文件)
sendfile on;
# 合并数据包减少网络报文(需配合sendfile)
tcp_nopush on;
# 禁用Nagle算法(降低小包延迟)
tcp_nodelay on;
# 启用Linux 3.10+内核特性(DIRECTIO绕过页缓存)
aio threads;
directio 4m; # 大于4MB文件使用直接IO
# 内存映射文件加速(静态资源)
map $sent_http_content_type $file_mmap {
default off;
application/pdf on;
image/* on;
video/* on;
}
}
隐藏版本号
server_tokens off;
防盗链
http {
# 1. 定义合法的Referer来源(所有server共享)
map $http_referer $invalid_referer {
default 1; # 默认拦截
"~*yourdomain\.com" 0; # 主域名白名单
"~*google\.com" 0; # 允许搜索引擎
"" 0; # 允许空Referer(直接访问)
}
# 2. 全局静态资源防盗链(作用于所有server块)
server {
# 匹配常见静态资源扩展名
location ~* \.(jpg|jpeg|png|gif|mp4|zip|pdf|css|js)$ {
if ($invalid_referer) {
# 策略1:返回403
return 403 "Forbidden: Hotlinking not allowed";
# 策略2:替换为警告图片
# rewrite ^ /static/anti-leech.jpg last;
}
}
}
}
4.其它应用
1.nginx访问做加密
server {
listen 80;
server_name example.com;
# 启用基础认证
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd; # 确保路径正确
location / {
proxy_pass http://backend;
}
}
# 安装 htpasswd 工具(如果未安装)
sudo yum install httpd-tools -y
# 重新生成密码文件(-c 表示新建,后续添加用户不要加 -c)
sudo htpasswd -c /etc/nginx/.htpasswd lipl
# 按提示输入密码(如 lpl...)