Nginx 从安装到集群实战:反向代理、负载均衡、动静分离一站式教程
大家好,本篇文章将从零开始系统讲解 Nginx,涵盖安装、配置、核心功能、反向代理、URL 重写、虚拟主机、负载均衡,以及 Nginx+Tomcat 集群架构,全程可直接落地生产环境。
一、Nginx 基础介绍
Nginx(engine x)是一款高性能 HTTP 和反向代理 Web 服务器,核心优势:
- 内存占用极低
- 并发能力极强(同类型服务器表现最优)
- 国内大厂广泛使用:百度、京东、新浪、网易、腾讯、淘宝等
官方网站:http://nginx.org/
版本说明
- Mainline version:主线开发版,更新快(每月 1~2 次)
- Stable version:稳定版,生产环境强烈推荐
- Legacy versions:历史稳定版
本文以 Nginx 1.24.0 稳定版 为例。
本文演示基于Centos 7为主。
二、Nginx 安装和配置(CentOS/RHEL)
1. 源码安装(本文使用)
(1)先安装Nginx 依赖
在安装Nginx之前,需要安装一些Nginx的依赖程序,Nginx的主要依赖程序有zlib、pcre、openssl三个,其中,zlib用于支持gzip模块,pcre用于支持rewrite模块,openssl用于支持ssl功能,为了简单快捷,推荐通过yum安装zlib、pcre、openssl软件包,安装方式如下:
yum -y install zlib pcre pcre-devel openssl openssl-devel
(2)编译并安装
# 下载解压
tar zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 编译配置
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--pid-path=/usr/local/nginx/logs/nginx.pid \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-pcre
# 编译安装
make && make install
(3)Nginx编译参数
其中,每个编译参数的含义如下所示:
--prefix 指定Nginx程序的安装路径
--sbin-path 设置Nginx二进制文件的路径名
--conf-path 指定Nginx配置文件路径
--error-log-path 指定Nginx错误日志文件路径
--http-log-path 指定Nginx访问日志文件路径
--pid-path 设置Nginx的pid文件nginx.pid的路径
--lock-path 设置Nginx的lock文件nginx.lock文件路径
--with-openssl 指定OpenSSL源码包的路径,如果编译的时候没有指定“--with-openssl”选项,那么默认会使用系统自带的openssl库
--with-pcre 设置Nginx启用正则表达式
--with-http_stub_status_module 安装用来监控Nginx状态的模块
--with-http_ssl_module 表示启用Nginx的SSL模块,此模块依赖“--with-openssl”这个选项,通常一起使用。
--with-http_gzip_static_module 表示启用Nginx的gzip压缩
2. Yum 安装(简单快速)
yum -y install nginx
缺点:版本不一定最新。
3. 配置systemd管理Nginx
(1)编写 service 文件
vi /etc/systemd/system/nginx.service
内容如下:
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/bin/rm -f /usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
(2)重载并管理服务
systemctl daemon-reload
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl enable nginx
systemctl status nginx
执行演示:
先通过yum -y install zlib pcre pcre-devel openssl openssl-devel安装ngnix依赖。
安装完成可以看见如图所示页面。

在官网下载对应的nginx源码压缩包,然后上传到自己的虚拟机

然后我们对其进行解压缩,解压完成我们可以看见一个nginx-1.24.0的目录

然后我们cd cd nginx-1.24.0/进入该目录下,进行系统环境检查和编译配置
如图所示就是配置成功了

最后就是编译和安装
![]()
![]()
我们可以进入到/usr/local/nginx

conf主要就是配置文件。html存放的网页资源,logs就是存放的日志,sbin就是nginx的可执行程序
然后我们可以通过sbin目录下的二进制文件启动我们的nginx服务

为了更方便的管理nginx我们可以编写一个脚本
修改之后一定要重新加载配置,现在我们可以看到active(runing)说明服务以及启动成功

三、Nginx 配置文件核心解读
Nginx安装完毕后,会产生相应的安装目录,根据前面的安装路径,Nginx的配置文件路径为/usr/local/nginx/conf,其中nginx.conf为Nginx的主配置文件。
配置文件:/usr/local/nginx/conf/nginx.conf
Nginx配置文件默认有五个部分组成:分别是main、events、http、server和location,其中,main部分设置的指令将影响其他所有设置;events部分用来配置影响nginx服务器或与用户的网络连接;http部分可以嵌套多个server,主要用来配置代理,缓存,自定义日志格式等绝大多数功能和第三方模块的配置,server部分用于配置虚拟主机的相关参数;location部分用于配置请求的处理规则,以及各种页面的处理情况。这五者之间的关系是:main与events平级,一个http中可以有多个server,server继承main,location继承server。
如下所示:
默认分为 5 块:main → events → http → server → location
main
└── events
└── http
├── server
│ └── location
└── server
main:全局配置
events:连接处理
http:Web 服务核心
server:虚拟主机
location:请求匹配规则

1. 全局配置(main)
(1)user:指定Worker进程运行身份
定义Nginx Worker进程的运行用户和用户组,默认情况下由nobody账号运行(权限较低,安全性一般)。实际部署中,建议指定专用用户(如www),避免使用root账号运行,降低安全风险。
示例配置:
user www www;
说明:第一个www是用户名,第二个www是用户组,需提前在系统中创建该用户和组
useradd -r -s /sbin/nologin www
(2)worker_processes:设置Worker进程数
指定Nginx启动的Worker进程数量,Worker进程是实际处理客户端请求的进程,数量设置直接影响并发处理能力。
配置原则:
-
一般设置为服务器CPU核心数,可充分利用CPU资源,避免进程切换带来的性能损耗。
-
查看CPU核心数命令(Linux系统):
grep ^processor /proc/cpuinfo | wc -l
可以看到我的虚拟机cpu核数就是1核

-
Nginx 1.10版本及以后,支持
auto参数,Nginx会自动检测CPU核心数,并开启对应数量的Worker进程(推荐新手使用)。
示例配置:
# 手动设置(4核CPU) worker_processes 4;
# 自动检测(推荐) worker_processes auto;
(3)worker_cpu_affinity:绑定Worker进程与CPU核
将Nginx Worker进程与指定的CPU核心绑定,避免多核CPU之间的进程切换,减少性能损耗,尤其在高并发场景下效果明显,需与worker_processes配合使用。
配置规则:
-
用二进制数字(1和0)表示CPU核心的启用状态,1表示启用该核心,0表示禁用。
-
CPU有多少核,就需要写多少位二进制数,多个进程对应多个二进制数(用空格分隔)。
示例配置(对应不同核数CPU):
# 4核CPU,4个Worker进程,每个进程绑定一个核心 worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
# 8核CPU,绑定第一个核心(仅1个Worker进程) worker_processes 1;
worker_cpu_affinity 00000001;
# 8核CPU,8个Worker进程,每个进程绑定一个核心 worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
(4)error_log:全局错误日志配置
定义Nginx全局错误日志的存储路径和日志输出级别,用于排查Nginx启动、运行过程中的错误(核心排查工具)。
日志级别(从详细到简洁):debug > info > notice > warn > error > crit
-
debug:最详细,适合开发、调试阶段(日志量大,不建议生产环境使用)。
-
error/crit:最简洁,仅记录严重错误,适合生产环境(节省磁盘空间)。
示例配置:
# 生产环境配置(仅记录错误信息) error_log /var/log/nginx/error.log error;
# 调试环境配置(记录详细调试信息) error_log /var/log/nginx/debug.log debug;
(5)pid:指定进程ID存储文件
指定Nginx主进程ID(PID)的存储文件路径,方便管理Nginx进程(如启动、停止、重启)。
示例配置:
pid /var/run/nginx.pid;
说明:
默认路径通常为/var/run/nginx.pid,若修改路径,需确保Nginx有该路径的写入权限。
(6)worker_rlimit_nofile:设置进程最大打开文件数
指定单个Nginx Worker进程可以打开的最大文件描述符数目(Linux系统中,文件、网络连接都属于文件描述符),直接影响Nginx的并发连接能力。
示例配置:
worker_rlimit_nofile 65535;
注意:
该配置需配合系统级设置生效,需执行命令ulimit -n 65535(临时生效),若需永久生效,需修改/etc/security/limits.conf文件,添加以下内容:
* soft nofile 65535
* hard nofile 65535
(7)events模块(全局连接相关配置)
events模块属于全局配置的一部分,用于设定Nginx的工作模式和连接数上限,决定Nginx处理客户端连接的效率。
核心配置示例:
events { # 工作模式(Linux系统首选epoll,高效模式)
use epoll;
# 单个Worker进程的最大连接数
worker_connections 1024;
}
关键参数说明:
-
use:指定Nginx的工作模式,支持的模式如下:
-
select/poll:标准模式,兼容性好,适用于所有系统,但性能一般。
-
epoll:Linux系统专属高效模式,支持大量并发连接,推荐生产环境使用。
-
kqueue/dev/poll:分别适用于FreeBSD、Solaris系统,功能与epoll类似。
-
-
worker_connections:单个Worker进程的最大连接数,默认1024,可根据服务器配置调整(如调整为65535)。
补充:最大客户端连接数计算
在纯Nginx服务(无反向代理、无后端应用)中,Nginx能支持的最大客户端连接数计算公式:
max_client = worker_processes * worker_connections
示例:4个Worker进程,每个进程最大连接数65535,则最大客户端连接数为 4 * 65535 = 262140。
注意:进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
2.HTTP服务器配置
(1)include:引入外部配置文件
主模块指令,用于引入外部配置文件,将分散的配置(如MIME类型、虚拟主机配置)拆分到不同文件中,减少主配置文件(nginx.conf)的复杂度,便于维护和管理,类似Apache的include指令。
示例配置:
# 引入MIME类型配置(指定不同文件后缀对应的响应类型)
include mime.types;
# 引入所有虚拟主机配置文件(将虚拟主机配置单独放在vhost目录下)
include /etc/nginx/vhost/*.conf;
说明:
mime.types是Nginx默认的MIME类型配置文件,默认路径通常为/etc/nginx/mime.types,无需手动修改,引入即可正常解析HTML、CSS、JS等文件类型。
(2)default_type:设置默认文件类型
HTTP核心模块指令,用于设定Nginx无法识别文件类型时的默认响应类型,默认值通常为application/octet-stream(二进制流)。
示例配置:
default_type application/octet-stream;
(3)log_format:定义访问日志输出格式
用于指定Nginx访问日志的输出格式,自定义日志中包含的信息(如客户端IP、请求时间、请求方式、状态码等),方便后续日志分析和问题排查。
关键说明:
-
需先定义日志格式(指定格式名称,如main),再通过
access_log指令引用该格式。 -
常用日志变量:
$remote_addr(客户端IP)、$time_local(请求时间)、$request(请求方式+请求路径)、$status(响应状态码)、$http_user_agent(客户端浏览器信息)。
示例配置(定义+引用):
# 定义日志格式,名称为main(可自定义)
log_format main '$remote_addr [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 引用main格式,指定访问日志存储路径
access_log /var/log/nginx/access.log main;
说明:
访问日志默认存储路径为/var/log/nginx/access.log,可根据需求修改,日志格式可按需添加/删除变量。
(4) sendfile、tcp_nopush、tcp_nodelay:开启高效文件传输
三者配合使用,优化Nginx文件传输性能,减少网络阻塞,提升响应速度,尤其适用于静态文件(HTML、CSS、图片、视频)服务。
各参数说明:
-
sendfile on:开启高效文件传输模式,避免用户空间与内核空间的数据拷贝,提升文件传输效率(默认off,推荐开启)。 -
tcp_nopush on:开启后,Nginx会等待数据包积累到一定大小后再发送,减少TCP连接的请求次数,降低网络开销(需配合sendfile开启)。 -
tcp_nodelay on:开启后,禁止Nginx延迟发送数据,确保数据及时传输,适用于高并发、低延迟的场景(如实时交互)。
示例配置:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
(5)keepalive_timeout:设置客户端连接超时时间
设置客户端与Nginx服务器建立的TCP连接保持活动的超时时间,超过该时间后,服务器会主动关闭连接,释放资源。
配置原则:超时时间不宜过长(避免占用过多连接资源),也不宜过短(频繁建立连接会增加开销),一般设置为60s~120s。
示例配置:
keepalive_timeout 65;
说明:单位为秒,若设置为0,则关闭长连接,每次请求都需要重新建立TCP连接。
(6)server_names_hash_bucket_size:优化server name查找效率
Nginx使用散列表(hash表)存储虚拟主机的server name(域名),该指令用于设置每个散列桶占用的内存大小,优化域名查找速度,避免因域名过多导致查找缓慢。
常用配置:根据服务器内存和域名数量调整,一般设置为128(单位:字节),若域名较多(如几十个以上),可调整为256。
示例配置:
server_names_hash_bucket_size 128;
(7)client_max_body_size:限制客户端请求文件大小
用于设置客户端单次请求中,单个上传文件的最大字节数,防止客户端上传过大文件导致服务器磁盘空间占用过多、带宽拥堵。可根据实际需求调整,一般设置为10m~50m,示例中设置为30m。
示例配置:
client_max_body_size 30m;
注意:若客户端上传的文件超过该限制,Nginx会返回413(Request Entity Too Large)错误,需根据业务需求合理调整。
(8)client_header_buffer_size:设置请求头缓冲区大小
指定客户端请求头(header)的缓冲区大小,用于存储客户端发送的请求头信息(如Cookie、User-Agent、自定义请求头)。
配置原则:默认缓冲区大小为1k,大多数场景下足够使用;若客户端请求头中包含较大的Cookie、自定义消息头,需增大缓冲区大小,示例中设置为32k。
示例配置:
client_header_buffer_size 32k;
(10)large_client_header_buffers:设置大请求头缓存
用于处理客户端发送的较大请求头(如超长Cookie、自定义复杂请求头),指定缓存的最大数量和单个缓存的大小,避免因请求头过大导致Nginx无法处理。
参数说明:4 128k 表示最多缓存4个大请求头,每个缓存的大小为128k,最大缓存总量为4×128k=512k。
示例配置:
large_client_header_buffers 4 128k;
注意:若客户端请求头超过该缓存限制,Nginx会返回400(Bad Request)错误,需根据实际请求头大小调整。
3.Http Gzip模块配置
(1)gzip:开启/关闭GZIP压缩
作用:核心开关指令,用于控制是否开启HttpGzip模块的实时压缩功能,决定响应数据流是否被压缩后传输。
参数说明:
-
gzip on:开启GZIP压缩,实时压缩输出的HTTP响应数据流(推荐生产环境开启)。 -
gzip off:关闭GZIP压缩,响应数据不进行压缩,默认值为off。
示例配置:
gzip on;
说明:
开启后,Nginx会自动对符合条件的资源进行压缩,客户端(浏览器)接收后会自动解压,无需额外配置客户端。
(2)gzip_min_length:设置允许压缩的最小文件大小
指定允许进行GZIP压缩的页面(或资源)最小字节数,字节数从HTTP响应头的Content-Length字段中获取。
配置原则:
-
默认值为0,即无论资源大小,均进行压缩,但小于1k的小型资源(如小图标、短文本)压缩后可能比原始文件更大(压缩本身会增加少量头部信息),反而浪费带宽。
-
推荐设置为1k及以上,仅对大于1k的资源进行压缩,兼顾压缩效果和性能。
示例配置:
gzip_min_length 1k;
(3)gzip_buffers:设置压缩缓存缓冲区
指定Nginx用于存储GZIP压缩结果的缓存缓冲区数量和单个缓冲区大小,优化压缩效率,减少磁盘I/O开销。
参数说明:4 16k 表示申请4个缓冲区,每个缓冲区的大小为16k,总缓存大小为4×16k=64k。
补充说明:
-
默认配置为申请与原始数据大小相同的内存空间作为缓存,会占用较多内存资源。
-
建议根据服务器内存配置调整,16k/32k为常用缓冲区大小,缓冲区数量一般设置为4~8个即可。
示例配置:
gzip_buffers 4 16k;
(4)gzip_http_version:指定支持的HTTP协议版本
设置Nginx识别的HTTP协议版本,只有当客户端发送的HTTP请求版本符合该设置时,才会对响应数据进行GZIP压缩。
参数说明:
-
默认值为1.1,目前主流浏览器(Chrome、Firefox、Edge等)均支持HTTP/1.1协议,无需修改。
-
若需兼容老旧浏览器(仅支持HTTP/1.0),可设置为1.0,但实际场景中几乎无需调整,保持默认即可。
示例配置:
gzip_http_version 1.1;
(5)gzip_comp_level:设置GZIP压缩比
指定GZIP压缩的压缩级别,控制压缩效果和服务器CPU消耗,压缩比越高,响应数据越小,但服务器处理耗时越长、CPU占用越高。
压缩级别说明(1~9级):
-
1级:压缩比最小,处理速度最快,CPU消耗最低,适合高并发、CPU资源紧张的场景。
-
9级:压缩比最大,响应数据传输速度最快,但处理速度最慢,CPU消耗最高,适合CPU资源充足、追求极致压缩效果的场景。
-
推荐级别:2~6级,兼顾压缩效果和CPU性能,其中2级为常用配置(示例中设置为2级)。
示例配置:
gzip_comp_level 2;
(6)gzip_types:指定需要压缩的资源类型
明确指定哪些MIME类型的资源需要进行GZIP压缩,未指定的类型不会被压缩。
关键说明:
-
无论是否指定,
text/html类型(HTML页面)总会被自动压缩,无需额外添加。 -
常用需压缩的类型:文本类(text/plain)、JS(application/x-javascript)、CSS(text/css)、XML(application/xml),可根据业务需求添加更多类型(如JSON、SVG等)。
示例配置:
gzip_types text/plain application/x-javascript text/css application/xml;
补充示例(扩展更多类型):
gzip_types text/plain application/x-javascript text/css application/xml application/json image/svg+xml;
4.server模块配置(虚拟主机)
(1)server:虚拟主机开始标识
定义一个虚拟主机的开始,是虚拟主机配置的关键字,所有虚拟主机相关配置均需放在server { ... }块内。
一个server { ... }块对应一个虚拟主机,多个虚拟主机可在http块内并列配置,Nginx会根据客户端请求的域名/IP,匹配对应的server块进行处理。
基础格式:
server {
# 虚拟主机配置项
}
(2)listen:指定虚拟主机监听端口
用于指定当前虚拟主机监听的HTTP端口,客户端需通过该端口访问虚拟主机,默认HTTP端口为80,HTTPS端口为443。
常用配置场景:
-
监听默认80端口(最常用,客户端访问时可省略端口);
-
监听自定义端口(如8080、8081),适用于一台服务器部署多个网站,且端口不冲突的场景;
-
指定IP+端口监听(如
listen 192.168.1.100:80;),适用于服务器有多个IP的场景。
示例配置:
# 监听默认80端口(推荐)
listen 80;
# 监听自定义端口8080
listen 8080;
# 监听指定IP+端口
listen 192.168.1.100:80;
(3)server_name:指定虚拟主机绑定的域名/IP
指定当前虚拟主机对应的IP地址或域名,Nginx会根据客户端请求的Host头(域名/IP),匹配对应的server块,是区分多个虚拟主机的核心配置。
配置规则:
-
多个域名之间用空格分隔,可绑定主域名、子域名;
-
可使用通配符(如
*.example.com,匹配所有子域名); -
默认值为
localhost,匹配本地访问(127.0.0.1)。
示例配置:
# 绑定单个域名
server_name www.example.com;
# 绑定多个域名(主域名+子域名)
server_name www.example.com example.com blog.example.com;
# 绑定通配符域名(匹配所有子域名)
server_name *.example.com;
# 绑定IP地址 server_name 192.168.1.100;
说明:当客户端访问www.example.com时,Nginx会匹配到对应的server块,处理该请求;若未匹配到任何server_name,会默认使用第一个server块的配置。
(4)index:设置默认首页
指定客户端访问虚拟主机时,默认加载的首页文件(无需手动输入文件名),优先级按配置顺序排列,找到第一个存在的文件即加载。
常用首页文件:index.html(静态首页)、index.php(动态首页,需配合PHP解析配置)、index.htm。
示例配置:
# 优先加载index.html,其次index.php、index.htm
index index.html index.php index.htm;
说明:访问www.example.com时,Nginx会自动查找网站根目录下的index.html,若不存在则查找index.php,以此类推;若均不存在,会返回403禁止访问错误。
(5)root:指定网站根目录
指定当前虚拟主机的网页文件存储根目录,客户端请求的资源(HTML、CSS、JS等)均从该目录中读取,可设置为绝对路径(推荐)或相对路径。
路径说明:
-
绝对路径:完整的文件路径(如
/usr/share/nginx/html,Linux系统常用); -
相对路径:相对于Nginx安装目录的路径(不推荐,易出错)。
示例配置:
# 绝对路径(推荐,Linux系统)
root /usr/share/nginx/html/www;
# 相对路径(不推荐)
root html/www;
说明:结合index配置,当访问www.example.com时,Nginx会去/usr/share/nginx/html/www目录下,查找index.html文件并返回。
(6)access_log:指定虚拟主机访问日志
指定当前虚拟主机的访问日志存储路径,以及日志的输出格式,用于记录该虚拟主机的所有访问请求(如客户端IP、请求时间、请求路径等),便于日志分析和问题排查。
关键说明:
-
日志输出格式需提前通过http块中的
log_format指令定义(参考3.2节HTTP配置),常用格式为main; -
不同虚拟主机可配置不同的访问日志路径,便于区分各网站的访问记录。
示例配置:
# 日志路径+main格式(main格式在http块中定义)
access_log /var/log/nginx/www.example.com.access.log main;
说明:日志文件会自动创建(若路径不存在,需手动创建并赋予Nginx写入权限),可通过日志文件查看该虚拟主机的所有访问记录。
(5)error_page:定制错误页面
定制各类HTTP错误状态码(如404、500、403等)的返回页面,替代Nginx默认的错误页面,提升用户体验,同时可统一网站风格。
核心注意事项:
-
默认情况下,Nginx会在主目录的html目录(如
/usr/share/nginx/html)中查找错误页面文件; -
错误页面的大小必须超过512KB,否则会被IE浏览器替换为其默认的错误页面,无法显示自定义页面。
常用错误状态码及示例配置:
# 404页面(页面不存在)
error_page 404 /404.html;
# 500、502、503、504页面(服务器内部错误)
error_page 500 502 503 504 /50x.html;
# 可选:指定错误页面的根目录(若错误页面不在默认html目录)
location = /404.html {
root /usr/share/nginx/html/error;
}
说明:配置后,当客户端访问不存在的页面时,会返回自定义的404.html页面;服务器出现内部错误时,会返回50x.html页面,需确保这些页面已创建且大小超过512KB。
四、Nginx的管理与维护
Nginx 提供了非常完善的命令行管理工具,用于配置检查、服务启停、平滑重启、版本查看等。熟练掌握这些运维命令,是线上稳定运行 Nginx 的基础。
1、检查 Nginx 配置文件的正确性
在修改 Nginx 配置后,重启前必须检查配置语法,避免因配置错误导致服务直接挂掉。
Nginx 内置了配置检查功能,只检测语法不启动服务:
/usr/local/nginx/sbin/nginx -t
如果是指定配置文件路径进行检查:
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
参数说明:
-t:只测试配置文件语法是否正确,不实际启动 Nginx-c:手动指定配置文件路径;不指定时 Nginx 会默认读取安装目录下的conf/nginx.conf
配置正确时会输出类似如下提示:

2、显示 Nginx 版本及编译信息
通过以下命令可以快速查看当前安装的 Nginx 版本和编译参数,用于排查模块是否安装、版本是否兼容等问题。
仅查看版本号
/usr/local/nginx/sbin/nginx -v
示例输出:
nginx version: nginx/1.13.9
查看版本 + 完整编译信息(模块、编译参数、路径)
/usr/local/nginx/sbin/nginx -V
会显示:
- Nginx 版本
- 编译器版本
- 配置参数(
--prefix、--with-*模块等) - 安装路径、配置文件路径等
3、Nginx 的启动、关闭与重启
Nginx 采用多进程模型,通过系统信号实现优雅启停、平滑重启,对业务影响极小。
常用信号说明
QUIT:处理完当前请求后优雅关闭进程HUP:重新加载配置,平滑重启,不中断用户访问USR1:日志切换,用于按天切割日志USR2:平滑升级 Nginx 可执行程序WINCH:从容关闭工作进程
(1)启动 Nginx
直接执行二进制文件即可启动:
/usr/local/nginx/sbin/nginx
(2)关闭 Nginx
通过信号关闭 Nginx 主进程:
kill -XXX `cat /usr/local/nginx/logs/nginx.pid`
快速关闭(不等待请求)
kill -TERM `cat /usr/local/nginx/logs/nginx.pid`
优雅关闭(处理完现有请求再退出)
kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`
(3)平滑重启 Nginx(推荐)
修改配置后,使用 HUP 信号可以不中断服务、不丢请求地重新加载配置:
kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
等价于现代 Nginx 常用的:
/usr/local/nginx/sbin/nginx -s reload
这是生产环境修改配置后标准且安全的重启方式。
五、Nginx反向代理应用实例
反向代理是 Nginx 最核心、最常用的生产场景之一,用于统一入口、负载均衡、动静分离、隐藏后端真实服务等。本章从 location 匹配规则讲起,逐步介绍正向 / 反向代理区别、基础反向代理、生产级代理配置以及 proxy_pass 中 URI 拼接规则。
1、Nginx 中 location 应用实例
location 主要用于对请求 URL 进行匹配,支持普通字符串匹配和正则表达式匹配,常用于实现动静分离、路由转发、权限控制等。
(1)静态文件匹配实例
匹配以 .gif、.jpg、.jpeg、.png、.bmp、.swf 结尾的静态资源,交由 Nginx 直接处理:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
root /data/wwwroot/www.ixdba.net;
}
(2)目录匹配实例
匹配 /upload/ 或 /html/ 开头的请求,直接读取本地静态文件:
location ~ ^/(upload|html)/ {
root /data/wwwroot/www.ixdba.net;
}
(3)动态请求转发实例
匹配所有 .jsp 结尾的动态请求,转发给后端 Tomcat(8080 端口)处理:
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}
2、Nginx 中 location 匹配优先级
当一个请求同时满足多个 location 规则时,Nginx 会按照优先级高低选择匹配项。常见匹配规则优先级如下(从上到下优先级递减):
location = / { # 精确匹配 /
[ config A ]
}
location ^~ /images/ { # 前缀匹配,不检查正则
[ config B ]
}
location ~* \.(gif|jpg|png|swf)$ { # 不区分大小写正则匹配
[ config C ]
}
location /abc/def { # 更长前缀匹配
[ config D ]
}
location /abc { # 短前缀匹配
[ config E ]
}
location / { # 通用匹配,所有请求都匹配
[ config F ]
}
简单记忆:精确匹配 > ^~ 前缀匹配 > 正则匹配 > 普通前缀匹配 > / 通用匹配
3、反向代理与正向代理
(1)反向代理(Reverse Proxy)
代理服务器接收外网请求,转发给内部后端服务器,并将结果返回给客户端。对外只暴露 Nginx 地址,后端服务器对客户端不可见,这就是反向代理。

(2)正向代理(Forward Proxy)
客户端无法直接访问外网,必须通过局域网内一台代理服务器去访问外部 Web,需要在浏览器手动配置代理。
适用场景:① 局域网内统一出口代理② 访问受限网络(如教育网、内网访问外网)③ 科学上网类代理

4、最简单的反向代理实例
Nginx 实现反向代理依靠 proxy_pass 模块。
(1)极简反向代理
server {
listen 80;
server_name www.a.com;
location / {
proxy_pass http://172.16.213.18;
}
}
功能:访问 www.a.com 时,所有请求都会转发到后端 172.16.213.18:80。
如需本地访问需要在C:\Windows\System32\drivers\etc\hosts加上本地域名解析
格式:虚拟机IP server_name
server {
listen 80;
server_name www.a.com;
location / {
proxy_pass http://172.16.213.18;
}
}
需注意防火墙是否关闭
systemctl status firewalld
成功就会代理到百度页面
5、典型反向代理实例
生产环境通常需要添加请求头、超时时间、缓冲区等优化配置:
server {
listen 80;
server_name www.b.com;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_pass http://172.16.213.77:5601;
}
}
功能:访问 www.b.com → 转发到 172.16.213.77:5601同时透传真实 IP、设置超时、优化代理缓冲区,适合高并发生产环境。
6、Nginx 反向代理 URI 用法(重点:末尾 / 的区别)
proxy_pass 末尾是否带 /,会直接影响 URL 拼接结果,是最容易踩坑的地方。
(1)proxy_pass 带 /uri/ 且末尾有 /
server {
server_name www.abc.com;
location /uri/ {
proxy_pass http://192.168.99.100:8000/new_uri/;
}
}
访问:
http://www.abc.com/uri/iivey.html
实际转发:
http://192.168.99.100:8000/new_uri/iivey.html
(2)proxy_pass 只有 / 结尾
server {
server_name www.abc.com;
location /uri/ {
proxy_pass http://192.168.99.100:8000/;
}
}
访问:
http://www.abc.com/uri/iivey.html
实际转发:
http://192.168.99.100:8000/iivey.html
(3)proxy_pass 不带 / 结尾
location /uri/ {
proxy_pass http://192.168.99.100:8000;
}
访问:
http://www.abc.com/uri/iivey.html
实际转发:
http://192.168.99.100:8000/uri/iivey.html
总结:
proxy_pass带/结尾:会去掉 location 匹配的路径部分再拼接proxy_pass不带/结尾:会完整拼接原路径
六、Nginx URL 重写功能与内置变量
URL 重写(Rewrite)是 Nginx 最常用的高级功能之一,常用于伪静态、域名跳转、URL 规范化、访问控制等场景。本章主要介绍 Nginx 内置变量、if 判断、rewrite 重写规则、set 变量定义、break 终止规则等核心用法,是 Nginx 高级配置的必备知识点。
1、Nginx 内置变量
Nginx 提供大量内置变量,用于获取客户端、请求、服务器信息,在日志、rewrite、proxy_pass 中大量使用。
常用内置变量说明
$args:请求行中的参数(? 后面的内容)$document_root:当前请求的 root 路径$uri:不带参数的当前 URI$document_uri:与$uri相同$host:请求头中的 Host 字段$limit_rate:限制连接速率$request_method:请求方法(GET/POST)$remote_addr:客户端 IP$remote_port:客户端端口$remote_user:认证用户名$request_filename:当前请求的文件完整路径$request_uri:包含参数的完整原始 URI$query_string:与$args相同$server_addr:服务器 IP$server_name:服务器名称$server_port:服务器端口
示例 1
URL:http://188.19.236.18:8000/abc?test=123&test2=abc
$args:test=123&test2=abc$uri:/abc$server_addr:188.19.236.18$server_port:8000$request_uri:/abc?test=123&test2=abc
示例 2
URL:http://172.16.213.199:88/test1/test2/test.php
假定虚拟主机根目录root:/var/www/html
$host:172.16.213.199$server_port:88$request_uri:/test1/test2/test.php$document_uri:/test1/test2/test.php$document_root:/var/www/html$request_filename:/var/www/html/test1/test2/test.php
2、if 指令(条件判断)
if 用于条件匹配,满足条件则执行大括号内配置。
语法
if (condition) {
...
}
可使用在:server、location
正则匹配
~:区分大小写匹配~*:不区分大小写匹配!~、!~*:不匹配
文件 / 目录判断
-f/!-f:判断文件是否存在-d/!-d:判断目录是否存在-e/!-e:判断文件或目录是否存在-x/!-x:判断文件是否可执行
3、rewrite 指令(URL 重写)
Nginx 通过 ngx_http_rewrite_module 实现 URL 重写,依赖 PCRE 库。
语法
rewrite 正则 目标URL 标记;
标记(flag)说明
last:重写后继续匹配其他 locationbreak:执行后终止,不再继续匹配redirect:返回 302 临时重定向permanent:返回 301 永久重定向
rewrite 实例(新旧网站跳转 / 反向代理重写)
location ~ ^/new/ {
rewrite ^/new/(.*)$ /old/$1 break;
proxy_pass http://www.tb.com;
}
功能:访问 www.newtb.com/new/web.html→ 内部转发到 www.tb.com/old/web.html
浏览器地址栏不变,适合网站改版、新旧系统切换。
4、set 指令(自定义变量)
set 用于定义变量并赋值,常用于获取参数、拼接 URL。
语法
set $变量名 值;
set + if + rewrite 实现伪静态实例
location / {
if ($query_string ~ "id=(.*)") {
set $myid $1;
rewrite ^/app.php$ /m-$myid.html?;
}
}
功能:访问:www.abc.com/app.php?id=100跳转:www.abc.com/m-100.html
关键点:
$query_string获取 URL 参数set将参数存入变量- 末尾
?作用:清除原有参数,避免附加在新 URL 后
5、break 指令(终止规则执行)
break 表示执行完当前规则后立即停止,不再执行后续 rewrite 规则。
语法
break;
break 实例(域名非法访问跳转)
server {
listen 80;
server_name www.tb.cn;
if ($host != 'www.tb.cn') {
rewrite ^/(.*)$ http://www.tb.cn/error.txt break;
rewrite ^/(.*)$ http://www.tb.cn/$1 permanent;
}
}
功能:
- 若访问域名不是
www.tb.cn,直接跳转到error.txt - 由于
break,第二条 rewrite 不会执行 - 若域名正确,则不进入 if,直接正常访问
七、Nginx 中虚拟主机配置实例
虚拟主机是 Nginx 最核心、最常用的功能之一,能够让一台服务器、一个 IP 地址,部署并运行多个独立网站,每个网站对应一个独立域名,互不干扰。
通过虚拟主机,可以极大提高服务器利用率,降低部署成本,是 Web 服务必备技能。
1、虚拟主机说明
- 每个
server{}就是一个虚拟主机,对应一个网站 - 多个虚拟主机可以监听同一个端口(如 80)
- Nginx 通过
server_name(域名)区分不同站点 - 每个站点可以拥有独立的:
- 网站根目录
- 访问日志 / 错误日志
- 首页文件
- 访问规则、重写、代理等配置
2、多虚拟主机配置实例(3 个站点)
下面在 Nginx 中创建 3 个独立虚拟主机,分别对应 3 个不同域名,包含直接配置、独立文件引入两种方式。
以下配置位于 http{} 块内:
http {
# 虚拟主机 1:www.domain1.com
server {
listen 80;
server_name www.domain1.com;
access_log logs/domain1.access.log main;
location / {
index index.html;
root /data/www/domain1.com;
}
}
# 虚拟主机 2:www.domain2.com
server {
listen 80;
server_name www.domain2.com;
access_log logs/domain2.access.log main;
location / {
index index.html;
root /data/www/domain2.com;
}
}
# 虚拟主机 3:通过 include 引入外部配置文件(推荐)
include /usr/local/nginx/conf/vhosts/www.domain3.conf;
}
3、配置说明
(1)虚拟主机 1 和 2
- 直接在 nginx.conf 中编写
server{}配置 - 各自监听 80 端口
- 通过
server_name区分不同域名 - 独立网站根目录:
/data/www/domain1.com、/data/www/domain2.com - 独立访问日志:
domain1.access.log、domain2.access.log
(2)虚拟主机 3(include 引入)
include /usr/local/nginx/conf/vhosts/www.domain3.conf;
- 将第 3 个站点的配置单独写在一个文件中
- 通过
include指令引入主配置 - 优点:便于管理、维护、批量添加站点,生产环境标准用法
外部文件 www.domain3.conf 内容示例:
server {
listen 80;
server_name www.domain3.com;
access_log logs/domain3.access.log main;
location / {
root /data/www/domain3.com;
index index.html;
}
}
八、Nginx 中负载均衡配置实例
Nginx 自带强大的负载均衡功能,可以将用户请求均匀分发到多台后端应用服务器,提高系统并发能力、可用性和容错能力。本章详细介绍 Nginx 支持的负载均衡调度算法、节点状态配置,并给出完整可直接使用的负载均衡实例。
1、Nginx 负载均衡调度算法
Nginx 内置 4 种负载均衡调度策略,其中后两种为第三方模块提供:
(1)轮询(默认)
请求按时间顺序逐一分配到不同后端服务器。如果某台服务器宕机,会自动剔除,不影响用户访问。
(2)weight(权重轮询)
为每个后端节点设置权重值 weight,值越大被分配到的概率越高。适用于后端服务器性能不均的场景,性能好的节点可以设置更高权重。
(3)ip_hash
根据客户端 IP 的 hash 结果分配后端节点。来自同一个 IP 的用户会固定访问一台后端服务器,有效解决 Session 共享问题。
(4)fair(第三方)
根据后端服务器的响应时间分配请求,响应越快优先分配。Nginx 默认不支持,需额外安装 upstream_fair 模块。
(5)url_hash(第三方)
根据访问 URL 的 hash 结果分配请求,同一个 URL 固定指向同一台后端。适合缓存类场景,提升缓存效率。Nginx 默认不支持,需安装第三方 hash 模块。
2、后端节点状态参数
在 upstream 中可以通过 server 指令设置节点状态:
down:当前服务器暂时不参与负载均衡backup:备用节点,仅当其他非 backup 节点全部故障时才启用max_fails:允许失败的最大次数,默认 1fail_timeout:达到 max_fails 后,节点被暂停的时间
注意:使用 ip_hash 调度算法时,后端节点不能配置 weight 和 backup。
3、Nginx 负载均衡完整配置实例
- 负载均衡服务器:
192.168.12.189 - 后端 3 台 Web 服务器:
192.168.12.181:80192.168.12.182:80192.168.12.183:80
- 使用权重轮询实现负载均衡
配置如下(只展示 http 和 server 核心部分):
http {
# 定义后端服务器集群
upstream myserver {
server 192.168.12.181:80 weight=3 max_fails=3 fail_timeout=20s;
server 192.168.12.182:80 weight=1 max_fails=3 fail_timeout=20s;
server 192.168.12.183:80 weight=4 max_fails=3 fail_timeout=20s;
}
# 对外提供服务的虚拟主机
server {
listen 80;
server_name www.domain.com 192.168.12.189;
index index.htm index.html;
root /data/web/wwwroot;
location / {
# 转发请求到 upstream 集群
proxy_pass http://myserver;
# 出现指定错误时自动切换下一台后端
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
# 引入代理相关配置
include /usr/local/nginx/conf/proxy.conf;
}
}
}
4、配置说明
-
upstream myserver定义一个名为myserver的后端服务器池,所有请求通过proxy_pass转发到此。 -
weight权重三台节点权重分别为 3、1、4,权重越高分配请求越多。 -
max_fails=3+fail_timeout=20s一台节点失败 3 次后,Nginx 会在 20 秒内不再向其转发请求,提高可用性。 -
proxy_next_upstream当出现 500/502/503、超时、错误等情况时,自动将请求转发给下一台正常节点。 -
include proxy.conf引入通用代理配置(如请求头、超时、缓冲区等),便于统一维护。
九、Nginx +Tomcat架构与应用案例
1、Nginx +Tomcat整合的必要性
Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tmcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。 Nginx可以通过两种方式来实现与Tomcat的耦合。
将静态页面请求交给Nginx,动态请求交给后端Tomcat处理。 将所有请求都交给后端的Tomcat服务器处理,同时利用Nginx自身的负载均衡功能,进行多台Tomcat服务器的负载均衡。

2、Nginx +Tomcat的常见架构
Tomcat在高并发环境下处理动态请求时性能很低,而在处理静态页面更加脆弱。虽然Tmcat的最新版本支持epoll,但是通过Nginx来处理静态页面要比通过Tomcat处理在性能方面好很多。 Nginx可以通过两种方式来实现与Tomcat的耦合。
将静态页面请求交给Nginx,动态请求交给后端Tomcat处理。 将所有请求都交给后端的Tomcat服务器处理,同时利用Nginx自身的负载均衡功能,进行多台Tomcat服务器的负载均衡。

3、环境准备:JDK 与 Tomcat 安装部署
在配置 Nginx + Tomcat 架构前,需先确保后端 Tomcat 服务正常运行。以下以 JDK1.8 和 Tomcat8.5.30 为例进行安装。
(1)安装 JDK(Java 运行环境)
将 JDK 压缩包上传至服务器 /data 目录,执行解压与环境变量配置:
# 1. 创建安装目录
mkdir /usr/java
# 2. 解压 JDK 到安装目录
tar -xvf jdk-8u201-linux-x64.tar.gz -C /usr/java
# 3. 配置环境变量(修改 /etc/profile)
vi /etc/profile
# 添加以下内容到文件末尾
export JAVA_HOME=/usr/java/jdk1.8.0_201
export PATH=$JAVA_HOME/bin:$PATH
# 4. 生效环境变量并验证
source /etc/profile
java -version
验证成功输出:
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
(2)安装 Tomcat(二进制解压版)
将 Tomcat 压缩包上传至服务器 /data 目录,解压即可完成部署:
# 1. 解压 Tomcat 到 /usr/local 目录
tar -xvf apache-tomcat-8.5.30.tar.gz -C /usr/local
# 2. 重命名目录(方便管理)
mv /usr/local/apache-tomcat-8.5.30 /usr/local/tomcat
# 3. 启动 Tomcat
cd /usr/local/tomcat/bin/
./startup.sh
(3)验证 Tomcat 安装
浏览器访问 http://服务器IP:8080,若看到 Apache Tomcat 官方欢迎页面,说明部署成功。
4、Nginx + Tomcat 动静分离配置实例
核心原理:Nginx 直接处理静态资源(图片、Html、JS、CSS),动态请求(JSP、Do)转发给 Tomcat 处理。配置目标:
- 匹配
/img/、静态文件后缀 → Nginx 本地读取 - 匹配
.jsp、.do→ 转发给 Tomcat (192.168.12.130:8080)
完整配置代码(nginx.conf 中 server 块):
server {
listen 80;
server_name www.ixdba.net;
root /web/www/html; # 静态资源根目录
# location 1: 处理静态图片资源
location /img/ {
alias /web/www/html/img/;
}
# location 2: 处理动态 JSP/Do 请求
location ~ (\.jsp)|(\.do)$ {
proxy_pass http://192.168.12.130:8080;
proxy_redirect off;
# 透传真实 IP 给后端 Tomcat
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 性能优化配置
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
重点知识点:Root 与 Alias 区别
这是最容易混淆的点,必须区分使用:
| 指令 | 配置示例 | 访问 /i/logo.gif 实际查找路径 |
说明 |
|---|---|---|---|
| alias | location /i/ { alias /dir/; } |
/dir/logo.gif |
替换路径。location 路径被丢弃,只追加后续文件名 |
| root | location /i/ { root /dir/; } |
/dir/i/logo.gif |
拼接路径。location 路径保留,追加到根目录后 |
实战建议:
- 在
location /全局根目录配置使用 root。 - 在特定子目录匹配(如
/img/)中,使用 alias 精准定位目录。
5、Nginx + Tomcat 多 Tomcat 负载均衡配置实例
核心原理:Nginx 作为负载均衡器,将请求分发到多台 Tomcat 节点,实现高可用和高并发。集群架构:
- 节点 1:
192.168.12.131:8000 - 节点 2:
192.168.12.132:8080 - 节点 3:
192.168.12.133:8090 - 调度算法:
ip_hash(固定访问同一台后端,解决 Session 共享)
完整配置代码(nginx.conf 核心部分):
http {
# 1. 定义后端 Tomcat 集群池
upstream mytomcats {
# 指定后端节点及端口
server 192.168.12.131:8000;
server 192.168.12.132:8080;
server 192.168.12.133:8090;
# 调度算法:根据客户端 IP 哈希,确保同 IP 固定访问同一台
ip_hash;
}
# 2. 虚拟主机配置
server {
listen 80;
server_name www.ixdba.net;
# 静态资源匹配(交由 Nginx 直接处理)
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root /web/www/html/;
}
# 3. 所有非静态请求转发到 Tomcat 集群
location / {
proxy_pass http://mytomcats; # 转发到 upstream 定义的集群
include /usr/local/nginx/conf/proxy.conf; # 引入通用代理配置
}
}
}
4、扩展:通用负载均衡架构(多 IP 集群)
如果你有三台 Tomcat 部署在同一 IP 段(如 172.16.213 网段),配置方式如下:
http {
# 定义后端服务器组
upstream myserver {
server 172.16.213.233:8080 max_fails=3 fail_timeout=20s;
server 172.16.213.236:8080 max_fails=3 fail_timeout=20s;
server 172.16.213.237:8080 max_fails=3 fail_timeout=20s;
}
server {
listen 80;
server_name www.web.com; # 域名或 IP
access_log logs/web.access.log main;
# 静态资源处理
location ~* \.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
root /web/www/html/;
}
# 动态请求转发
location / {
proxy_pass http://myserver;
include /usr/local/nginx/conf/proxy.conf;
}
}
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)