Nginx:高性能的轻量级服务器
一、Nginx简介
Nginx是一款由俄罗斯程序员伊戈尔·西索夫开发的高性能HTTP服务器/反向代理服务器,同时也支持IMAP/POP3邮件代理。官方测试中,Nginx能支撑5万并发连接,且CPU、内存资源消耗极低,运行稳定性拉满,这也是它能成为互联网企业标配的核心原因。
核心定位与适用场景
Nginx和Tomcat的功能区分:Nginx仅能发布静态项目,擅长处理静态资源请求;而Tomcat则可以Web动态项目发布,处理动态数据请求。
Nginx的核心应用场景主要有4类:
1. HTTP静态服务器:独立提供静态网页、图片、视频等资源的访问服务,处理静态请求的效率远高于传统服务器;
2. 虚拟主机:在单台服务器上虚拟出多个网站,节省服务器资源,满足个人或企业多站点部署需求;
3. 反向代理与负载均衡:当单台服务器无法承载高并发时,通过Nginx将请求转发至后端服务器集群,实现负载均分,避免单台服务器宕机;
4. 解决跨域:轻松处理前后端分离项目中的跨域请求问题,替代前端本地代理的临时方案。
实践:动静分离
动静分离是Nginx最经典的使用方式,通过中间件将动态请求和静态请求分离,减少不必要的资源消耗,降低请求延时。
静态请求(如CSS、JS、图片):直接由Nginx处理,从Nginx配置的静态资源目录中获取资源,响应速度极快;
动态请求(如接口调用、数据查询):Nginx通过反向代理,将请求转发给Tomcat等后端动态服务器处理。
核心优势:即使后端动态服务不可用,静态资源依然能正常访问,保证网站基础展示效果。
二、Nginx基础:安装、启动与目录解析
1. 下载与安装
Nginx官方下载地址:http://nginx.org/en/download.html,提供主线版本(Mainline)和稳定版本(Stable),生产环境建议选择稳定版本,保证运行可靠性。
安装注意事项:解压后的文件夹路径不要包含中文和空格,避免出现配置或启动异常。
2. 核心目录结构
以Windows版Nginx-1.20.1为例,解压后核心目录及作用如下,Linux版本目录结构基本一致,仅可执行文件和路径略有差异:
├── conf/ # 所有配置文件目录,核心为nginx.conf
├── contrib/ # 开源爱好者共享的扩展代码
├── docs/ # 官方文档资料
├── html/ # 默认静态站点目录,存放首页和错误页面
├── logs/ # 日志目录,包含访问日志、错误日志、进程PID文件
├── temp/ # 运行时临时文件目录
└── nginx.exe # Windows版可执行程序,用于启动、停止服务
关键文件说明:
conf/nginx.conf:Nginx主配置文件,所有核心功能配置均在此文件中修改;
conf/mime.types:配置媒体资源类型,让Nginx识别不同的文件格式;
html/index.html:Nginx默认首页,启动成功后访问localhost即可看到;
html/50x.html:5xx错误默认页面,服务器异常时优雅展示;
logs/access.log:所有访问请求的日志,便于排查访问问题;
logs/error.log:运行错误日志,是排查Nginx故障的核心依据。
3. 常用操作命令
Nginx的操作命令需在根目录下的命令执行,Windows和Linux核心命令基本一致(Linux无.exe,且可将Nginx加入系统服务),常用命令如下:
# 启动Nginx
start nginx # Windows
nginx # Linux
# 关闭Nginx(处理完当前请求后关闭)
nginx -s stop
# 重启Nginx(配置文件修改后,需重启生效)
nginx -s reload
# 检查配置文件语法(修改配置后必执行,避免语法错误导致启动失败)
nginx -t
4. 启动验证
启动Nginx后,打开浏览器输入http://localhost或http://localhost:80(Nginx默认端口为80),若看到Welcome to nginx!页面,说明Nginx启动成功。
三、Nginx核心配置:
Nginx的所有功能都通过conf/nginx.conf配置文件实现,该文件的配置结构层级清晰,主要分为四个核心部分,且存在继承关系:
main { # 全局设置:与具体业务无关的基础配置,所有模块均可继承
}
http { # 服务器核心配置:处理HTTP/HTTPS请求,可包含多个server
upstream {} # 负载均衡配置:定义后端服务器集群,无继承关系
server { # 虚拟主机配置:单个站点的核心配置,继承http
location {} # URL匹配配置:处理具体请求路径,继承server
}
}
继承规则:server继承main,location继承server,upstream既不继承其他配置,也不被其他配置继承。
1. 全局配置(main)
全局配置主要设置Nginx运行的基础参数,与具体的HTTP服务无关,核心配置项:
worker_processes 1; # 工作进程数,建议值:1~CPU线程数,多核CPU可设置为CPU核心数
error_log logs/error.log; # 全局错误日志路径,日志等级:debug/info/notice/warn/error/crit
pid logs/nginx.pid; # Nginx进程PID文件路径,用于标识进程ID
2. 工作模式(events)
属于全局配置的子模块,设置Nginx的网络连接处理模式,核心配置项:
events {
worker_connections 1024; # 单个工作进程最大并发连接数,建议1万~5万,根据服务器性能调整
}
3. HTTP核心配置(http)
处理所有HTTP请求的基础配置,可包含多个server模块,核心配置项:
http {
include mime.types; # 引入媒体类型配置文件,识别文件格式
default_type application/octet-stream; # 默认未知文件类型
sendfile on; # 开启高性能文件传输模式,提升静态资源响应速度
keepalive_timeout 65; # 客户端与服务器的连接保持时间,单位:秒
}
4. 虚拟主机配置(server)
一个http模块中可配置多个server,每个server对应一个虚拟主机(一个站点),核心配置项:
server {
listen 80; # 监听端口,默认80,多个虚拟主机需设置不同端口
server_name localhost; # 主机名/域名/IP,如www.xxx.com、192.168.1.100
error_page 404 /404.html; # 404错误页面配置
error_page 500 502 503 504 /50x.html; # 5xx服务器错误页面配置
}
5. URL匹配配置(location)
server的核心子模块,一个server可包含多个location,用于匹配不同的请求URL,实现请求转发或静态资源访问,核心语法:
location 匹配规则 {
配置指令; # 如根目录、请求转发、默认首页等
}
基础示例(默认首页配置):
location / { # 匹配根目录下所有请求(http://localhost/xxx)
root html; # 静态资源根目录,对应Nginx的html文件夹
index index.html index.htm; # 默认首页,按顺序查找
}
四、Nginx实战1:静态部署与虚拟主机
1. 静态网站部署
将静态网站的所有文件(HTML、CSS、JS、图片等)直接复制到Nginx的html目录下,启动Nginx后,访问http://localhost:端口即可直接访问,无需额外配置。
2. 虚拟主机配置(多站点部署)
在单台Nginx服务器上部署多个静态站点,通过不同端口区分,核心步骤如下:
步骤1:准备静态资源
在Nginx根目录下创建两个文件夹campus和travel,分别放入校园网和旅游网的静态文件。
步骤2:修改nginx.conf配置
在http模块中添加两个server,分别监听81和82端口:
# 校园网站点:监听81端口
server {
listen 81;
server_name localhost;
location / {
root campus; # 静态资源根目录为campus
index index.html; # 默认首页
}
}
# 旅游网站点:监听82端口
server {
listen 82;
server_name localhost;
location / {
root travel; # 静态资源根目录为travel
index index.html; # 默认首页
}
}
步骤3:验证访问
执行nginx -t检查配置语法,无错误后执nginx -s reload重启Nginx,分别访问:
http://localhost:81:打开校园网首页
http://localhost:82:打开旅游网首页
五、Nginx实战2:反向代理(核心功能)
1. 代理的分类与区别
代理分为正向代理和反向代理,核心区别在于代理的对象不同,简单来说:代理哪端,隐藏哪端。
| 代理类型 | 代理对象 | 核心作用 | 典型场景 |
|---|---|---|---|
| 正向代理 | 客户端 | 隐藏真实客户端 IP,保护客户端安全 | 网络代理工具、科学上网 |
| 反向代理 | 服务器 | 隐藏真实服务器 IP,保护服务器集群,实现请求转发 | 企业级站点、高并发服务 |
反向代理核心流程:
客户端 → 发送请求至Nginx代理服务器 → Nginx将请求转发至后端真实服务器 → 后端服务器返回结果至Nginx → Nginx将结果返回给客户端。
客户端全程只知道Nginx的IP,不知道后端真实服务器的存在,极大提升了服务器集群的安全性。
2. 反向代理实战(对接Tomcat)
实现效果:访问Nginx的80端口,自动将请求转发至Tomcat的8080端口,访问旅游网动态项目。
准备工作
1. 将旅游网动态项目(此处可换成实际项目)部署到Tomcat的ROOT目录;
2. 启动Tomcat,访问http://localhost:8080,确认项目能正常打开。
配置Nginx反向代理
修改Nginx的nginx.conf,在http模块中添加upstream和修改server配置:
# 定义后端服务器集群,命名为tomcat-travel
upstream tomcat-travel {
server 127.0.0.1:8080; # Tomcat服务器地址和端口
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat-travel; # 将请求转发至定义的后端集群
index index.html; # 默认首页
}
}
验证效果
重启Nginx后,访问http://localhost(Nginx默认80端口),Nginx会自动将请求转发至Tomcat的8080端口,成功打开旅游网动态项目,实现反向代理。
六、负载均衡(高并发解决方案)
当单台Tomcat服务器无法承载高并发(Tomcat默认并发300-500),会出现请求无响应、内存溢出等问题,此时需要通过Nginx负载均衡将请求分摊到多台Tomcat服务器,提升系统的并发处理能力和稳定性。
Nginx的并发能力可达5万,理论上可实现1台Nginx对应100台Tomcat的配置,轻松解决高并发瓶颈。
1. 负载均衡的实现方式
目前主流的负载均衡方式有3种,企业级开发中以软件负载均衡为主:
1. DNS负载均衡:通过DNS服务器将域名解析为多个服务器IP,随机分配请求,配置简单,但无法灵活控制;
2. 硬件负载均衡:如F5设备,性能极强(每秒处理百万级请求),自带防火墙,但价格昂贵,适合大型企业;
3. 软件负载均衡:如Nginx、LVS、HAProxy,免费开源、配置灵活、可二次开发,是互联网企业的首选。
2. 负载均衡实战
实现效果:访问Nginx的80端口,Nginx将请求随机转发至8080、8081、8082三台Tomcat服务器,实现负载均分。
准备工作
1. 复制三份Tomcat,分别修改端口为8080、8081、8082,避免端口冲突;
2. 为三台Tomcat的项目首页添加不同标记(如【服务器1】【服务器2】【服务器3】),便于区分;
3. 分别启动三台Tomcat,确认均可正常访问。
配置Nginx负载均衡
修改Nginx的nginx.conf,配置upstream后端集群,包含三台Tomcat:
# 定义Tomcat集群,命名为tomcat-nginx
upstream tomcat-nginx {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat-nginx; # 将请求转发至Tomcat集群
index index.html;
}
}
验证效果
重启Nginx后,访问http://localhost,不断刷新页面,会看到页面交替显示三台Tomcat的标记,说明Nginx已将请求均匀转发至三台服务器,负载均衡配置成功。
3. 核心负载均衡策略
Nginx默认采用轮询策略,同时支持多种自定义策略,可根据后端服务器的性能差异灵活配置,核心策略如下:
(1)轮询(默认)
请求按顺序依次转发至后端服务器,各服务器请求次数均等,适合后端服务器性能一致的场景,无需额外配置,即上述实战的默认配置。
(2)权重(weight)
为后端服务器设置权重值,权重越高,接收的请求越多,适合后端服务器性能不一致的场景,性能越好的服务器,权重设置越高。
upstream tomcat-nginx {
server 127.0.0.1:8080 weight=1; # 权重1,接收1份请求
server 127.0.0.1:8081 weight=2; # 权重2,接收2份请求
server 127.0.0.1:8082 weight=3; # 权重3,接收3份请求
}
效果:三台服务器的请求占比为1:2:3,性能最好的8082服务器接收最多请求。
(3)IP哈希(ip_hash)
根据客户端IP进行哈希计算,将同一客户端的所有请求转发至同一台后端服务器,核心作用是实现会话保持,避免客户端在多台服务器间切换导致的会话丢失问题。
upstream tomcat-nginx {
ip_hash; # 开启IP哈希策略
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
注意:IP哈希策略性能较低,生产环境更推荐使用Token/Redis实现分布式会话,替代IP哈希。
(4)最少连接数(least_conn)
Nginx会将请求转发至当前连接数最少的后端服务器,适合后端服务器请求处理速度不一致的场景,避免部分服务器因请求堆积导致负载过高。
upstream tomcat-nginx {
least_conn; # 开启最少连接数策略
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
5)响应时间最少(fair,第三方)
根据后端服务器的平均请求处理时间,将请求转发至响应时间最短的服务器,进一步提升请求处理效率,需安装第三方模块才能使用。
upstream tomcat-nginx {
fair; # 开启响应时间最少策略
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=2;
}
更多推荐




所有评论(0)