lipl

记录精彩的程序人生

Open Source, Open Mind,
Open Sight, Open Future!
  menu
8 文章
0 浏览
0 当前访客
ღゝ◡╹)ノ❤️

nginx 详解

nginx 详解

[TOC]

1.什么是 Nginx?

1.高性能Web服务器
Nginx采用事件驱动的异步非阻塞架构,能高效处理静态文件请求,单台服务器可支持30,000至50,000个并发连接,显著优于传统服务器如Apache
2.反向代理与负载均衡
作为反向代理服务器,Nginx可隐藏后端服务器并分配流量,支持轮询、加权轮询等策略,适用于高并发场景如电商秒杀或直播
官网:https://nginx.org

2.Nginx 可以做什么?

  1. 正向代理
  2. 反向代理
  3. 负载均衡
  4. 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;
}

每种模式可携带的参数有:

  1. down:当前服务器暂不参与负载;
  2. weight:权重,值越大,服务器的负载量越大;
  3. max_fails:允许请求失败的次数,默认为1;
  4. fail_timeout:max_fails次失败后暂停的时间;
  5. 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...)

标题:nginx 详解
作者:lipl666
地址:http://www.lipeilong.space:8088/articles/2025/09/05/1757054605987.html