Nginx 高性能架构解析

打印 上一主题 下一主题

主题 911|帖子 911|积分 2733

本文详细探讨了Nginx的反向署理、负载平衡和性能优化技能,包括设置优化、体系优化、缓存机制和高并发处置惩罚策略,旨在帮助专业从业者深入理解并有效应用Nginx。
关注TechLead,复旦博士,分享云服务领域全维度开发技能。拥有10+年互联网服务架构、AI产物研发经验、团队管理经验,复旦机器人智能实验室成员,国家级大学生赛事评审专家,发表多篇SCI核心期刊学术论文,阿里云认证的资深架构师,上亿营收AI产物研发负责人。

1. Nginx简介与核心架构


1.1 Nginx简介

Nginx (engine x) 是一个高性能的 HTTP 和反向署理服务器,也是一个 IMAP/POP3/SMTP 邮件署理服务器。由 Igor Sysoev 于2004年初次发布,其设计目标是办理 C10K 问题,即在一台服务器上同时处置惩罚一万个并发连接。Nginx 以其高并发处置惩罚能力、低资源消耗和模块化设计而闻名,广泛应用于 Web 服务器、反向署理、负载平衡等场景。
1.1.1 主要特性


  • 高并发处置惩罚能力:Nginx 使用异步、非阻塞事件驱动架构,能够高效地处置惩罚大量并发连接。
  • 低资源消耗:相对于传统的进程或线程模子,Nginx 使用更少的内存和 CPU 资源。
  • 模块化设计:Nginx 的功能通过模块实现,用户可以根据需求加载差异的模块。
  • 高可扩展性:通过第三方模块和 Lua 脚本,Nginx 能够轻松扩展其功能。
  • 丰富的功能:支持 HTTP/2、反向署理、负载平衡、缓存、SSL/TLS、WebSocket 等。
1.2 核心架构

Nginx 的核心架构设计是其高性能和高可用性的关键。核心架构包括模块化设计、事件驱动模子、Master-Worker 进程模子和高效的请求处置惩罚流程。
1.2.1 模块化设计

Nginx 接纳模块化设计,核心功能和扩展功能都通过模块实现。模块分为核心模块、尺度 HTTP 模块和第三方模块。用户可以根据需要启用或禁用模块,机动设置 Nginx 的功能。

  • 核心模块:实现 Nginx 的基本功能,如事件处置惩罚、内存管理、设置解析等。
  • 尺度 HTTP 模块:提供 HTTP 服务的功能,如静态文件服务、反向署理、负载平衡等。
  • 第三方模块:由社区或开发者提供,扩展 Nginx 的功能,如 Lua 模块、Redis 模块等。
  1. # 配置示例:启用和配置 HTTP 模块
  2. http {
  3.     server {
  4.         listen 80;
  5.         server_name example.com;
  6.         
  7.         location / {
  8.             root /var/www/html;
  9.             index index.html index.htm;
  10.         }
  11.         
  12.         location /proxy {
  13.             proxy_pass http://backend_server;
  14.         }
  15.     }
  16. }
复制代码
1.2.2 事件驱动模子

Nginx 使用异步、非阻塞事件驱动模子,能够高效地处置惩罚并发连接。事件驱动模子基于 epoll(Linux)、kqueue(FreeBSD)等高效的 I/O 多路复用机制,实现事件的高效分发和处置惩罚。

  • 异步非阻塞:全部 I/O 操作都通过事件通知机制完成,不会阻塞进程。
  • 高效的事件分发:通过 epoll、kqueue 等机制,Nginx 能够快速分发和处置惩罚大量并发连接的事件。
  1. // 示例:基于 epoll 的事件循环
  2. for (;;) {
  3.     int n = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
  4.     for (int i = 0; i < n; i++) {
  5.         if (events[i].events & EPOLLIN) {
  6.             // 处理读事件
  7.         } else if (events[i].events & EPOLLOUT) {
  8.             // 处理写事件
  9.         }
  10.     }
  11. }
复制代码
1.2.3 Master-Worker 进程模子

Nginx 接纳 Master-Worker 进程模子,确保高并发处置惩罚能力和高可靠性。Master 进程负责管理 Worker 进程,处置惩罚信号和管理共享资源。Worker 进程处置惩罚现实的请求,互不干扰,进步了并发处置惩罚能力和稳固性。

  • Master 进程:启动、克制 Worker 进程,处置惩罚信号(如重新加载设置),管理共享资源(如缓存)。
  • Worker 进程:处置惩罚客户端请求,每个 Worker 进程独立处置惩罚差异的连接,克制相互影响。
  1. # 配置示例:设置 Worker 进程数量
  2. worker_processes auto;
  3. events {
  4.     worker_connections 1024;
  5. }
复制代码
1.2.4 请求处置惩罚流程

Nginx 的请求处置惩罚流程高度优化,能够高效地处置惩罚 HTTP 请求。主要流程包括吸收请求、解析请求、选择处置惩罚模块、生成响应和发送响应。

  • 吸收请求:通过事件驱动模子吸收客户端请求。
  • 解析请求:解析 HTTP 请求头,生成请求上下文。
  • 选择处置惩罚模块:根据设置选择相应的模块处置惩罚请求,如静态文件服务、反向署理等。
  • 生成响应:调用处置惩罚模块生成响应数据。
  • 发送响应:通过事件驱动模子发送响应给客户端。
  1. # 配置示例:静态文件服务和反向代理
  2. http {
  3.     server {
  4.         listen 80;
  5.         server_name example.com;
  6.         location / {
  7.             root /var/www/html;
  8.             index index.html index.htm;
  9.         }
  10.         location /proxy {
  11.             proxy_pass http://backend_server;
  12.         }
  13.     }
  14. }
复制代码
2. Nginx反向署理与负载平衡

2.1 反向署理底子

反向署理服务器在客户端和服务器之间充当中介,吸收客户端的请求并将其转发给后端服务器,然后将后端服务器的响应返回给客户端。Nginx 作为反向署理服务器的优势在于其高并发处置惩罚能力、机动的设置和丰富的功能。
2.1.1 反向署理的优势


  • 隐藏后端服务器:反向署理隐藏了后端服务器的真实 IP 和端口,提升了安全性。
  • 负载平衡:反向署理可以将请求分发到多台后端服务器,实现负载平衡。
  • 缓存:反向署理服务器可以缓存后端服务器的响应,淘汰后端服务器的压力,进步响应速度。
  • SSL 终止:反向署理服务器可以处置惩罚 SSL/TLS 加密,减轻后端服务器的负担。
2.1.2 反向署理设置示例
  1. http {
  2.     upstream backend {
  3.         server backend1.example.com;
  4.         server backend2.example.com;
  5.     }
  6.     server {
  7.         listen 80;
  8.         server_name example.com;
  9.         location / {
  10.             proxy_pass http://backend;
  11.             proxy_set_header Host $host;
  12.             proxy_set_header X-Real-IP $remote_addr;
  13.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  14.             proxy_set_header X-Forwarded-Proto $scheme;
  15.         }
  16.     }
  17. }
复制代码
2.2 负载平衡策略

Nginx 支持多种负载平衡策略,能够根据差异的需求选择符合的策略将请求分发到后端服务器。
2.2.1 轮询 (Round Robin)

轮询是 Nginx 的默认负载平衡策略,将请求依次分发到每台后端服务器。该策略简单高效,适用于后端服务器性能平衡的情况。
  1. upstream backend {
  2.     server backend1.example.com;
  3.     server backend2.example.com;
  4. }
复制代码
2.2.2 最少连接 (Least Connections)

最少连接策略将请求分发到当前运动连接数最少的服务器,适用于后端服务器性能不平衡的情况。
  1. upstream backend {
  2.     least_conn;
  3.     server backend1.example.com;
  4.     server backend2.example.com;
  5. }
复制代码
2.2.3 IP 哈希 (IP Hash)

IP 哈希策略根据客户端 IP 计算哈希值,将同一客户端的请求分发到同一台服务器,适用于需要会话保持的场景。
  1. upstream backend {
  2.     ip_hash;
  3.     server backend1.example.com;
  4.     server backend2.example.com;
  5. }
复制代码
2.2.4 权重 (Weight)

权重策略为每台服务器设置权重,权重越高,服务器吸收到的请求越多,适用于后端服务器性能不平衡且需要手动调整分配比例的情况。
  1. upstream backend {
  2.     server backend1.example.com weight=3;
  3.     server backend2.example.com weight=1;
  4. }
复制代码
2.3 设置实例

下面提供几个反向署理和负载平衡的现实设置示例,以帮助理解和应用这些概念。
2.3.1 基本反向署理设置
  1. server {
  2.     listen 80;
  3.     server_name example.com;
  4.     location / {
  5.         proxy_pass http://backend1.example.com;
  6.         proxy_set_header Host $host;
  7.         proxy_set_header X-Real-IP $remote_addr;
  8.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9.         proxy_set_header X-Forwarded-Proto $scheme;
  10.     }
  11. }
复制代码
2.3.2 动静分离设置

动静分离是指将动态请求和静态请求分别处置惩罚,以进步效率。Nginx 可以将静态文件请求直接由 Nginx 处置惩罚,而将动态请求转发给后端服务器。
  1. server {
  2.     listen 80;
  3.     server_name example.com;
  4.     location / {
  5.         proxy_pass http://backend1.example.com;
  6.         proxy_set_header Host $host;
  7.         proxy_set_header X-Real-IP $remote_addr;
  8.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9.         proxy_set_header X-Forwarded-Proto $scheme;
  10.     }
  11.     location /static/ {
  12.         root /var/www/html;
  13.         expires 30d;
  14.     }
  15. }
复制代码
2.3.3 负载平衡设置
  1. upstream backend {
  2.     server backend1.example.com;
  3.     server backend2.example.com;
  4. }server {    listen 80;    server_name example.com;    location / {        proxy_pass http://backend;        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;    }}
复制代码
2.4 康健查抄

Nginx 还可以对后端服务器进行康健查抄,确保请求不会分发到不可用的服务器。通过设置 ngx_http_upstream_module 模块,可以实现简单的康健查抄功能。
  1. upstream backend {
  2.     server backend1.example.com;
  3.     server backend2.example.com;
  4.     server backend3.example.com down;
  5. }
  6. server {
  7.     listen 80;
  8.     server_name example.com;
  9.     location / {
  10.         proxy_pass http://backend;
  11.     }
  12. }
复制代码
在此设置中,backend3.example.com 被标记为 down,Nginx 将不会将请求分发到这台服务器。更高级的康健查抄可以通过第三方模块如 ngx_http_upstream_check_module 实现。
2.5 高级反向署理设置

2.5.1 缓存设置

Nginx 可以作为缓存服务器,通过缓存后端服务器的响应,淘汰后端服务器的负担,提升响应速度。
  1. proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
  2. server {
  3.     listen 80;
  4.     server_name example.com;
  5.     location / {
  6.         proxy_cache my_cache;
  7.         proxy_pass http://backend;
  8.         proxy_set_header Host $host;
  9.         proxy_set_header X-Real-IP $remote_addr;
  10.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11.         proxy_set_header X-Forwarded-Proto $scheme;
  12.     }
  13. }
复制代码
2.5.2 SSL 终止

Nginx 可以处置惩罚 SSL/TLS 加密,解密客户端请求后将其转发给后端服务器,减轻后端服务器的加密负担。
  1. server {
  2.     listen 443 ssl;
  3.     server_name example.com;
  4.     ssl_certificate /etc/nginx/ssl/nginx.crt;
  5.     ssl_certificate_key /etc/nginx/ssl/nginx.key;
  6.     location / {
  7.         proxy_pass http://backend;
  8.         proxy_set_header Host $host;
  9.         proxy_set_header X-Real-IP $remote_addr;
  10.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11.         proxy_set_header X-Forwarded-Proto $scheme;
  12.     }
  13. }
复制代码
3. Nginx性能优化

Nginx 以其高性能和高并发处置惩罚能力著称,但在现实应用中,合理的性能优化策略仍能明显提升其性能。本文将详细探讨 Nginx 的性能优化方法,包括设置优化、体系优化、缓存机制和高并发优化。
3.1 设置优化

Nginx 的设置对其性能有着至关紧张的影响。合理的设置可以淘汰资源消耗,进步处置惩罚效率。
3.1.1 Worker 进程设置

Nginx 的 worker_processes 参数决定了处置惩罚请求的工作进程数量。一般建议将其设置为等于服务器的 CPU 核心数,以充分利用多核 CPU 的并行处置惩罚能力。
  1. worker_processes auto;
复制代码
auto 表示自动检测 CPU 核心数,并设置相应数量的工作进程。
3.1.2 Worker 连接数设置

worker_connections 参数决定了每个工作进程可以处置惩罚的最大连接数。为了进步并发处置惩罚能力,建议将其设置为尽大概大的值。
  1. events {
  2.     worker_connections 1024;
  3. }
复制代码
这个设置表示每个工作进程最多可以处置惩罚 1024 个并发连接。
3.1.3 缓存设置

Nginx 提供多种缓存机制,可以缓存后端服务器的响应,淘汰后端服务器的压力,进步响应速度。常用的缓存机制包括 FastCGI 缓存和署理缓存。
  1. proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
  2. server {
  3.     listen 80;
  4.     server_name example.com;
  5.     location / {
  6.         proxy_cache my_cache;
  7.         proxy_pass http://backend;
  8.         proxy_set_header Host $host;
  9.         proxy_set_header X-Real-IP $remote_addr;
  10.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11.         proxy_set_header X-Forwarded-Proto $scheme;
  12.     }
  13. }
复制代码
这个设置创建了一个缓存区域 my_cache,并在反向署理时启用了缓存。
3.2 体系优化

除了 Nginx 的设置优化,对操作体系的优化也能明显进步 Nginx 的性能。
3.2.1 文件形貌符限制

Nginx 处置惩罚大量并发连接时,需要打开大量的文件形貌符。默认的文件形貌符限制大概不足,需通过修改体系设置进步限制。
  1. # 临时修改
  2. ulimit -n 65535
  3. # 永久修改,编辑 /etc/security/limits.conf
  4. * soft nofile 65535
  5. * hard nofile 65535
复制代码
3.2.2 TCP 连接优化

调整 TCP 连接参数,可以淘汰网络延迟,进步并发处置惩罚能力。
  1. # 调整内核参数,编辑 /etc/sysctl.conf
  2. net.core.somaxconn = 65535
  3. net.core.netdev_max_backlog = 65535
  4. net.ipv4.tcp_max_syn_backlog = 65535
  5. net.ipv4.ip_local_port_range = 1024 65535
  6. net.ipv4.tcp_tw_reuse = 1
  7. net.ipv4.tcp_fin_timeout = 30
  8. # 应用配置
  9. sysctl -p
复制代码
3.3 缓存机制

缓存是提升 Nginx 性能的紧张手段。通过缓存机制,Nginx 可以将后端服务器的响应存储在本地,淘汰后端服务器的负载。
3.3.1 FastCGI 缓存

FastCGI 缓存用于缓存 FastCGI 应用步伐的响应,比方 PHP。
  1. fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fastcgi_cache:10m inactive=60m;
  2. fastcgi_cache_key "$scheme$request_method$host$request_uri";
  3. server {
  4.     location ~ \.php$ {
  5.         fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
  6.         fastcgi_index index.php;
  7.         include fastcgi_params;
  8.         fastcgi_cache fastcgi_cache;
  9.         fastcgi_cache_valid 200 60m;
  10.         fastcgi_cache_use_stale error timeout invalid_header updating;
  11.     }
  12. }
复制代码
3.3.2 署理缓存

署理缓存用于缓存反向署理的响应,淘汰后端服务器的负载。
  1. proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
  2. server {
  3.     location / {
  4.         proxy_cache my_cache;
  5.         proxy_pass http://backend;
  6.         proxy_set_header Host $host;
  7.         proxy_set_header X-Real-IP $remote_addr;
  8.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9.         proxy_set_header X-Forwarded-Proto $scheme;
  10.     }
  11. }
复制代码
3.4 高并发优化

Nginx 在处置惩罚高并发连接时,通过异步非阻塞的事件驱动模子,能够高效地处置惩罚大量并发连接。以下是一些针对高并发场景的优化策略。
3.4.1 启用 keepalive

keepalive 可以保持客户端和服务器之间的连接,进步连接重用率,淘汰连接创建和释放的开销。
  1. upstream backend {
  2.     server backend1.example.com;
  3.     server backend2.example.com;
  4.     keepalive 32;
  5. }
  6. server {
  7.     location / {
  8.         proxy_pass http://backend;
  9.         proxy_http_version 1.1;
  10.         proxy_set_header Connection "";
  11.     }
  12. }
复制代码
3.4.2 调整缓冲区大小

调整 Nginx 的缓冲区大小,可以进步大文件传输的效率,淘汰内存碎片。
  1. http {
  2.     server {
  3.         client_body_buffer_size 16K;
  4.         client_header_buffer_size 1k;
  5.         large_client_header_buffers 4 16k;
  6.         output_buffers 1 32k;
  7.         postpone_output 1460;
  8.     }
  9. }
复制代码
3.4.3 启用 Gzip 压缩

启用 Gzip 压缩,可以淘汰传输的数据量,进步响应速度。
  1. http {
  2.     gzip on;
  3.     gzip_types text/plain application/xml;
  4.     gzip_min_length 1000;
  5.     gzip_comp_level 5;
  6. }
复制代码
如有帮助,请多关注
TeahLead KrisChang,10+年的互联网和人工智能从业经验,10年+技能和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产物业务负责人。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表