# 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
-
你的浏览器向
www.example.com的443端口(HTTPS)发起请求。 -
请求到达托管
example.com的服务器,Nginx正在监听443端口。 -
Nginx接收到请求,首先完成SSL握手。
-
Nginx查看请求的路径
/shop/product/123。 -
根据预设的规则(
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; } } -
Nginx将请求转发给
backend_java_app定义的一组Java应用服务器中的一台。 -
Java服务器处理请求,从数据库查出产品123的信息,生成HTML页面,返回给Nginx。
-
Nginx将这个响应返回给你的浏览器。
-
浏览器解析HTML,发现里面还有CSS和图片链接(如
/static/css/style.css),于是又向同一个Nginx发起新的请求。 -
这次,Nginx看到是
/static/路径,直接从服务器的硬盘上读取style.css文件,并以极快的速度发送给浏览器。
# Nginx vs. Apache(另一个著名的Web服务器)
这是一个经典的对比,能帮你更好地理解Nginx的定位:
| 特性 | Nginx | Apache |
|---|---|---|
| 架构模型 | 事件驱动,异步非阻塞 | 进程/线程驱动(传统模式),一个连接一个进程 |
| 资源消耗 | 低,尤其在高并发下 | 高,并发连接数增多时资源消耗剧增 |
| 静态内容 | 性能极高 | 性能很好 |
| 动态内容 | 通常需要转发给后端处理器(如PHP-FPM) | 可以通过模块(如mod_php)在内部直接处理 |
| 配置语法 | 简洁、直观 | 更灵活、功能强大,但也更复杂 |
| 主要用途 | 反向代理、负载均衡、静态服务 | 传统的全能Web服务器,特别适合共享主机 |
简单总结:Nginx更擅长处理高并发连接和充当"交通指挥",而Apache传统上更擅长在单个服务器内深度处理动态请求。现代架构中,它们常常协同工作:Nginx在前端做反向代理和静态处理,Apache在后端处理动态内容。