Nginx 的讲解和案例示范

一、基础理解

1.1 Nginx 是什么?

Nginx是一个高性能的 Web 服务器和反向代理服务器,同时也可以作为邮件代理服务器。Nginx 以其高并发处理能力、低内存消耗和丰富的功能受到广泛欢迎。

主要功能:
  • 静态资源服务:高效地提供 HTML、CSS、JavaScript、图片等静态资源。
  • 反向代理:将客户端请求转发到后端服务器并将响应返回给客户端。
  • 负载均衡:在多台服务器之间分配请求,以提高可用性和可靠性。
  • HTTP 缓存:对响应进行缓存以减少后端负载和加速响应速度。
  • SSL/TLS 加密:支持 HTTPS 协议,提供安全的传输通道。

1.2 Nginx 的工作原理

Nginx 的工作原理基于事件驱动模型,这使其能够高效地处理大量并发连接。与传统的多进程或多线程模型不同,Nginx 使用了非阻塞 I/O 操作,通过单个线程处理多个请求,降低了系统资源的占用。

  • 事件循环:Nginx 在后台使用事件循环监听连接请求,并在数据可读或可写时执行相关处理。
  • 异步处理:通过非阻塞方式,Nginx 可以在等待 I/O 操作的同时处理其他请求,提高了整体吞吐量。
  • 模块化架构:Nginx 的功能通过模块进行扩展,可以根据需要选择加载不同的模块,从而实现灵活的功能组合。

二、反向代理

2.1 什么是反向代理?

反向代理是指代理服务器接收客户端请求并将其转发到内部服务器,再将服务器的响应返回给客户端。与正向代理不同,客户端并不知道请求是通过代理进行的。

2.2 Nginx 如何实现反向代理?

在 Nginx 中实现反向代理非常简单,只需在配置文件中使用 proxy_pass 指令。

server {listen 80;server_name example.com;location / {proxy_pass http://backend_server;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_pass:指定后端服务器的地址。
  • proxy_set_header:设置请求头,将客户端的信息传递给后端服务器。

2.3 反向代理的好处

  • 负载均衡:通过将请求分发到多台服务器,提高整体处理能力。
  • 安全性:隐藏内部服务器的真实 IP,增加安全性。
  • 统一入口:提供统一的访问入口,便于管理和监控。
  • 缓存:在代理服务器上缓存响应,减轻后端压力并加快响应速度。

三、负载均衡

3.1 Nginx 的负载均衡策略

Nginx 提供了多种负载均衡策略,以下是主要策略的详细说明及其具体配置示例:

  • 轮询(Round Robin)

    • 描述:请求依次分配给后端服务器。

    • 配置示例 :

      upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
      }server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
      }
      
    • 说明:上述配置将客户端请求按顺序分配给 backend1backend2backend3

  • 最少连接(Least Connections)

    • 描述:将请求分配给当前连接数最少的服务器。

    • 配置示例:

      upstream backend {least_conn;  # 使用最少连接策略server backend1.example.com;server backend2.example.com;server backend3.example.com;
      }server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
      }
      
    • 说明:配置中加入 least_conn,Nginx 将优先将请求转发到当前连接数最少的服务器。

  • IP 哈希(IP Hash)

    • 描述:根据客户端的 IP 地址计算哈希值,将请求分配给特定的后端服务器。

    • 配置示例:

      upstream backend {ip_hash;  # 使用 IP 哈希策略server backend1.example.com;server backend2.example.com;server backend3.example.com;
      }server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
      }
      
    • 说明:每个来自相同 IP 的请求将始终被发送到同一台后端服务器,适用于需要保持会话的场景。

  • 加权轮询(Weighted Round Robin)

    • 描述:为后端服务器设置不同的权重,权重越高的服务器接收的请求越多。

    • 配置示例:

      upstream backend {server backend1.example.com weight=3;  # 权重3server backend2.example.com weight=2;  # 权重2server backend3.example.com weight=1;  # 权重1
      }server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
      }
      
    • 说明:权重配置后,Nginx 将按照指定的比例分配请求,例如 backend1 将接收大约 50% 的请求,而 backend3 仅接收约 16.67% 的请求。

3.2 负载均衡策略的适用场景

  • 轮询:适用于服务器性能相似的简单网站,如内容展示型网站。
  • 最少连接:适合处理复杂请求的应用,如文件上传或数据处理服务,确保负载均匀分配。
  • IP 哈希:适合需要会话保持的应用,如电商购物车、社交网站,确保用户请求持续到同一服务器。
  • 加权轮询:适合服务器性能差异明显的情况,比如一台高配置服务器与多台低配置服务器共同处理请求。

3.3 配置 Nginx 的负载均衡

以下是完整的 Nginx 配置示例,展示如何实现负载均衡:

http {upstream backend {server backend1.example.com weight=3;  # 高性能服务器server backend2.example.com;            # 中等性能服务器server backend3.example.com weight=1;  # 低性能服务器}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;  # 真实客户端 IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 转发 IP}}
}
配置详解:
  • upstream backend:定义了后端服务器组,其中包括三台服务器,并为它们设置了不同的权重。
  • listen 80:指示 Nginx 在 80 端口监听 HTTP 请求。
  • proxy_pass:将请求转发到定义的后端服务器组。
  • proxy_set_header:设置请求头信息,确保后端能够获取真实的客户端信息。

四、静态资源服务

4.1 Nginx 作为静态资源服务器的优势

  • 高性能:Nginx 采用事件驱动架构,可以同时处理大量并发请求。
  • 低内存消耗:使用极少的内存资源处理请求,适合于高并发场景。
  • 高效的缓存机制:能够快速响应静态资源请求,减少后端服务器的压力。

4.2 优化 Nginx 对静态资源的处理

为了优化 Nginx 对静态资源的处理,可以采取以下措施:

  • 开启 Gzip 压缩:通过压缩响应内容,减少传输数据量。
  • 设置缓存:使用 expires 指令设置缓存时间,减少不必要的请求。
  • 使用 HTTP/2:支持更高效的请求/响应处理。

示例配置:

server {listen 80;server_name example.com;location /static/ {alias /var/www/static/;expires 30d;gzip on;gzip_types text/css application/javascript;}
}

五、性能优化

5.1 Nginx 性能优化的了解

Nginx 性能优化可以通过多种方式进行,包括调整配置参数、优化请求处理等。

  • 工作进程:根据服务器 CPU 核心数设置工作进程数,通常设置为与 CPU 核心数相同。
  • keepalive:配置保持连接的时间,减少连接建立的开销。
  • 优化缓冲区:调整 client_body_buffer_sizeproxy_buffer_size 等参数。

5.2 Nginx 如何处理高并发请求

Nginx 通过异步处理和事件驱动模型,能够高效处理大量并发请求。此外,合理配置缓存和负载均衡,可以进一步提升系统的响应能力。

示例优化配置:

worker_processes auto;
events {worker_connections 1024;
}
http {keepalive_timeout 65;
}

六、实际应用

6.1 项目中使用 Nginx 的案例

在一个在线教育平台中,Nginx 被用作反向代理和负载均衡器,管理来自数千用户的并发请求。系统架构包括多台应用服务器和一台数据库服务器。

实际案例:
  1. 初始配置:项目初期,使用简单的轮询策略进行负载均衡,配置如下:

    upstream backend {server app1.example.com;server app2.example.com;
    }server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
    }
    
  2. 问题识别:随着用户量增加,系统开始出现响应延迟。通过监控发现某些服务器的 CPU 使用率异常高,导致请求处理缓慢。

  3. 优化方案:将负载均衡策略从轮询改为最少连接,并增加服务器实例。新的配置如下:

    upstream backend {least_conn;  # 使用最少连接策略server app1.example.com;server app2.example.com;server app3.example.com;  # 新增服务器
    }server {listen 80;server_name example.com;location / {proxy_pass http://backend;}
    }
    
  4. 结果:优化后,用户请求的响应时间显著下降,系统在高并发情况下的稳定性得到了提高。

6.2 Nginx 故障排查

在实际应用中,Nginx 可能会出现一些常见故障。及时排查和解决这些问题非常重要。

故障排查步骤:
  1. 502 Bad Gateway

    • 描述:表示后端服务器不可用,通常发生在后端服务崩溃或未响应时。

    • 排查方法:

      • 检查后端服务状态,确保其正常运行。
      • 查看 Nginx 错误日志,通常位于 /var/log/nginx/error.log,寻找相关错误信息。
  2. 403 Forbidden

    • 描述:请求被拒绝,可能是由于权限问题。

    • 排查方法 :

      • 检查 Nginx 配置文件中的权限设置,确保 location 块中的路径正确。
      • 确保文件或目录的访问权限正确,Nginx 有权访问相关资源。
  3. 504 Gateway Timeout

    • 描述:后端服务器响应超时。

    • 排查方法:

      • 检查后端服务的性能,确保其在合理的时间内处理请求。

      • 增加 Nginx 的超时设置,例如

        proxy_read_timeout 60s;  # 设置读取响应的超时时间
        

通过上述案例和故障排查步骤,能够更有效地利用 Nginx 的负载均衡功能,提升系统的性能和可用性。

七、如何实现 HTTPS

7.1 HTTPS 简介

HTTPS(超文本传输安全协议)是对 HTTP 的安全扩展,通过 SSL/TLS 协议为 HTTP 提供加密传输,确保数据在客户端和服务器之间的安全传输。使用 HTTPS 可以防止数据在传输过程中被窃取或篡改,提高用户的信任度。

7.2 Nginx 中实现 HTTPS 的步骤

要在 Nginx 中实现 HTTPS,需要遵循以下步骤:

  1. 获取 SSL 证书:可以从受信任的证书颁发机构(CA)获取 SSL 证书,或者使用自签名证书进行测试。
  2. 配置 Nginx:在 Nginx 配置文件中添加 SSL 配置。
  3. 重定向 HTTP 到 HTTPS:确保所有 HTTP 请求都重定向到 HTTPS。

7.3 配置示例

以下是一个完整的 Nginx 配置示例,展示如何配置 HTTPS:

server {listen 80;server_name example.com;# 重定向所有 HTTP 请求到 HTTPSreturn 301 https://$host$request_uri;
}server {listen 443 ssl;  # 监听 HTTPS 端口server_name example.com;# SSL 配置ssl_certificate /etc/ssl/certs/example.crt;  # SSL 证书路径ssl_certificate_key /etc/ssl/private/example.key;  # SSL 密钥路径# 强化 SSL 设置ssl_protocols TLSv1.2 TLSv1.3;  # 支持的 TLS 协议ssl_ciphers HIGH:!aNULL:!MD5;  # 选择的加密算法ssl_prefer_server_ciphers on;  # 优先使用服务器端的加密算法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;}
}

7.4 配置详解

  • HTTP 重定向
    • 首先,设置一个服务器块,监听 80 端口,将所有 HTTP 请求重定向到 HTTPS。
    • 使用 return 301 https://$host$request_uri; 实现 301 重定向,确保用户访问时自动转到安全的 HTTPS 地址。
  • HTTPS 配置
    • 在第二个服务器块中,使用 listen 443 ssl; 指定监听 443 端口,并启用 SSL。
    • ssl_certificatessl_certificate_key 分别指定 SSL 证书和密钥的路径。
    • 配置 ssl_protocolsssl_ciphers 来增强安全性,确保使用强加密。
  • 代理设置
    • proxy_pass 指令将 HTTPS 请求代理到后端服务器,保持应用的原有逻辑。
    • proxy_set_header 指令确保在转发请求时,保持客户端真实的请求信息。

7.5 测试和验证

配置完成后,可以通过以下步骤进行测试:

  1. 重启 Nginx:使用命令 sudo systemctl restart nginx 重启 Nginx,以使配置生效。
  2. 访问网站:在浏览器中输入 https://example.com,查看是否能成功加载网页,并检查地址栏是否显示安全锁标志。
  3. SSL 测试工具:使用在线 SSL 测试工具(如 SSL Labs)检查配置的安全性,查看 SSL 证书和配置是否合规。

通过以上步骤,Nginx 可以有效地实现 HTTPS,加密用户与服务器之间的通信,提升网站的安全性和用户信任度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用?小结:同步调用优缺点 1-2 异步调用什么是异步调用?小结:异步调用的优缺点,什么时候使用异步调用? 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

记录一次mmpretrain训练数据并转onnx推理

目录 1.前言 2.代码 3.数据形态【分类用】 4.配置文件 5.训练 6.测试-分析-混淆矩阵等等,测试图片效果等 7.导出onnx 8.onnx推理 9.docker环境简单补充 1.前言 好久没有做图像分类了,于是想用商汤的mmclassification快速搞一波,发现已…

【微服务】Nacos 注册中心

<!-- nacos 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${nacos.version}</version><type>pom</type><scope>import&l…

太速科技-430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡

430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡 一、板卡概述 板卡使用Xilinx的第三代RFSOC系列&#xff0c;单颗芯片包含8路ADC和DAC&#xff0c;64-bit Cortex A53系列4核CPU&#xff0c;Cortex-R5F实时处理核&#xff0c;以及大容量FPGA。 对主机接口采用PCIe Gen3x…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…

数据库数据恢复—Oracle ASM磁盘组掉线 ,ASM实例无法挂载的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 &#xff0c;ASM实例不能mount。 Oracle数据库故障分析&恢复方案&#xff1a; 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储…

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…

深度学习Pytorch-Tensor的属性、算术运算

深度学习Pytorch-Tensor的属性、算术运算 Tensor的属性Tensor的算术运算Pytorch中的in-place操作Pytorch中的广播机制Tensor的取整/取余运算Tensor的比较运算Tensor的取前k个大/前k小/第k小的数值及其索引Tensor判定是否为finite/inf/nan Tensor的属性 每一个Tensor对象都有以…

vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发

编号&#xff1a;R03-果蔬识别系统 简介&#xff1a;vuespringboot百度AI实现的果蔬识别系统 版本&#xff1a;2025版 视频介绍&#xff1a; vuespringboot百度AI实现的果蔬识别系统前后端java开发&#xff0c;百度识别&#xff0c;带H5移动端&#xff0c;mysql数据库可视化 1 …

Python(pandas库3)

函数 随机抽样 语法&#xff1a; n&#xff1a;要抽取的行数 frac&#xff1a;抽取的比例&#xff0c;比如 frac0.5&#xff0c;代表抽取总体数据的50% axis&#xff1a;示在哪个方向上抽取数据(axis1 表示列/axis0 表示行) 案例&#xff1a; 输出结果都为随机抽取。 空…

Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源

目录导读 前言ThunderOpenSDK 简介参考 xiaomi_Thunder_Cloud 示例ThunderOpenSDK 下载问题 前言 在对以前老版本的exe执行程序进行研究学习的时候&#xff0c;发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载&#xff0c;于是在网上搜索一番找到…

Flutter Row组件实战案例

In this section, we’ll continue our exploration by combining the Row and Container widgets to create more complex layouts. Let’s dive in! 在本节中&#xff0c;我们将继续探索&#xff0c;结合“Row”和“Container”小部件来创建更复杂的布局。让我们开始吧! Sc…

已解决Navicat 选择Mysql表 报错unkonow internal error: Access violation - no RTTI data

已解决Navicat 选择Mysql表 报错unkonow internal error&#xff1a; Access violation - no RTTI data 报错信息截图&#xff1a; 使用Navicat Premium15 选择sql server表时 出现大量弹窗报错&#xff0c;导致sql文件执行不了&#xff0c;右键数据库执行外部文件也失败了。弹…

Python日志系统详解:Logging模块最佳实践

Python日志系统详解&#xff1a;Logging模块最佳实践 在开发Python应用程序时&#xff0c;日志记录是排查问题、监控系统状态、优化性能的重要手段。Python标准库中提供了强大的logging模块&#xff0c;使开发者可以轻松实现灵活的日志系统。本文将详细介绍Python的logging模块…

Kubernetes:(二)K8Sv1.20二进制部署

文章目录 一、k8s项目架构二、二进制搭建 Kubernetes v1.20 &#xff08;单master节点&#xff09;1.操作系统初始化配置2.部署 docker引擎3. etcd的概念4. 证书认证5. node01 节点操作&#xff08;192.168.44.10&#xff09;6. node02 节点操作&#xff08;192.168.44.40&…

arcgis pro 3.3.1安装教程

一、获取方式&#xff1a; http://dt4.8tupian.net/2/29913a61b1500.pg3二、软件目录&#xff1a; 三、安装步骤&#xff1a; &#xff08;1&#xff09;安装软件运行环境windowsdesktop-runtime 8.0.4; &#xff08;2&#xff09;选中安装文件arcgispro_33zh_cn_190127.exe&…

nfs作业

服务机 配置文件内容 客户机

QT实时显示日志内容

性能有待提高&#xff1b; 能够读取指定目录下的日志文件&#xff0c;显示在下拉框中。 选择某一个日志之后&#xff0c;点击获取数据按钮&#xff0c;能够实时刷新日志内容。 但是每次刷新都会对整个文件进行读取&#xff0c;文本框重新加载文本。效率很低&#xff0c;影响性能…

基于yolov8的布匹缺陷检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的布匹缺陷检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的布匹缺陷检测系统是在 PyTo…

着色器的认识

知识了解&#xff1a; 着色器&#xff1a; 顶点着色器: 用来描述顶点的特性,如位置、颜色等&#xff0c;其中&#xff0c;顶点&#xff1a;是指二维或三维空间中的一个点比如交点或者端点。 片元着色器&#xff1a;用来进行逐片元处理操作&#xff0c;比如光照、颜色叠加等&…