# Nginx

# 1.介绍:

Nginx是十分轻量级的HTTP服务器。Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。

  • Web服务器:它的本职工作是将你电脑上的网页文件(HTML, CSS, 图片)发送给用户的浏览器。
  • 反向代理服务器:这是它更强大、更常用的角色。它接收客户端的请求,然后代表客户端去向后端的多个服务器索取资源,最后将整合好的结果返回给客户端。客户端并不知道后端的具体情况。
  • 邮件代理服务器:它也能处理邮件相关的协议。

# 核心优势:

# 1. **高性能、高并发 **

  • 传统服务器的"一人一岗"模型:像Apache的旧模式,每个用户连接都会创建一个新的操作系统进程或线程。当连接数达到几千时,服务器就会因为进程/线程的创建和切换开销而变得非常缓慢。
  • Nginx的"事件驱动"异步模型:Nginx使用一个(或少数几个)主进程来管理多个工作进程。每个工作进程都是"事件驱动"的,能够同时处理数千个连接。它不会为一个连接等待,而是当某个连接有"事件"(比如数据可读了)时才去处理它。这就像餐厅经理同时监听很多张桌子的呼叫铃,而不是一直站在一张桌子前等待。

结果:Nginx可以用很少的系统资源(CPU和内存)处理海量的并发连接。这是它能成为当今互联网顶流的核心原因。

# 2. 反向代理与负载均衡

这是Nginx最常用的场景之一。

  • 负载均衡:当你的网站流量很大时,一台服务器肯定不够。你会有多台应用服务器。Nginx可以站在它们前面,像交通警察一样,把用户的请求按照一定策略(轮询、权重、最少连接等)分发给这些服务器,防止任何一台服务器过载。

    nginx

    # 示例配置:定义一个名为 "myapp" 的后端服务器组
    upstream myapp {
        server 192.168.1.10:8080 weight=3; # 这台机器性能好,给它3个权重
        server 192.168.1.11:8080;          # 这台性能一般,默认权重1
    }
    
    server {
        listen 80;
        location / {
            proxy_pass http://myapp; # 将所有请求转发给 myapp 组
        }
    }

# 3. 静态内容服务 - 快如闪电

Nginx处理静态文件(图片、CSS、JavaScript、HTML)的能力极强。通常,我们会让Nginx直接处理这些请求,而将动态请求(需要程序处理的)转发给后端的应用服务器(如Tomcat, Django, Node.js)。这种"动静分离"的策略极大地提升了网站的整体性能。

# 4. SSL/TLS终端

当你的网站使用HTTPS时,需要进行加密和解密操作,这很消耗CPU。Nginx可以承担这个工作,它负责与客户端完成SSL握手和解密,然后将明文的请求转发给后端服务器。这样后端服务器就不用操心加密的事了,可以专注于业务逻辑。

# 5. 缓存

Nginx可以缓存从后端应用服务器返回的响应。如果下一个用户请求相同的资源,Nginx可以直接从缓存里返回,而不用再去麻烦后端服务器。这极大地减少了响应时间和后端压力。

# 6. 高可靠性和稳定性

Nginx以稳定著称,可以7x24小时不间断运行。即使后端某个应用服务器宕机了,Nginx也能检测到并将其从负载均衡组中移除,保证大部分用户不受影响。

# 一个典型的工作流程(从输入网址到看到网页)

假设你访问 https://www.example.com/shop/product/123

  1. 你的浏览器向 www.example.com 的443端口(HTTPS)发起请求。

  2. 请求到达托管 example.com 的服务器,Nginx正在监听443端口。

  3. Nginx接收到请求,首先完成SSL握手。

  4. Nginx查看请求的路径 /shop/product/123。

  5. 根据预设的规则(location 指令),Nginx判断这是一个动态请求,需要由后端的Java应用处理。

    nginx

    server {
        listen 443 ssl;
        server_name www.example.com;
        # ... SSL配置 ...
    
        location /static/ { # 静态文件直接由Nginx处理
            root /var/www/html;
        }
    
        location /shop/ { # 动态请求转发给后端
            proxy_pass http://backend_java_app;
        }
    }
  6. Nginx将请求转发给 backend_java_app 定义的一组Java应用服务器中的一台。

  7. Java服务器处理请求,从数据库查出产品123的信息,生成HTML页面,返回给Nginx。

  8. Nginx将这个响应返回给你的浏览器。

  9. 浏览器解析HTML,发现里面还有CSS和图片链接(如 /static/css/style.css),于是又向同一个Nginx发起新的请求。

  10. 这次,Nginx看到是 /static/ 路径,直接从服务器的硬盘上读取 style.css 文件,并以极快的速度发送给浏览器。

# Nginx vs. Apache(另一个著名的Web服务器)

这是一个经典的对比,能帮你更好地理解Nginx的定位:

特性 Nginx Apache
架构模型 事件驱动,异步非阻塞 进程/线程驱动(传统模式),一个连接一个进程
资源消耗 低,尤其在高并发下 高,并发连接数增多时资源消耗剧增
静态内容 性能极高 性能很好
动态内容 通常需要转发给后端处理器(如PHP-FPM) 可以通过模块(如mod_php)在内部直接处理
配置语法 简洁、直观 更灵活、功能强大,但也更复杂
主要用途 反向代理、负载均衡、静态服务 传统的全能Web服务器,特别适合共享主机

简单总结:Nginx更擅长处理高并发连接和充当"交通指挥",而Apache传统上更擅长在单个服务器内深度处理动态请求。现代架构中,它们常常协同工作:Nginx在前端做反向代理和静态处理,Apache在后端处理动态内容。

更新于

请我喝[茶]~( ̄▽ ̄)~*

yy 微信支付

微信支付

yy 支付宝

支付宝