一、Nginx简介
1、引入背景
(1)初始阶段 公司项目刚上线时,并发量小、用户少 ,低并发场景下,一个 jar 包启动应用,依托内部 Tomcat 就能返回内容给用户,流程为:用户→客户端→服务器(Tomcat 处理) 。
(2)发展瓶颈 随着平台用户增多,并发量增大,单台服务器无法承载高并发,需横向扩展服务器。
于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。
我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以使用了Nginx。
2.Nginx 是什么
Nginx(engine x)是高性能 HTTP 和反向代理 Web 服务器 ,也提供 IMAP/POP3/SMTP 服务。由伊戈尔・赛索耶夫为俄罗斯 Rambler.ru 站点开发,2004 年 10 月 4 日发布首个公开版本 0.1.0,2011 年 6 月 1 日发布 1.0.4 版本 。 特点优势:
资源占用与并发:内存占用少,并发能力强,官方测试可支持高达 50,000 个并发连接响应,在同类网页服务器中表现优异,国内百度、京东等知名站点均有使用,全球约 12.18% 活跃网站采用 。部署与运维:安装简单,配置文件简洁(支持 Perl 语法 ),Bug 少;启动容易,可 7*24 不间断运行,数月无需重启,还能在服务不间断时升级软件版本 。开发语言:代码完全用 C 语言编写,保证高效与稳定 。
二、正向代理和反向代理
1.正向代理(代理客户端)
定义:
正向代理是一种位于客户端(用户)和目标服务器之间的代理服务器。客户端向正向代理发送请求,正向代理根据客户端的需求,代替客户端向目标服务器获取数据,然后再将数据返回给客户端。在这个过程中,目标服务器只知道请求来自正向代理,不知道实际的客户端是谁。
作用:
突破访问限制:例如,当客户端所在网络对某些外部网站存在访问限制时,通过配置正向代理服务器,客户端可以绕过这些限制,访问原本无法访问的资源。提高访问速度:正向代理服务器可以缓存目标服务器的响应内容,当其他客户端请求相同的资源时,代理服务器可以直接将缓存的数据返回,减少重复请求,提高访问效率。隐藏客户端真实 IP:对于目标服务器而言,只看到正向代理服务器的 IP 地址,从而保护了客户端的真实 IP 地址,一定程度上增强了客户端的隐私性和安全性。
2.反向代理(代理服务端)
定义:
反向代理是位于服务器端的代理服务器,客户端向反向代理发送请求,反向代理根据一定的规则(如负载均衡算法、URL 匹配等)将请求转发到内部的真实服务器上,然后将真实服务器的响应返回给客户端。在这个过程中,客户端并不知道自己访问的是哪一台真实服务器,只认为是反向代理提供的服务。
作用:
负载均衡:当有多个后端服务器时,反向代理可以根据不同的负载均衡算法(如轮询、加权轮询、IP 哈希等),将客户端请求均匀地分配到各个后端服务器上,避免单个服务器负载过重,提高整个系统的可用性和性能。保障服务器安全:隐藏了后端真实服务器的 IP 地址和端口等信息,将反向代理服务器暴露在公网,减少了后端服务器直接面对网络攻击的风险。同时,还可以通过反向代理设置一些安全策略,如过滤恶意请求、防止 SQL 注入等。缓存加速:与正向代理类似,反向代理也可以对后端服务器的响应进行缓存。当下次有相同的请求时,直接从缓存中获取数据返回给客户端,减少后端服务器的压力,提高响应速度。
Nginx 作为 Web 服务器,最常用的功能之一就是反向代理,在实际应用中可以根据业务需求灵活配置,实现高效的服务转发和管理 。
三、Nginx 负载均衡策略及动静分离
1.负载均衡概述
Nginx 负载均衡策略分内置策略(轮询、加权轮询、ip hash )与扩展策略(灵活自定义,满足多样需求 ),用于合理分配客户端请求到后端服务器,提升系统性能与可用性。
2.内置负载均衡策略
(1)轮询
原理:按顺序依次将客户端请求分配给后端服务器,循环往复。如 3 台服务器,请求会按 1→服务器 1、2→服务器 2、3→服务器 3、4→服务器 1 …… 规律分配 。特点:简单公平,适用于服务器性能相近场景;但未考虑服务器实际负载能力差异 。
(2)加权轮询
原理:为后端服务器设置不同权重,权重高的服务器分配到更多请求。例如 3 台服务器权重分别为 1、2、3 ,总权重 6 ,请求分配比例约为 1/6、2/6、3/6 ,权重高的服务器处理请求更频繁 。特点:能依据服务器性能差异(如配置、性能强弱 )分配请求,让性能好的服务器承担更多压力,优化资源利用 。
(3)ip hash
原理:对客户端 IP 做 hash 运算,依据运算结果,将同一客户端 IP 的请求始终分配到同一台服务器 。作用:解决多服务器间 session 不共享问题,保障客户端会话连续性(如用户登录状态 );不过,服务器扩容或故障切换时,可能影响已分配客户端的请求路由 。
3.动静分离
定义:开发中,把无需后台处理的静态文件(如 css、html、jpg、js 等 )与需后台处理的动态内容区分开。Nginx 可直接响应静态文件请求,动态请求转发给后端 Web 服务处理 。
优势:静态资源可做缓存,降低后端服务器压力,提升资源响应速度,优化用户访问体验,让动态服务专注处理业务逻辑 。
四、Nginx 在 Windows 下的安装
1.下载 Nginx
访问 Nginx 官方下载地址:nginx: downloadhttp://nginx.org/en/download.html ,选择稳定版本(以 nginx/Windows - 1.28.0 为例 ),下载 nginx - 1.28.0.zip 文件 。
下载完成后,对 zip 压缩包进行解压操作(注意是英文目录),在windows下解压完成后即可使用了,解压后会得到如下目录结构:
conf:存放 Nginx 配置文件,核心配置(如负载均衡、反向代理规则等 )在此设置 。contrib:包含一些贡献的脚本、示例等辅助性内容 。docs:Nginx 相关文档,可查阅使用说明、模块介绍等资料 。html:存放静态网页文件(如默认的 index.html 等 ),可用于测试访问 。logs:记录 Nginx 运行日志(访问日志、错误日志等 ),便于排查问题 。temp:临时文件存放目录 。nginx.exe:Nginx 主程序,双击或通过命令行启动 Nginx 服务 。
我们可以打开conf文件夹下的nginx.conf,
上述配置表示 Nginx 监听在 80 端口,当客户端访问本地 80 端口时,Nginx 会根据server块内的配置进行处理,比如将请求导向html目录下的index.html或者index.htm文件。
2.启动Nginx
不建议直接双击 .exe 启动,因为双击 nginx.exe 时,Nginx 会作为控制台程序快速启动,启动完成后命令窗口会直接关闭(“一闪而过”)。这种方式无法直观确认启动是否成功,若配置有误、端口冲突等,报错信息会直接消失,难排查问题,此外后续管理(重启、停止)也缺乏便捷入口
所以这里我们通过命令行来启动Ngin
1). 进入 Nginx 安装目录
2).在路径处输入cmd后回车
3).执行启动命令
nginx.exe
没有报错则进入3.判断是否启动成功
4).启动失败解决方案(启动成功可以跳过)
错误提示 bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) ,意思是 Nginx 尝试绑定 80 端口时失败,因为权限不足,80 端口被其他程序占用或者当前运行 Nginx 的权限不够。
解决步骤:
检查端口占用:在命令行执行 netstat -ano | findstr ":80" ,查看哪个进程(PID)占用了 80 端口,然后关闭对应的程序(比如 IIS、其他 Web 服务器等 )。以管理员权限运行命令行:右键点击 “命令提示符”,选择 “以管理员身份运行”,重新执行启动 Nginx 的命令(nginx.exe ),确保有足够权限绑定端口。修改 Nginx 监听端口:如果不想关闭占用 80 端口的程序,可编辑 Nginx 安装目录下 conf/nginx.conf 文件,找到 listen 80; 这一行,修改为其他未被占用的端口(如 listen 8080; ),保存后重新启动 Nginx 。
3.判断是否启动成功
启动后无报错提示,可通过浏览器访问http://localhost:80 或 http://localhost 或 http://127.0.0.1,看到 Nginx 欢迎页(“Welcome to nginx!”)则启动成功。
五、Nginx 在 Linux 下的安装
编译安装 Nginx 时,需先准备编译环境和基础依赖库,确保源码编译、功能正常运行,以下是 CentOS/RHEL 系统(基于 YUM 包管理器 )的依赖安装步骤:
1.依赖安装步骤
1)安装 GCC 编译器 Nginx 源码编译依赖 GCC 环境,用于编译 C/C++ 代码。
命令:
yum install gcc-c++
作用:提供编译 Nginx 源码的基础编译工具链。
2)安装 PCRE 与 pcre-devel PCRE(Perl Compatible Regular Expressions )是 Perl 兼容正则表达式库,Nginx 的 HTTP 模块用它解析正则表达式。
pcre:基础正则表达式库。pcre-devel:开发库(含头文件、编译时依赖 ),支持基于 PCRE 二次开发(Nginx 编译需 )。
命令:
yum install -y pcre pcre-devel
作用:让 Nginx 能处理 URL 匹配、Rewrite 规则等正则表达式相关逻辑。
3)安装 zlib 与 zlib-devel zlib 是压缩 / 解压缩库,Nginx 用它对 HTTP 响应内容做 gzip 压缩,减少传输体积。
zlib:基础压缩库。 zlib-devel:开发库(含头文件 ),编译 Nginx 时需调用其接口。 命令:
yum install -y zlib zlib-devel
作用:实现 Nginx 的 gzip 压缩功能,优化网络传输效率。
4)安装 OpenSSL 与 openssl-devel OpenSSL 是安全套接字层密码库,支持 TLS/SSL 协议(如 HTTPS ),Nginx 启用 https 时依赖它。
openssl:基础加密库。openssl-devel:开发库(含头文件、编译依赖 ),Nginx 编译 --with-http_ssl_module 模块时需用。
命令:
yum install -y openssl openssl-devel
2.下载 Nginx 安装包
去官网nginx: downloadhttps://nginx.org/en/download.html
下载稳定版本nginx-11.28.0 点击即可下载
解压安装包
使用 tar 命令解压下载好的 Nginx 安装包:
tar -zxvf nginx-1.28.0.tar.gz
解压后会得到一个名为nginx-1.28.0的目录,进入该目录:
cd nginx-1.28.0
3.配置编译选项
在编译安装前,需要配置 Nginx 的编译选项,以满足不同的功能需求。执行以下命令:
./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module
--prefix=/usr/local/nginx:指定 Nginx 的安装目录为/usr/local/nginx,可以根据实际需求进行修改。 --with-http_stub_status_module:启用 Nginx 的 HTTP 状态模块,用于获取 Nginx 的简单状态信息,如连接数、请求数等。 --with-http_ssl_module:启用 Nginx 的 HTTPS 功能,若要支持 HTTPS 访问,该选项必不可少。
4.编译与安装
配置好编译选项后,依次执行以下命令进行编译和安装:
1)编译:
make
该命令会根据配置选项编译 Nginx 的源代码。
2)安装:
sudo make install
安装完成后,Nginx 会被安装到之前指定的目录(如/usr/local/nginx )。
5.启动与验证
启动 Nginx:进入 Nginx 的 sbin 目录,执行启动命令:
cd /usr/local/nginx/sbin
./nginx
也可以将 Nginx 添加到系统服务中,以 CentOS 7 为例,创建一个 systemd 服务单元文件:
sudo 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/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
保存并退出后,执行以下命令启动、设置开机自启 Nginx:
sudo systemctl start nginx
sudo systemctl enable nginx
6.判断是否启动成功
在浏览器中输入服务器的 IP 地址(例如http://服务器IP ),如果能看到 Nginx 的欢迎页面(显示 “Welcome to nginx!” ),则说明 Nginx 安装并启动成功。
六、Nginx常用命令
1.Linux 系统下的命令
1)进入 Nginx 的 sbin 目录
cd /usr/local/nginx/sbin/
2)启动 Nginx
./nginx
在当前目录(/usr/local/nginx/sbin/)下执行nginx可执行文件,启动 Nginx 服务。./表示当前目录。
3)停止 Nginx
./nginx -s stop
-s 选项用于向 Nginx 发送信号,stop 表示强制快速停止 Nginx 服务,可能会中断正在处理的请求。
4)安全退出 Nginx
./nginx -s quit
同样使用-s 选项发送信号,quit 表示优雅关闭,Nginx 会等待处理完当前所有请求后再停止服务。
5)重新加载配置文件
./nginx -s reload
向 Nginx 发送reload 信号,让 Nginx 在不停止服务的情况下重新加载修改后的配置文件,使新配置生效。
6)查看 Nginx 进程
ps aux|grep nginx
ps aux 用于列出系统中所有进程的详细信息,| 是管道符,将ps aux 的输出作为grep nginx 的输入,grep nginx 则在进程列表中筛选出包含 “nginx” 字样的进程,即 Nginx 相关进程。
2.Windows 系统下的命令
假设 Nginx 安装在C:\nginx目录下,以下命令在命令提示符(CMD)或 PowerShell 中执行:
1)进入 Nginx 的 sbin 目录
cd C:\nginx
2)启动 Nginx
start nginx
start 命令用于启动一个新的进程,这里启动 Nginx 服务。
3)停止 Nginx
taskkill /F /IM nginx.exe
taskkill 命令用于终止进程,/F 表示强制终止,/IM 用于指定要终止的进程名称,这里强制终止所有nginx.exe进程。
4)安全退出 Nginx
Windows 下没有完全等效于 Linux 中-s quit的直接命令。可以先通过任务管理器,找到 Nginx 相关进程(nginx.exe ),右键选择 “结束任务”,相对温和地关闭 Nginx ;或者编写一个脚本,通过 Nginx 提供的信号机制来实现相对优雅的关闭(但这需要一定的编程和对 Nginx 信号机制的了解)。
5)重新加载配置文件
nginx -s reload
前提是已经将 Nginx 安装目录添加到系统环境变量中,或者在命令执行时切换到 Nginx 安装目录。
6)查看 Nginx 进程
tasklist | findstr nginx.exe
tasklist 用于列出当前正在运行的所有进程,| 是管道符,将tasklist 的输出作为findstr nginx.exe 的输入,findstr nginx.exe 则在进程列表中筛选出包含 “nginx.exe” 字样的进程,即 Nginx 相关进程。
七、实战
多个项目之间怎么用Nginx来进行配置化管理??
无论是在 Windows 还是 Linux 系统下,Nginx 的配置文件在定义反向代理和负载均衡的语法规则上是一致的。但在文件路径、操作命令等方面存在一些差异。下面以 Windows 系统为例
1) 反向代理
定位配置文件: Nginx 安装完成后,其配置文件默认位于安装目录下的conf文件夹中,主配置文件名为nginx.conf ,例如C:\nginx-1.24.0\conf\nginx.conf 。 配置示例: 假设我们有两个 Web 项目,项目 A 运行在本地的8080端口,项目 B 运行在本地的8081端口,现在要通过 Nginx 实现反向代理,让用户通过访问http://projecta.com 访问项目 A,通过访问http://projectb.com 访问项目 B 。 打开nginx.conf文件,在http块内添加如下配置:
http {
# 其他默认配置...
server {
listen 80; # 监听80端口,可根据需要修改
server_name projecta.com; # 设置域名,需在本地hosts文件中配置域名指向127.0.0.1
location / {
proxy_pass http://127.0.0.1:8080; # 转发到项目A所在端口
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_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
server_name projectb.com; # 设置域名,需在本地hosts文件中配置域名指向127.0.0.1
location / {
proxy_pass http://127.0.0.1:8081; # 转发到项目B所在端口
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_set_header X-Forwarded-Proto $scheme;
}
}
# 其他http块内配置...
}
配置解释:
listen:指定 Nginx 监听的端口。server_name:设置虚拟主机的域名,需要在本地的C:\Windows\System32\drivers\etc\hosts文件中添加域名解析,例如127.0.0.1 projecta.com 、127.0.0.1 projectb.com 。location /:定义对根路径(/)的处理规则,proxy_pass将请求转发到后端实际项目所在的地址和端口,后面几个proxy_set_header用于设置请求头,以便后端服务器获取客户端的真实 IP 等信息。
配置生效: 保存nginx.conf文件后,打开命令提示符(以管理员身份运行 ),进入 Nginx 安装目录下的nginx.exe所在目录(例如C:\nginx-1.24.0 ),执行以下命令重新加载配置:
nginx -s reload
2)负载均衡
定位配置文件:依然是nginx.conf文件,位于 Nginx 安装目录下的conf文件夹中。 配置示例: 假设项目 A 有两个实例,分别运行在本地的8080端口和8081端口,要对这两个实例进行负载均衡。在http块内添加如下配置:
http {
upstream projecta_servers {
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
# 可以根据服务器性能调整weight值,weight越大,分配的请求越多
}
server {
listen 80;
server_name projecta.com; # 需在本地hosts文件中配置域名指向127.0.0.1
location / {
proxy_pass http://projecta_servers; # 转发到定义的upstream组
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_set_header X-Forwarded-Proto $scheme;
}
}
# 其他http块内配置...
}
配置解释:
upstream指令定义了一个服务器组,里面的server指定了要进行负载均衡的服务器地址和端口,weight用于设置权重,决定了每个服务器分配请求的比例。server块中的proxy_pass将请求转发到upstream定义的服务器组,Nginx 会根据内置的负载均衡策略(默认是轮询 )将请求分发到组内的服务器上。
配置生效: 保存nginx.conf文件后,以管理员身份打开命令提示符,进入 Nginx 安装目录,执行nginx -s reload命令,使新的负载均衡配置生效。
注:笔记内容来源【【狂神说】Nginx最新教程通俗易懂,40分钟搞定!】 https://www.bilibili.com/video/BV1F5411J7vK/?p=7&share_source=copy_web&vd_source=700190762c74773d36f39533f8706638
每天进步一点点,加油!!!