当前位置: 首页 > news >正文

nginx学习笔记一:基础概念

1、什么是nginx

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

特点:占用内存小、并发能力强。

2、nginx的基本概念:反向代理

正向代理:

  • 比喻:你(客户端)自己订不到位置,于是你委托一个朋友(正向代理)帮你去订座和取餐。餐厅(目标服务器)并不知道真正吃饭的人是你,它只认为是你的朋友在消费。
  • 技术解释:正向代理代表客户端(你)去访问外部网络的服务器,客户端明确知道自己要通过这个代理来发送请求
  • 作用:①缓存加速 ②隐藏客户端身份 ③访问控制与过滤 
  • 代理对象是客户端

 

反向代理:

  • 比喻:那家餐厅(服务器)太火了,直接去门口会挤爆。于是餐厅设置了一个前台接待员(反向代理)。你(客户端)不需要知道后厨有多少厨师,你只需要把订单给这个接待员。接待员会帮你把订单分给不忙的厨师,最后把做好的菜送给你。对你来说,接待员就代表了整个餐厅。
  • 技术解释:反向代理是代表服务器接收客户端的请求,客户端以为反向代理就是真正的服务器,完全不知道背后还有一群服务器(服务器集群)
  • 作用:①负载均衡 ②隐藏服务器身份 ③加密与SSL加速 ④缓存静态内容 ⑤统一入口
  • 代理对象是服务器

 

3、nginx的基本概念:负载均衡

当一台服务器无法应对大量用户请求时,我们会使用多台服务器组成一个服务器集群(Cluster)。负载均衡器就是这个集群的“交通警察”或“调度员”,它坐在所有服务器前面,将涌入的请求智能地分发到各个服务器上,以避免任何一台服务器过载。

 

  • upstream模块

在nginx中,负载均衡的核心配置是 upstream 模块,你首先需要定义一个服务器组(也称为“上游服务器”组)。

image

 

  • 负载均衡算法/策略:Nginx支持多种分发请求的策略
  1. 轮询:按顺序逐一分配(默认)
  2. 权重:给服务器指定权重,权重越高,接收的请求越多

image

  3.IP哈希:根据客户端的IP地址计算一个哈希指,将同一个IP请求转发到同一后端服务器,可以解决会话保持的问题。

image

  4.最少连接:把请求转发给连接数最少的那台后端服务器,尽可能实现负载均衡

image

  • 完整配置示例

将 upstream模块和server模块结合,配置反向代理,实现负载均衡

image

  • 健康检查

  Nginx 开源版默认通过被动健康检查。如果它尝试将请求转发到一台服务器失败(连接超时、拒绝连接等),它会标记该服务器为故障状态,并在一段时间内停止向它发送请求。

  商业版 Nginx Plus 提供了更强大的主动健康检查功能,可以定期向后端服务器发送特定请求(如 /health)来检查其健康状况。

 

  • 总结:Nginx是一个功能强大、性能极高的“流量分发器”,它让你的web应用能够轻松地横向扩展,处理海量用户请求,并保证服务的高可用性。

 

4、nginx的基本概念:动静分离

1.什么是动静分离

动静分离指将网站中的静态资源(如 HTML、CSS、JavaScript、图片、字体、视频等)与动态内容(由 PHP、Java、Python、Node.js 等程序生成的页面)分开处理,使用不同的服务器或策略来提供服务。

  • 静态资源:内容固定,无论谁、在何时访问,得到的文件都是一样的。比如logo.png,style.css
  • 动态内容:内容会根据用户、时间、数据库状态等因素变化。比如淘宝的商品页面、知乎的推荐流。

Nginx在其中扮演的核心角色是:做一个高效的“流量分拣员”和“静态资源服务员”

 

2.为什么要做动静分离

1)极大提升性能

  1. Nginx 处理静态资源的效率极高,远超任何应用服务器(如 Tomcat, Apache httpd with PHP, Django)。因为它专为 I/O 密集型操作优化,使用异步非阻塞模型。
  2. 让应用服务器(如 Tomcat)只专注于处理动态请求和业务逻辑,减轻了其 I/O 压力,使其能更高效地利用 CPU 和内存

 

2)降低应用负载

  1. 一个网站中通常 80% 以上的请求都是针对静态资源的。如果所有这些请求都穿透到后端的 Tomcat/PHP,应用服务器需要耗费大量资源去读取文件并输出,这是一种巨大的浪费
  2. 动静分离后,绝大部分请求被 Nginx 直接处理并返回,应用服务器的负载骤降

 

3)便于扩展和缓存

  1. 横向扩展:静态资源可以非常容易地部署在 CDN 上,或者使用独立的、专门的文件服务器集群。
  2. 缓存优化:可以针对静态资源设置非常长的缓存时间(如一年),通过Expires 或 Cache-Control 头信息,让浏览器主动缓存。这样用户再次访问时甚至不需要发起请求,速度极快。

 

4)提升用户体验

  1. 页面加载速度更快,特别是图片、CSS等资源,直接决定了用户感知到的速度

 

3.如何用Nginx实现动静分离

Nginx实现动静分离主要依靠 location 指令,通过匹配不同的文件后缀(如.jpg .css)将请求引导到不同的地方。

场景1:最简单的分离(静态资源存放在本地服务器)静态文件和nginx在同一台服务器上

image

工作流程:

  • 用户访问 com/image/logo.png。
  • Nginx 发现请求的 URL 匹配 .*\.png,进入第二个 location。
  • Nginx 直接从本地磁盘的 /path/to/your/static/files/image/logo.png读取文件。
  • Nginx 将该文件发送给用户,并告诉浏览器可以缓存 30 天。

 

场景二:更彻底的分离(静态服务器存放在另一台服务器)

为了更极致的性能和扩展性,可以把静态资源放到完全独立的服务器或存储(如 NFS、对象存储)上。这时 Nginx 的角色更像是反向代理。

image

 

4.一个比喻说明动静分离:一个大型快递分拣中心

  1. 所有包裹(用户请求)先送到分拣中心(Nginx)
  2. 分拣机器人会扫描包裹地址
    1. 如果地址是动态生成部(如 /api/user),机器人就把包裹扔到通往“动态生成工厂”(Tomcat)的传送带上。工厂工人辛苦计算后,生成一个定制包裹,再通过分拣中心发回给用户。
    2. 如果地址是“标准件仓库”(如 /static/logo.png),机器人就直接从身后的标准件大仓库(本地磁盘或文件服务器)里取出一个现成的包裹,直接发给用户,速度极快。

这样“动态生成工厂”的工人们就不用浪费时间跑去仓库取标准件了,可以专心致志地做复杂的定制工作,整个系统的效率自然大大提高

 

总结:

  核心思想:让专业的工具处理专业的事情,Nginx处理静态,应用服务器处理动态

  实现方法:使用 location 指令根据URL后缀或路径进行匹配和分流

  关键配置:root(指定本地路径)proxy_pass(转发请求)expires(设置浏览器缓存)

 

5、nginx在linux上的安装(包管理器安装)

1.更新系统包:sudo yum update -y

2.安装nginx

  # 安装EPEL仓库:sudo yum install epel-release -y

  # 添加nginx官方仓库:sudo vi /etc/yum.repos.d/nginx.repo 配置文件

  # 安装:sudo yum install nginx -y

3.启动nginx并设置开机自启

  # 启动 Nginx 服务:sudo systemctl start nginx

  # 设置开机自动启动:sudo systemctl enable nginx

  # 查看服务状态,验证是否启动成功:sudo systemctl status nginx

4.配置防火墙:开放HTTP(80)和HTTPS(443)端口

  # 开放 80 端口 (HTTP):sudo firewall-cmd --zone=public --add-port=80/tcp --permanent

  # 开放 443 端口 (HTTPS):sudo firewall-cmd --zone=public --add-port=443/tcp --permanent

  # 重新加载防火墙规则:sudo firewall-cmd --reload

5.验证安装:在浏览器中输入你的服务器 IP 地址(如 http://你的服务器IP)。如果看到 Nginx 的默认欢迎页面,说明安装成功。

 

6、nginx常用命令

前提条件:进入nginx的目录:/安装目录/nginx/sbin

  • 查看nginx版本号:./nginx -v
  • 启动nginx:./nginx
  • 关闭nginx:./nginx -s stop
  • 重新加载nginx:./nginx -s reload   如修改conf需要生效但不想重启时使用

 

7、nginx的配置文件

配置文件位置:/安装目录/nginx/conf/nginx.conf

Nginx配置文件的组成部分:

全局块、events块、http块、server块、location块、upstream块

 

  1. 全局块
    • 配置影响nginx整体运行的参数
    • 常见指令:
      • worker_processes:工作进程数,通常设置为 CPU 核心数或 auto。
      • error_log:错误日志的位置和级别(如 debug, info, notice, warn, error, crit等)。
      • pid:存储 Nginx 主进程 ID 的文件路径。
  2.  events块
    • 配置网络连接相关的参数,对性能影响较大
    • 常见指令
      • worker_connections:每个工作进程的最大连接数。
      • use:指定使用的事件驱动模型,如 epoll(Linux 高效模型)。
      • multi_accept:是否允许一个工作进程同时接受多个新连接,高并发时建议开启。
  3. http块
    • 最常用的配置部分,代理、缓存、日志、第三方模块都在此配置
    • 常用指令
      • include:引入其他配置文件,如 types(定义文件扩展名与 MIME 类型的映射)。
      • default_type:设置默认的 MIME 类型。
      • sendfile:是否启用 sendfile 系统调用,用于高效传输文件,建议开启。
      • keepalive_timeout:设置客户端连接保持活动状态的时间。
      • gzip:是否开启 Gzip 压缩以减少传输数据量。
      • access_log 和 log_format:配置访问日志的存储路径和格式。
  4. server块
    • 配置虚拟主机的参数,一个http块可以包含多个server块
    • 常用指令
      • listen:监听的端口。
      • server_name:虚拟主机名,用于匹配请求的 Host 头。
      • root:该 server 块的根目录。
      • index:设置默认索引文件。
  5. Location块
    • 基于请求URI进行匹配,用于处理特定的请求
    • 指令
      • root:指定该 location 的根目录(会覆盖 server 块的 root)。
      • alias:定义路径别名。
      • proxy_pass:将请求反向代理到指定的上游服务器或协议地址。
      • try_files:尝试按顺序查找文件,直到找到为止,常用于前端路由或重写。
      • location 的匹配规则和优先级很重要:
    • = /path:精确匹配,优先级最高。
    • ^~ /path/:前缀匹配,如果该规则匹配,则不再检查正则表达式。
    • ~ pattern:区分大小写的正则表达式匹配。
    • ~* pattern:不区分大小写的正则表达式匹配。
    • /path/:普通前缀匹配,优先级最低。

优先级顺序一般为:精确匹配 (=) > 前缀匹配 (^~) > 正则匹配 (~, ~*) > 普通前缀匹配。

 

6.upsteam块

    • 定义后端服务器组,只要用于负载均衡配置
    • 指令:
      • server:定义后端服务器地址及其参数(如权重 weight)。
      • ip_hash:实现会话保持,确保同一客户端 IP 的请求分发到同一后端服务器。
      • 负载均衡算法还包括轮询(默认)、weight(权重)、least_conn(最少连接)等

 

8、nginx的配置示例

  • 静态资源服务:expires 指令告诉浏览器缓存这些文件30天

image

  • 反向代理和负载均衡

image

upstream 块定义了一组后端服务器,并设置了权重;

proxy_pass指令将所有匹配此 location 的请求转发到 my_backend 服务器组;

proxy_set_header 指令确保后端服务器能获取到客户端的真实 IP 等信息

 

  • 处理PHP请求

image

此配置匹配所有以.php结尾的请求,

fastcgi_pass  指令将请求转发给处理 PHP 的 FastCGI 进程;

fastcgi_param 设置必要的参数,特别是 SCRIPT_FILENAME,告诉 PHP-FPM 要执行的文件路径。

 

http://www.hskmm.com/?act=detail&tid=9873

相关文章:

  • HTB UNIV CTF 24 Armaxix靶场漏洞链:命令注入与账户接管实战
  • 【JAVA接口自动化】JAVA如何读取Yaml文档
  • PyTorch Weight Decay 技术指南
  • AUTOSAR进阶图解==>AUTOSAR_SWS_PDURouter - 实践
  • getDefaultMidwayLoggerConfig报错;解决方法。
  • js获取浏览器语言,以及调用谷歌翻译api翻译成相应的内容
  • 总结RocketMQ中的常见问题
  • The 2025 ICPC Asia EC Regionals Online Contest (II)
  • C++线上练习
  • Python实现Elman RNN与混合RNN神经网络对航空客运量、啤酒产量、电力产量时间序列数据预测可视化对比
  • 4G/Wi-Fi/以太网三网合一,智能融合通信实战案例集
  • 关于介绍自己的第一篇随笔
  • 深入解析:N32G43x Flash 驱动移植与封装实践
  • Backblaze上如何传大文件
  • 解题报告-老逗找基友 (friends)
  • Caused by: java.lang.ClassNotFoundException: org.apache.rocketmq.remoting.common.RemotingUtil
  • VAE In JAX【个人记录向】
  • BLE蓝牙配网双模式实操:STA+SoftAP技术原理与避坑指南
  • 第58天:RCE代码amp;命令执行amp;过滤绕过amp;异或无字符amp;无回显方案amp;黑白盒挖掘
  • 057-Web攻防-SSRFDemo源码Gopher项目等
  • 060-WEB攻防-PHP反序列化POP链构造魔术方法流程漏洞触发条件属性修改
  • 059-Web攻防-XXE安全DTD实体复现源码等
  • 061-WEB攻防-PHP反序列化原生类TIPSCVE绕过漏洞属性类型特征
  • 051-Web攻防-文件安全目录安全测试源码等
  • Dilworth定理及其在算法题中的应用
  • 050-WEB攻防-PHP应用文件包含LFIRFI伪协议编码算法无文件利用黑白盒
  • error: xxxxx does not have a commit checked out
  • 049-WEB攻防-文件上传存储安全OSS对象分站解析安全解码还原目录执行
  • 云原生周刊:MetalBear 融资、Chaos Mesh 漏洞、Dapr 1.16 与 AI 平台新趋势
  • AI一周资讯 250913-250919