Nginx的使用教程以及用途
Nginx的使用教程以及用途
一、什么是Nginx
Nginx是一款轻量级、高性能的开源 HTTP 服务器和反向代理服务器,同时也支持邮件代理、TCP/UDP 代理等功能。它由俄罗斯程序员 Igor Sysoev 于 2004 年首次公开发布,设计初衷是解决传统服务器在高并发场景下的性能瓶颈,也是当下web开发中热门的web服务器
二、和Apache有什么区别
Nginx 和 Apache 是目前最主流的两款 Web 服务器,两者在设计理念、架构和适用场景上有显著差异,核心区别可以从以下几个维度对比:
1. 核心架构:并发处理方式不同
这是两者最本质的区别,直接决定了性能表现:
- Apache:采用 “多进程 / 多线程模型”。简单说,每处理一个客户端连接,就会创建一个独立的进程(或线程)来专门负责。这种模型逻辑直观,但资源消耗高 —— 每个进程 / 线程会占用独立的内存和 CPU,当并发连接数激增(比如超过 1 万)时,容易出现内存耗尽、上下文切换频繁的问题,难以应对 “高并发” 场景。
- Nginx:采用 “事件驱动的异步非阻塞模型”。它通过一个(或少量)工作进程,基于事件循环机制同时处理大量连接(无需为每个连接创建独立进程)。这种设计让 Nginx 能以极低的资源(几 MB 内存)支撑数万甚至数十万并发连接,尤其适合高负载场景。
2.性能与资源占用
- 高并发场景:Nginx 优势明显。例如,同样配置的服务器,Apache 在并发连接数超过几千时可能出现响应变慢,而 Nginx 处理数万连接仍能保持稳定。
- 资源消耗:Nginx 更轻量。运行时内存占用通常只有几 MB 到几十 MB,而 Apache 因进程 / 线程开销,内存占用会随并发数增长显著上升。
- 静态资源处理:Nginx 对静态文件(HTML、CSS、图片等)的处理效率远高于 Apache,因为它的架构更适合 “快速读取 - 返回” 的短连接场景。
3. 功能与灵活性
- 模块生态:Apache 的模块更丰富且成熟,尤其是针对动态内容处理(如 PHP、Python)的模块(如
mod_php),可以直接嵌入服务器进程中运行,配置简单。但模块大多是 “静态编译”,新增模块可能需要重新编译服务器。 - Nginx 模块:更轻量,且支持 “动态加载”(部分模块),配置更简洁。但它对动态内容的处理通常不直接嵌入,而是通过反向代理转发给后端服务(如 FastCGI、uWSGI),这种 “分离” 设计反而让架构更灵活(比如方便扩展后端应用服务器)。
- 热部署:Nginx 支持 “不重启服务” 更新配置或升级程序,而 Apache 修改核心配置后通常需要重启(或重载进程),可能短暂影响服务。
4. 适用场景
- Apache 更适合:
- 动态内容为主的中小型网站(如传统 PHP 博客、企业官网),依赖
mod_php等模块快速部署; - 对模块兼容性要求高,需要使用特定 Apache 专属模块的场景;
- 并发量中等(几千以内),对资源消耗不敏感的场景。
- 动态内容为主的中小型网站(如传统 PHP 博客、企业官网),依赖
- Nginx 更适合:
- 高并发场景(如电商秒杀、大型门户网站),需要支撑数万级并发连接;
- 作为前端代理服务器(反向代理、负载均衡),分发流量到后端多台应用服务器;
- 静态资源密集型服务(如图片 CDN、静态网站托管);
- 需要轻量、稳定、低资源消耗的场景(如微服务网关、API 服务器)。
三、Nginx的用途
Nginx 凭借其高性能、轻量灵活的特性,用途极为广泛,从基础的 Web 服务到复杂的分布式架构,都能看到它的身影。以下是其核心用途及典型场景:
1. 作为 Web 服务器,直接托管网站
Nginx 最基础的功能是作为 HTTP 服务器,直接托管静态网站(如 HTML、CSS、JavaScript、图片、视频等静态资源)。
- 优势:对静态资源的处理效率极高(基于异步非阻塞架构),能快速读取文件并返回给客户端,且内存占用极低。
- 场景:个人博客、企业官网、静态文档站点(如使用 Hexo、Hugo 生成的静态网站)、图片 / 视频资源库等。
2. 反向代理服务器,隐藏后端服务
反向代理是 Nginx 最常用的功能之一:客户端请求先发送到 Nginx,再由 Nginx 转发到后端的应用服务器(如 Tomcat、Node.js、Python 服务等),最终将后端的响应返回给客户端。
- 作用:
- 隐藏后端服务器的真实 IP 和端口,提高安全性(客户端只能看到 Nginx 的地址);
- 统一入口(比如用
api.example.com转发到多个后端 API 服务); - 实现 “前后端分离” 架构(Nginx 处理前端静态资源,同时转发 API 请求到后端)。
- 场景:几乎所有动态网站(如电商平台、社交应用)都会用 Nginx 做反向代理,比如前端页面由 Nginx 直接返回,用户登录、下单等请求由 Nginx 转发给后端 Java/Python 服务。
3. 负载均衡,分发流量到多台服务器
当后端服务需要支撑高并发(如秒杀活动、大促)时,单台服务器可能扛不住压力,此时可部署多台相同的应用服务器,由 Nginx 作为 “调度中心”,将客户端请求均匀分发到这些服务器,实现负载均衡。
- 常见策略:
- 轮询(默认):按顺序依次分发到后端服务器;
- 权重(weight):给性能好的服务器分配更高权重,接收更多请求;
- IP 哈希(ip_hash):同一客户端 IP 始终转发到同一服务器(解决会话保持问题);
- 最少连接数(least_conn):优先转发到当前连接最少的服务器。
- 场景:大型网站(如淘宝、京东)的后端服务集群、微服务架构中同一服务的多实例部署等,通过负载均衡避免单台服务器过载,提高系统可用性。
4. 静态资源加速与 CDN 节点
Nginx 对静态资源(图片、视频、JS/CSS 等)的处理效率远高于动态服务器,因此常被用来专门托管静态资源,或作为 CDN(内容分发网络)的边缘节点。
- 优化手段:通过配置缓存策略(如
expires设置缓存过期时间)、启用 Gzip 压缩、支持断点续传等,进一步减少传输带宽、加速资源加载。 - 场景:短视频平台的封面图 / 视频片段分发、电商网站的商品图片存储、前端静态资源(如 Vue/React 打包后的文件)的快速分发。
5. API 网关,管理接口请求
在微服务架构中,后端会拆分为多个独立服务(如用户服务、订单服务、支付服务),Nginx 可作为 API 网关,统一处理所有客户端的接口请求:
- 功能:路由(根据 URL 将请求转发到对应微服务)、认证授权(验证 Token/API 密钥)、限流(限制单 IP 的请求频率,防止恶意攻击)、日志监控(记录所有接口调用情况)等。
- 优势:相比专门的网关工具(如 Spring Cloud Gateway),Nginx 更轻量、性能更高,适合中小规模微服务架构。
6. 缓存服务,减轻后端压力
Nginx 可缓存后端服务的响应结果(如 API 返回的 JSON 数据、数据库查询结果),当后续有相同请求时,直接返回缓存内容,无需再次请求后端。
- 适用场景:非实时更新的数据(如商品分类列表、热门文章),通过缓存减少后端数据库或 API 服务的压力,提升响应速度。
7. SSL 终结,处理 HTTPS 加密
HTTPS 通信需要进行 SSL/TLS 握手和加密解密,这一过程对服务器资源消耗较高。Nginx 可作为 “SSL 终结点”,在前端完成 HTTPS 的解密(将 HTTPS 请求转为 HTTP),再转发给后端服务器;后端响应则由 Nginx 加密后以 HTTPS 返回给客户端。
- 作用:减轻后端服务器的加密解密负担,同时集中管理 SSL 证书(只需在 Nginx 配置一次,无需每个后端服务单独配置)。
8. 邮件代理服务器
Nginx 还支持作为邮件代理(SMTP、POP3、IMAP 协议),用于邮件服务器的负载均衡或邮件转发。虽然这一用途不如 Web 相关功能普及,但在邮件服务集群中仍有应用。
四、Nginx使用教程
1、安装 Nginx
Nginx 支持 Linux、Windows、macOS 等系统,这里以最常用的Linux(Ubuntu/CentOS) 和Windows为例。
1.1 Linux 系统安装(推荐)
Linux 是 Nginx 的主要运行环境,安装方式简单且稳定。
-
Ubuntu/Debian:用
apt包管理器直接安装:# 更新软件源 sudo apt update # 安装Nginx sudo apt install nginx -y # 检查是否安装成功(显示版本即成功) nginx -v -
CentOS/RHEL:用
yum或dnf安装:# 安装EPEL源(Nginx在EPEL仓库中) sudo yum install epel-release -y # 安装Nginx sudo yum install nginx -y # 检查版本 nginx -v
安装完成后,Nginx 默认会自动启动,配置文件路径:
- 主配置文件:
/etc/nginx/nginx.conf - 站点配置文件(推荐存放处):
/etc/nginx/conf.d/(新建.conf文件即可)
1.2 Windows 系统安装
适合本地测试,生产环境建议用 Linux。
-
下载地址:Nginx 官方下载页,选择稳定版(Stable version)的
nginx-x.x.x.zip。 -
解压到任意目录(如D:\nginx),目录结构如下:
nginx/ ├─ conf/ # 配置文件(核心是nginx.conf) ├─ html/ # 默认静态文件(index.html、50x.html) ├─ logs/ # 日志文件(access.log、error.log) └─ nginx.exe # 启动程序
2、Nginx 基本操作(启动 / 停止 / 重载)
无论哪种系统,核心操作类似,以下以 Linux 为例(Windows 用nginx.exe替换nginx命令,在解压目录的 cmd 中执行)。
| 操作 | Linux 命令 | Windows 命令(cmd 中) | |
|---|---|---|---|
| 启动服务 | sudo systemctl start nginx 或 sudo nginx | start nginx 或直接双击nginx.exe | |
| 停止服务 | sudo systemctl stop nginx 或 sudo nginx -s stop | nginx -s stop | |
| 重启服务 | sudo systemctl restart nginx | nginx -s reload(热重载,推荐) | |
| 热重载配置(推荐) | sudo nginx -s reload | nginx -s reload(修改配置后无需停服) | |
| 查看服务状态 | sudo systemctl status nginx | 查看logs/error.log或进程(`tasklist | findstr nginx`) |
| 检查配置文件语法 | sudo nginx -t (关键!修改配置后必做) | nginx -t |
3、配置文件解析(核心)
Nginx 的功能通过配置文件实现,理解配置结构是关键。主配置文件nginx.conf的基本结构如下(简化版):
# 1. 全局块:配置影响Nginx整体的参数
user nginx; # 运行Nginx的用户(Linux)
worker_processes auto; # 工作进程数(建议设为CPU核心数,auto自动适配)
error_log /var/log/nginx/error.log; # 错误日志路径
pid /run/nginx.pid; # 进程ID文件路径# 2. events块:配置网络连接相关参数
events {worker_connections 1024; # 每个工作进程的最大连接数(总并发≈worker_processes * 1024)use epoll; # Linux下推荐用epoll模型(高效处理事件)
}# 3. http块:配置HTTP服务器的核心参数(可包含多个server块)
http {include /etc/nginx/mime.types; # 支持的文件类型(如html、css等)default_type application/octet-stream; # 默认文件类型# 日志格式定义(可自定义)log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main; # 访问日志路径sendfile on; # 开启高效文件传输(推荐开启)tcp_nopush on; # 配合sendfile使用,提高网络效率tcp_nodelay on;keepalive_timeout 65; # 长连接超时时间(秒)gzip on; # 开启Gzip压缩(减少传输带宽)# 引入其他配置文件(如conf.d目录下的站点配置)include /etc/nginx/conf.d/*.conf;# 4. server块:配置一个虚拟主机(网站)server {listen 80; # 监听端口(默认80,HTTP)server_name localhost; # 域名(如www.example.com)# 5. location块:匹配URL路径,配置具体路由规则location / {root /usr/share/nginx/html; # 静态资源根目录index index.html index.htm; # 默认首页文件}# 错误页面配置(如404、500)error_page 404 /404.html;location = /404.html {root /usr/share/nginx/html;}}
}
核心逻辑:http块包含多个server(虚拟主机),每个server通过listen和server_name区分,location块根据 URL 路径匹配并执行具体规则(如返回静态文件、转发请求等)。
4、常用场景配置示例
以下是实际开发中最常用的场景,直接修改配置文件后执行nginx -t检查语法,再nginx -s reload生效。
4.1 静态资源托管(部署静态网站)
适合托管 HTML、CSS、JS、图片等静态文件(如个人博客、企业官网)。
步骤:
- 准备静态文件,比如放在
/var/www/myblog(Linux)或D:\myblog(Windows)。 - 在
/etc/nginx/conf.d/(Linux)或conf/(Windows)新建myblog.conf,配置如下:
server {listen 80; # 监听80端口server_name blog.example.com; # 绑定域名(本地测试可用localhost)# 静态资源根目录(替换为你的文件路径)root /var/www/myblog; # 默认首页(访问域名时自动加载)index index.html index.htm;# 配置缓存(可选,加速静态资源加载)location ~* \.(jpg|jpeg|png|gif|css|js)$ {expires 30d; # 图片、CSS、JS缓存30天}
}
效果:访问http://blog.example.com(或http://localhost)即可看到静态网站。
4.2 反向代理(转发请求到后端服务)
场景:前端静态资源由 Nginx 托管,API 请求转发到后端服务(如 Node.js、Java 服务)。
例如:后端服务运行在127.0.0.1:3000,希望通过http://api.example.com访问。
配置api.conf:
server {listen 80;server_name api.example.com;# 所有请求转发到后端服务location / {proxy_pass http://127.0.0.1:3000; # 后端服务地址proxy_set_header Host $host; # 传递主机名到后端proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
效果:访问http://api.example.com/user会自动转发到http://127.0.0.1:3000/user。
4.3 负载均衡(分发流量到多台后端服务器)
场景:后端有 3 台服务(192.168.1.10:8080、192.168.1.11:8080、192.168.1.12:8080),通过 Nginx 分发请求。
配置loadbalance.conf:
# 定义后端服务器集群(upstream块)
upstream backend_servers {# 轮询策略(默认,按顺序分发)server 192.168.1.10:8080;server 192.168.1.11:8080 weight=2; # 权重2(接收更多请求)server 192.168.1.12:8080;# 可选:其他策略# ip_hash; # 同一IP固定转发到同一服务器(解决会话问题)# least_conn; # 转发到连接最少的服务器
}# 前端Nginx配置
server {listen 80;server_name www.example.com;location / {proxy_pass http://backend_servers; # 转发到上面定义的集群proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
效果:请求会按权重分发(1.11 接收的请求是 1.10 和 1.12 的 2 倍),避免单台服务器过载。
4.4 配置 HTTPS(加密访问)
需要先申请 SSL 证书(如 Let’s Encrypt 免费证书),假设证书文件为cert.pem(公钥)和key.pem(私钥)。
配置https.conf:
server {listen 443 ssl; # 监听443端口(HTTPS默认)server_name www.example.com;# SSL证书配置ssl_certificate /etc/nginx/cert/cert.pem; # 公钥路径ssl_certificate_key /etc/nginx/cert/key.pem; # 私钥路径# 可选:SSL优化(增强安全性)ssl_protocols TLSv1.2 TLSv1.3; # 支持的TLS版本ssl_ciphers HIGH:!aNULL:!MD5; # 加密套件# 静态资源或反向代理配置(同前面的示例)location / {root /var/www/html;index index.html;}
}# 可选:HTTP自动跳转HTTPS
server {listen 80;server_name www.example.com;return 301 https://$host$request_uri; # 强制跳转HTTPS
}
5、日志管理
Nginx 日志是排查问题的关键,默认分为两种:
- 错误日志:记录启动、运行中的错误(如配置错误、后端服务不可达),路径在
error_log指令中配置(如/var/log/nginx/error.log)。 - 访问日志:记录所有客户端请求(IP、时间、URL、状态码等),路径在
access_log指令中配置,格式由log_format定义。
查看日志示例:
# 查看错误日志(最后10行)
tail -10 /var/log/nginx/error.log# 实时查看访问日志
tail -f /var/log/nginx/access.log
6、常见问题解决
- 启动失败:执行
nginx -t检查配置文件语法错误,或查看error.log找具体原因(如端口被占用,用netstat -tulpn | grep 80检查)。 - 修改配置不生效:忘记执行
nginx -s reload,或配置文件路径错误(需放在conf.d目录并被include)。 - 静态文件 403 错误:Nginx 用户(如
nginx)没有静态文件目录的读取权限,执行chmod -R 755 /var/www/myblog授权。
