一文全解Nginx

一文全解Nginx

一文全解 Nginx

1. 技术介绍

Nginx(发音为"engine-x")是一个高性能的开源 Web 服务器软件,同时也可以用作反向代理、负载均衡器和 HTTP 缓存。它最初由俄罗斯的 Igor Sysoev 开发,并于 2004 年首次公开发布。

1.1 基本概念

Nginx 的核心思想是异步、事件驱动的架构,这使得它能够高效地处理大量并发连接。与传统的进程或线程模型相比,Nginx 使用更少的资源来处理更多的请求。

1.2 工作原理

Nginx 采用主从架构:

  • 一个主进程(master process):负责读取和验证配置文件、维护工作进程。
  • 多个工作进程(worker processes):处理实际的请求。
主进程 Master
工作进程 Worker 1
工作进程 Worker 2
工作进程 Worker 3
工作进程 Worker n
处理请求

1.3 与传统 Web 服务器的区别

特性NginxApache
架构事件驱动,异步非阻塞进程/线程驱动
并发处理能力相对较低
资源占用较高
静态文件处理非常快
配置灵活性
模块扩展动态模块(较新版本支持)动态模块

2. 优势和应用场景

Nginx 的优势主要体现在以下几个方面:

  1. 高性能:能够处理大量并发连接,适合高流量网站。
  2. 低资源消耗:相比其他 Web 服务器,Nginx 占用更少的内存和 CPU。
  3. 高可靠性:经过多年的生产环境验证,稳定性出色。
  4. 灵活配置:配置文件简洁易懂,且支持动态配置。
  5. 扩展性强:丰富的模块生态系统,可以扩展多种功能。

2.1 应用场景

  1. 静态内容服务器:Nginx 在处理静态文件方面表现出色。
  2. 反向代理服务器:可以将请求转发到后端服务器,实现负载均衡。
  3. API 网关:作为微服务架构中的入口点,处理请求路由、认证等。
  4. 负载均衡器:在多个后端服务器之间分配流量。
  5. HTTPS 和 HTTP/2 支持:提供安全的加密通信。
  6. 缓存服务器:可以缓存静态和动态内容,减轻后端服务器压力。

3. 实现方式和核心技术

3.1 事件驱动模型

Nginx 采用事件驱动的异步非阻塞 I/O 模型。这意味着它可以在单个线程中处理多个连接,而不需要为每个连接创建新的进程或线程。

while (true) {events = check_events();for (i = 0; i < events.length; i++) {handle_event(events[i]);}
}

3.2 模块化架构

Nginx 的功能是通过模块来实现的。核心模块提供基本功能,而其他模块可以根据需求动态加载。

主要模块类型:

  • 核心模块
  • 事件模块
  • HTTP 模块
  • Mail 模块
  • Stream 模块

3.3 配置系统

Nginx 的配置文件采用简单的文本格式,通常位于 /etc/nginx/nginx.conf​。

基本配置结构:

user nginx;
worker_processes auto;events {worker_connections 1024;
}http {server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;}}
}

3.4 反向代理和负载均衡

Nginx 可以作为反向代理服务器,将请求转发到后端服务器。同时,它也提供了多种负载均衡算法。

upstream backend {server backend1.example.com weight=5;server backend2.example.com;server unix:/tmp/backend3;
}server {location / {proxy_pass http://backend;}
}

4. 案例分析:高性能 Web 应用

假设我们需要构建一个能够处理高并发请求的 Web 应用,同时还需要提供静态资源服务和 API 代理功能。

4.1 需求分析

  1. 处理高并发 HTTP 请求
  2. 提供静态文件服务
  3. 反向代理到后端 API 服务
  4. 实现简单的负载均衡
  5. 配置 HTTPS

4.2 解决方案设计

我们将使用 Nginx 作为前端服务器,处理静态文件请求,并将 API 请求代理到后端服务器。

架构图:

客户端
Nginx
静态文件
API服务器1
API服务器2

4.3 实施过程

  1. 安装 Nginx
sudo apt update
sudo apt install nginx
  1. 配置 Nginx
http {upstream api_servers {server api1.example.com;server api2.example.com;}server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;}location /api/ {proxy_pass http://api_servers;}}
}
  1. 配置 HTTPS
sudo certbot --nginx -d example.com
  1. 优化 Nginx 配置
worker_processes auto;
worker_rlimit_nofile 65535;events {worker_connections 65535;use epoll;multi_accept on;
}http {keepalive_timeout 65;sendfile on;tcp_nopush on;tcp_nodelay on;# 启用压缩gzip on;gzip_comp_level 6;gzip_types text/plain text/css application/json application/javascript;# 文件缓存open_file_cache max=1000 inactive=20s;open_file_cache_valid 30s;open_file_cache_min_uses 2;open_file_cache_errors on;
}

5. 优缺点和适用场景

5.1 优点

  1. 高性能和低资源消耗
  2. 配置简单灵活
  3. 支持反向代理和负载均衡
  4. 良好的静态文件处理能力
  5. 活跃的社区和丰富的第三方模块

5.2 缺点

  1. 动态内容处理能力相对较弱
  2. 学习曲线可能较陡峭
  3. 一些高级功能需要商业版本

5.3 适用场景

  • 高流量网站
  • 静态内容服务
  • 反向代理和负载均衡
  • 微服务 API 网关
  • 前后端分离架构
  • CDN 节点

6. 生态系统和相关技术栈

Nginx 有丰富的生态系统,包括:

  1. 官方模块:如 ngx_http_rewrite_module​(URL 重写)、ngx_http_proxy_module​(代理)等。

  2. 第三方模块

    • lua-nginx-module​:在 Nginx 中嵌入 Lua 脚本
    • nginx-rtmp-module​:添加 RTMP 协议支持
    • ngx_pagespeed​:自动优化网页性能
  3. Nginx Plus:商业版本,提供更多高级功能和专业支持。

  4. OpenResty:基于 Nginx 和 Lua 的 Web 平台。

  5. Tengine:由淘宝网发起的 Web 服务器项目,在 Nginx 的基础上添加了很多高级特性。

相关技术栈:

  • 后端语言:PHP、Python、Ruby、Node.js 等
  • 数据库:MySQL、PostgreSQL、MongoDB 等
  • 缓存系统:Redis、Memcached
  • 消息队列:RabbitMQ、Kafka
  • 监控工具:Prometheus、Grafana
  • 容器化:Docker、Kubernetes

7. 学习和使用资源

  1. 官方文档:Nginx 文档

  2. 在线教程

    • Nginx Fundamentals
    • Nginx 从入门到实践
  3. 书籍

    • 《Nginx 高性能 Web 服务器详解》
    • 《深入理解 Nginx:模块开发与架构解析》
  4. 社区支持

    • Nginx 邮件列表
    • Stack Overflow Nginx 标签
  5. GitHub 资源

    • Nginx 官方仓库
    • Awesome Nginx
  6. 博客和文章

    • Nginx 博客
    • 掘金 Nginx 专栏

通过以上资源,您可以深入学习 Nginx 的各个方面,从基础配置到高级应用和性能优化。

8. 从零构建高可用系统

让我们通过一个实际的例子,演示如何使用 Nginx 从零开始构建一个高可用的 Web 系统。

8.1 系统架构

我们将构建一个包含以下组件的系统:

  1. Nginx 负载均衡器(2 个实例)
  2. Web 应用服务器(4 个实例)
  3. 数据库服务器(主从复制)
  4. 缓存服务器(Redis)
客户端
DNS 轮询
Nginx 1
Nginx 2
Web 1
Web 2
Web 3
Web 4
Redis 集群
MySQL 主
MySQL 从1
MySQL 从2

8.2 实施步骤

  1. 设置 Nginx 负载均衡器

    安装 Nginx 并配置:

    http {upstream web_backend {least_conn;server web1.example.com:8080;server web2.example.com:8080;server web3.example.com:8080;server web4.example.com:8080;}server {listen 80;server_name example.com;location / {proxy_pass http://web_backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}
    }
    
  2. 配置 Web 应用服务器

    在每个 Web 服务器上安装必要的应用程序和依赖,确保它们监听在 8080 端口。

  3. 设置 MySQL 主从复制

    在主服务器上:

    CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    

    在从服务器上:

    CHANGE MASTER TO
    MASTER_HOST='mysql_master.example.com',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=123;START SLAVE;
    
  4. 配置 Redis 集群

    安装 Redis 并配置集群模式:

    redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
    
  5. 实现会话共享

    使用 Redis 存储会话数据,确保在多个 Web 服务器之间共享会话。

  6. 配置 HTTPS

    使用 Let’s Encrypt 获取 SSL 证书并在 Nginx 中配置 HTTPS:

    server {listen 80;server_name example.com;return 301 https://$server_name$request_uri;
    }server {listen 443 ssl;server_name example.com;ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;ssl_stapling on;ssl_stapling_verify on;add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;location / {proxy_pass http://web_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;}
    }
    
  7. 实现监控 使用 Prometheus 和 Grafana 设置监控系统:

    • 在每个服务器上安装 Node Exporter
    • 配置 Prometheus 收集指标
    • 设置 Grafana 仪表板可视化监控数据
  8. 配置自动扩缩容 使用 Kubernetes 或云服务提供商的自动扩缩容功能,根据负载自动调整 Web 服务器的数量。

  9. 实施日志管理 使用 ELK 栈(Elasticsearch、Logstash、Kibana)或类似的日志管理解决方案集中管理和分析日志。

  10. 设置备份和恢复策略

    • 定期备份数据库
    • 使用 Redis 持久化确保缓存数据的可靠性
    • 实施灾难恢复计划
  11. 安全加固

    • 配置防火墙规则
    • 实施入侵检测系统(IDS)
    • 定期进行安全审计和漏洞扫描

通过以上步骤,您可以构建一个高可用、可扩展、安全的 Web 系统。这个系统能够处理大量流量,提供良好的用户体验,并且在出现故障时保持服务的连续性。

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

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

相关文章

在Qt中使用C++编程与传统C++编程的区别

引言 C作为一种强大的编程语言&#xff0c;被广泛应用于系统编程、游戏开发、嵌入式系统等领域。而Qt作为一个跨平台的应用开发框架&#xff0c;通过其丰富的功能库和高效的开发工具&#xff0c;使得C开发变得更加高效和便捷。本文将深入探讨在Qt中使用C编程与传统C编程的区别…

el-date-picker 设置默认值为当前日期

this.listQuery.Date new Date().toISOString().substr(0, 10); <el-date-picker v-model"listQuery.Date" format"yyyy-MM-dd" value-format"yyyy-MM-dd" type"date" placeholder"选择日期" change"getList()&qu…

【MySQL】4.MySQL 的数据类型

MySQL 的数据类型 一.数据类型分类在这里插入图片描述二.注意点1.char VS varchar2.datetime VS timestamp3.enum 和 set 的使用方法 一.数据类型分类 二.注意点 1.char VS varchar char 的意义是直接开辟固定大小的空间&#xff0c;浪费磁盘空间&#xff0c;但是效率高varcha…

WEB05Web开发HTMLCSS

Web前端开发 什么是 Web &#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 Web 网站的工作流程 W3C 万维网联盟&#xff08; World Wide Web Consortium &#xff09;&#xff0c;创建于1994年1…

ESP32-C3模组上跑通AES-GCM(1)

本文内容参考: mbedtls学习笔记 AES GCM_aes128 gcm的aad是什么-CSDN博客 https://www.cnblogs.com/testlearn/p/16547583.html 对称加密和非对称加密,一文讲解明白!-CSDN博客 深入理解高级加密标准(Advanced Encryption Standard)_aes在线加密-CSDN博客 特此致谢! …

OpenEarthMap:全球高分辨率土地覆盖制图的基准数据集(开源来下载!!!)

OpenEarthMap由220万段5000张航拍和卫星图像组成&#xff0c;覆盖6大洲44个国家97个地区&#xff0c;在0.25-0.5m的地面采样距离上人工标注8类土地覆盖标签。我们提供8类标注:裸地、牧场、已开发空间、道路、树木、水、农业用地和建筑。类选择与现有的具有亚米GSD的产品和基准数…

std::unordered_map和std::map在性能上有何不同

std::unordered_map和std::map在性能上的不同主要体现在以下几个方面&#xff1a; 1. 底层数据结构 std::unordered_map&#xff1a;基于哈希表实现&#xff0c;通过哈希函数计算元素的存储位置。哈希表能够直接通过哈希值快速定位到元素的位置&#xff0c;从而实现高效的查找…

30、PHP 实现 左旋转字符串、翻转单词顺序列

题目&#xff1a; PHP 实现 左旋转字符串 描述&#xff1a; 汇编语言中有一种移位指令叫做循环左移&#xff08;ROL&#xff09;&#xff0c;现在有个简单的任务&#xff0c; 就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S&#xff0c;请你把其循环左移K位后的…

电源纹波相关

什么是纹波&#xff1f;什么是噪声&#xff1f; 这种叠加在直流稳定量上的交流分量就称为纹波。 纹波的危害 电源纹波能影响设备性能和稳定性 纹波会导致电器上产生谐波&#xff0c;降低电源的使用效率&#xff1b; 高频电源纹波可能会产生浪涌电压或电流&#xff0c;影响设…

android deep links即scheme uri跳转以及googlePlay跳转配置

对于googlePlay的Custom URL就是googlePlay上APP网址&#xff1a; https://play.google.com/store/apps/details?idcom.yourapp如果是国内一些应用&#xff0c;则考虑market://包名等方式&#xff0c;自行百度。 对于Android URI Scheme&#xff1a; 首先需要在Manifest xm…

第2章大话 ASP.NET Core 入门

1.什么是ASP.NET Core框架 ASP.NET Core是一个超级棒的框架&#xff0c;它是免费的&#xff0c;你可以在任何主流的系统上&#xff0c;比如Windows、Linux或macOS上使用它&#xff0c;而且它是完全开放源代码的&#xff0c;意味着你可以看到并修改它的内部代码。这个框架是专门…

浅尝Apache Mesos

文章目录 1. Mesos是什么2. 共享集群3. Apache Mesos3.1 Mesos主节点3.2 Mesos代理3.3 Mesos框架 4. 资源管理4.1 资源提供4.2 资源角色4.3 资源预留4.4 资源权重与配额 5. 实现框架5.1 框架主类5.3 实现执行器 6. 小结参考 1. Mesos是什么 Mesos是什么&#xff0c;Mesos是一个…

如何更好地对接第三方数据库

在现代企业信息化建设中&#xff0c;对接第三方数据库是一个常见且重要的任务。无论是为了单据录入还是报表统计&#xff0c;确保对接过程的顺利进行对于业务运转至关重要。本文将详细介绍如何更好地对接第三方数据库&#xff0c;涵盖命名方式、业务理解和数据对接的具体步骤。…

【国产AI绘图】快手把“可图”大模型开源了,这是一款支持中文的SDXL模型

Kolors 是由 Kuaishou Kolors 团队&#xff08;快手可图&#xff09;开发的基于潜在扩散的大规模文本到图像生成模型。经过数十亿对文本图像的训练&#xff0c;Kolors 在视觉质量、复杂语义的准确性以及中英文字符的文本渲染方面&#xff0c;与开源和专有模型相比都具有显著优势…

SQLAlchemy迁移数据库

SQLAlchemy迁移数据库 目录 SQLAlchemy迁移数据库安装Alembic配置Alembic编辑 alembic.ini编辑env.py生成迁移文件建表语句示例修改迁移文件命名格式 安装Alembic pip install alembic配置Alembic 执行初始化后会创建一个 alembic 目录&#xff0c;包含Alembic的配置文件 ale…

Linux中C语言指针的意义及高级用法

引言 指针是C语言中一个重要的特性&#xff0c;它为程序提供了强大的功能和灵活性。指针在内存管理、数据结构、函数参数传递等方面发挥着关键作用。本文将深入探讨C语言指针的意义及其在Linux环境中的一些高级用法。 一、指针的基本概念 指针是存储内存地址的变量。它指向存…

MSPM0G3507——外部中断测编码器数据

方式1&#xff1a;单相 void GROUP1_IRQHandler(void) //编码器的中断函数 {uint32_t gpioA DL_GPIO_getEnabledInterruptStatus(GPIOA, GPIO_Encoder_PIN_Back_Left_A_PIN | GPIO_Encoder_PIN_Back_Right_A_PIN );if (gpioA & GPIO_Encoder_PIN_Bac…

基础权限储存

一、要求&#xff1a; 1、建立用户组shengcan&#xff0c;其id为2000工 2、建立用户组 caiwu&#xff0c;其id为2001 3、建立用户组 jishu&#xff0c;其id 为 2002 4、建立目录/sc,此目录是 shengchan 部门的存储目录&#xff0c;只能被 shengchan 组的成员操作,其他用户没有…

笔记:Newtonsoft.Json 自定义序列化反序列化规则

使用 Newtonsoft.Json&#xff0c;你可以在类内部自定义序列化和反序列化规则。这通常通过实现 JsonConverter 抽象类来完成。自定义转换器允许你控制类的序列化和反序列化行为&#xff0c;使你能够处理复杂的场景&#xff0c;比如序列化第三方库的对象&#xff0c;或者处理不支…

Hi6276 无Y应用电源方案IC

Hi6276 combines a dedicated current mode PWM controller with integrated high voltage power MOSFET.Vcc low startup current and low operating current contribute to a reliable power on startup design with Hi6276. the IC operates in Extended ‘burst mode’ to …