一文全解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.mfbz.cn/a/782376.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PB案例学习笔记】-29制作一个调用帮助文档的小功能

写在前面 这是PB案例学习笔记系列文章的第29篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

【Spring Boot】关系映射开发(三):多对多映射

《JPA 从入门到精通》系列包含以下文章&#xff1a; Java 持久层 API&#xff1a;JPA认识 JPA 的接口JPA 的查询方式基于 JPA 开发的文章管理系统&#xff08;CRUD&#xff09;关系映射开发&#xff08;一&#xff09;&#xff1a;一对一映射关系映射开发&#xff08;二&#…

Java_网络编程

网络通信的关键三要素 IP、端口号、协议 IP地址 IP地址&#xff08;Internet Protocol&#xff09;&#xff1a;全程“互联网协议地址”&#xff0c;是分配给上网设备的唯一标志。 IP地址有两种形式&#xff1a;IPv4、IPv6 InetAddress 代表IP地址 InetAddress 的常用方法…

【算法训练记录——Day42】

Day42——动态规划Ⅳ 1.leetcode_1049最后一块石头的重量II2.leetcode_494目标和3.leetcode_474一和零 1.leetcode_1049最后一块石头的重量II 思路&#xff1a;石头只能用一次。。。怎么才能让碰撞后重量最小呢&#xff0c;还要转换成动态规划&#xff0c;难以理解。。 看题解&…

J024_打印电影的全部信息

一、需求描述 展示多部电影的信息。 电影信息包括&#xff1a;电影名称、电影得分、电影票价格。 二、代码实现 2.1 Movie类 package com.itheima.collection;public class Movie {//电影名称private String name;//电影得分private int score;//电影票价格private double…

【Excel】输入内容自动添加边框线

1. 选中表格区域 → 新建条件规则 2. 设置公式 3. 设置格式 测试生效

[吃瓜教程]南瓜书第6章支持向量机

0.补充知识 0.1 超平面 定义&#xff1a; 超平面是指在&#x1d45b;维空间中&#xff0c;维度为 &#x1d45b;−1的子空间。它是分割空间的一个平面。 性质&#xff1a; n维空间的超平面 ( w T x b 0 , 其中 w , x ∈ R n ) (w^Tx_b0,其中w,x\in \mathbb R^n) (wTxb​0,其…

C++的set / multiset容器

一、介绍 C的set容器又被称为集合&#xff0c;所有元素在被插入后都会自动排序。 二、数据结构 set / multiset属于关联式容器&#xff0c;底层数据结构是用二叉树实现的。 其余的容器比如vector、deque和list等为序列式容器&#xff0c;因为他们底层使用线性序列结构&#xf…

Windows环境安装Redis和Redis Desktop Manager图文详解教程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Redis概述 Redis是一个开源的高性能键值对数据库&#xff0c;以其卓越的读写速度而著称&#xff0c;广泛用于数据库、缓存和消息代理。它主要将数据存储在内存中&#xff0…

CISC和RISC指令集

文章目录 1. 指令集 2. CISC&#xff08;复杂指令集计算&#xff09; 3. RISC&#xff08;精简指令集计算&#xff09; 4. RISC的设计初衷 5. CISC和RISC流程对比 CISC&#xff08;复杂指令集计算&#xff09;的实现 RISC&#xff08;精简指令集计算&#xff09;的实现 …

【高中数学之函数】四种幂函数图线(二次、三次、开方、开立方)

【图像】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>UNASSIGNED</title><style type"text/css">.c…

【智能算法应用】灰狼算法求解二维栅格路径规划问题

目录 1.算法原理2.二维路径规划数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.二维路径规划数学模型 栅格法模型最早由 W.E. Howden 于 1968 年提出&#xff0c;障碍物的栅格用黑色表示&#xff0c;可通…

基于pi控制的数字锁相环simulink建模与仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视频&#xff09…

基于MATLAB的PEF湍流风场生成器模拟与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于MATLAB的PEF湍流风场生成器模拟与仿真。PEF&#xff08;Primitive Equations Formulation&#xff09;湍流风场模型&#xff0c;是大气科学和气象学中用来描述大气流动和气…

咬文嚼字:词元是当今生成式人工智能失败的一个重要原因

生成式人工智能模型处理文本的方式与人类不同。了解它们基于"标记"的内部环境可能有助于解释它们的一些奇怪行为和顽固的局限性。从 Gemma 这样的小型设备上模型到 OpenAI 业界领先的 GPT-4o 模型&#xff0c;大多数模型都建立在一种称为转换器的架构上。由于转换器在…

subset使用

在R语言中&#xff0c;subset()函数用于从数据框中选择满足特定条件的观测。其语法如下&#xff1a; subset(x, subset, select, drop FALSE) 参数说明&#xff1a; x&#xff1a;数据框或矩阵。 subset&#xff1a;逻辑条件&#xff0c;用于筛选满足特定条件的行。 select…

Linux Bridge - Part 2

概览 在前一篇文章中&#xff0c;我描述了Linux 网桥&#xff08;bridge&#xff09;的配置&#xff0c;并展示了一个实验&#xff0c;其中使用Wireshark来分析流量。在本文中&#xff0c;我将讨论当创建一个网桥时会发生什么&#xff0c;以及Linux 网桥&#xff08;bridge&am…

给您介绍工控CAN总线

CAN是什么 CAN&#xff0c;全称Controller Area Network&#xff0c;即控制器局域网&#xff0c;是一种由Bosch公司在1983年开发的通信协议。它主要用于汽车和工业环境中的电子设备之间的通信。CAN协议定义了物理层和数据链路层的通信机制&#xff0c;使得不同的设备能够通过CA…

数据驱动的内容优化:Kompas.ai如何提升内容表现

在数字化营销时代&#xff0c;内容是企业与用户沟通的重要桥梁。然而&#xff0c;随着信息量的爆炸性增长&#xff0c;如何让内容在激烈的竞争中脱颖而出&#xff0c;成为每个营销人员面临的问题。数据驱动的内容优化策略&#xff0c;通过精准分析和科学决策&#xff0c;帮助品…

基于Java+SpringMvc+Vue技术的实验室管理系统设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…