一、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;

}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐