前言
Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3 代理服务器。它以其高并发处理能力、稳定性、丰富的功能模块和低内存消耗而闻名。
一. Nginx简介
● Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
● 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好
● Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。
● Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
二. Nginx作用
2.1 代理
- 正向代理:代理是代理客户端的
客户端 <一> 代理 一>服务端
在这里插入图片描述
正向代理是一个位于客户端和原始服务器之间的服务器,所有客户端的请求都首先发送到正向代理服务器,然后由代理服务器将请求转发到原始服务器。正向代理的目的是为了隐藏客户端的信息。
Nginx不是默认的正向代理服务器,但可以通过配置来实现正向代理的功能。
通常某些服务因为安全问题,限制固定访问,因此可以通过正向代理解决
访问某些国外的服务访问慢,可以通过正向代理中继缓解丢包和延迟高的问题
例如:VPN
http { resolver 8.8.8.8; server { listen 8088; location / { proxy_pass http://$http_host$request_uri; } } } AI写代码
反向代理:
反向代理,客户端对代理是无感知的,客户端不需要任何配置就可以访问,客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
Nginx是默认的反向代理服务器。以下是一个简单的Nginx配置示例,用于设置Nginx作为反向代理服务器:
在这里插入图片描述
比如:百度的服务器是在不同的服务器上,我们只需要搜索baidu.com就行
2.2 负载均衡
如果请求数过大,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器的情况改为请求分发到多个服务器上,就是负载均衡。
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。
轮询:
在这里插入图片描述
加权轮询
在这里插入图片描述
iphash
对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
在这里插入图片描述
2.3 动静分离
在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
在这里插入图片描述
三. 安装
下载地址:https://nginx.org/en/download.html
下载
在这里插入图片描述
解压至任意非中文路径下:
在这里插入图片描述
运行
直接双击nginx.exe 即可(一闪而过),或者进入cmd 输入nginx.exe
在这里插入图片描述
检测
浏览器输入:http://localhost:80 浏览器默认端口就是80 所以80端口可以不写
在这里插入图片描述
配置监听
nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可
server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } ...
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload 即可让改动生效
关闭nginx
如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx
(1) 输入nginx命令 nginx -s stop(快速停止nginx) 或 nginx -s quit(完整有序的停止nginx)
(2) 使用taskkill taskkill /f /t /im nginx.exe
taskkill是用来终止进程的,
/f是强制终止 .
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称 .
3.2 Linux
1.安装gcc(已经安装的可以忽略这个步骤)安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装
yum install gcc-c++
2.PCRE pcre-devel安装(已经安装的可以忽略这个步骤)PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。nginx也需要此库。命令:
yum install -y pcre pcre-devel AI写代码
3.zlib安装(已经安装的可以忽略这个步骤)zlib 库提供了很多种压缩和解压缩的方式, nginx 使用 zlib 对 http 包的内容进行 gzip ,所以需要在 Centos 上安装 zlib 库。
yum install -y zlib zlib-devel AI写代码
4.openssl安装(已经安装的可以忽略这个步骤)OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持 http 协议,还支持 https(即在ssl协议上传输http),所以需要在 Centos 安装 OpenSSL 库
yum install -y openssl openssl-devel AI写代码
5.下载linux的nginx安装包
在这里插入图片描述
6.上传到linux上
7.解压缩
tar -zxvf nginx-1.26.0.tar.gz cd nginx-1.26.0/ AI写代码
8.顺序执行下面三个命令
./configure make make install AI写代码
9.查看安装路径 whereis nginx
在这里插入图片描述
10.nginx常用命令
# cd /usr/local/nginx/sbin/ # ./nginx //启动 # ./nginx -s stop //停止 # ./nginx -s quit //安全退出 # ./nginx -s reload //重新加载配置文件 # ps aux|grep nginx //查看nginx进程 AI写代码
确认开放了80端口
# 开发端口命令 firewall-cmd --zone=public --add-port=8080/tcp --permanent # 重新加载 firewall-cmd --reload # 查看已开放的端口 firewall-cmd --zone=public --list-ports
启动成功访问 http://ip:80
在这里插入图片描述
3.3 Docker
1.拉取镜像
docker pull nginx
2.查看镜像
[root@iZf8z89pv77t13an9qqmcrZ ~]# systemctl start docker [root@iZf8z89pv77t13an9qqmcrZ ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 1panel/maxkb latest c023f10d7cab 2 weeks ago 2.66GB nginx latest 605c77e624dd 2 years ago 141MB redis latest 7614ae9453d1 2 years ago 113MB mysql latest 3218b38490ce 2 years ago 516MB nacos/nacos-server latest bdf60dc2ada3 2 years ago 1.05GB AI写代码
3.运行镜像
[root@iZwz96byk26u1sns4xp7giZ ~]# docker run --name mn -d -p 80:80 nginx 49c02ef7c18facc452762fa7e722720235290df28fce39b6aebb8b024ae21d70
4.检测
在这里插入图片描述
挂载
简单启动nginx
docker run --name mn -d -p 80:80 nginx AI写代码
创建配置文件夹
mkdir -p /opt/nginx AI写代码
复制文件
docker cp mn:/usr/share/nginx/html /opt/mount/nginx/ docker cp mn:/etc/nginx/nginx.conf /opt/mount//nginx/ docker cp mn:/etc/nginx/conf.d /opt/mount/nginx/ AI写代码
删除原有的Nginx容器
docker rm -f mn AI写代码
创建容器
docker run --name nginx -d -p 80:80 -p 81:81 -v /opt/mount/nginx/html:/usr/share/nginx/html -v /opt/mount/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -v /opt/mount/nginx/conf.d:/etc/nginx/conf.d nginx:1.26.0 AI写代码
修改配置
在这里插入图片描述
把端口改为81
在这里插入图片描述
四. 实战
1.将某个现有的项目打包
在这里插入图片描述
2.运行jar项目
打开window命令窗口,启动服务java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar在这里插入图片描述
3.在打开另外一个窗口,启动一个8081的服务
java -jar SpringBoot-Redis-1.0-SNAPSHOT.jar --server.port=8081在这里插入图片描述
4.启动nginx服务. ginx.exe在这里插入图片描述
5.修改nginx配置
upstream zyy { server 127.0.0.1:8080 weight=1; server 127.0.0.1:8081 weight=1; } server { listen 80; server_name localhost; location / { root html; index index.html index.htm; proxy_pass http://zyy; } ##.... }

五. 配置详解
https://blog.csdn.net/weixin_43239880/article/details/130841067
5.1原本配置到解释
我们把其中的注释都删掉,除掉了注释之后的nginx代码,现在只有22行了
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
注解版本
#nginx进程数,建议设置为等于CPU总核心数。 worker_processes 1; # 事件区块开始 events { #单个进程最大连接数(最大连接数=连接数*进程数) #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。 worker_connections 1024; } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { #include:导入外部文件mime.types,将所有types提取为文件,然后导入到nginx配置文件中 include mime.types; #默认文件类型 default_type application/octet-stream; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。 #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。 sendfile on; #长连接超时时间,单位是秒 keepalive_timeout 65; # 第一个Server区块开始,表示一个独立的虚拟主机站点 server { # 提供服务的端口,默认80 listen 80; # 提供服务的域名主机名 server_name localhost; #对 "/" 启用反向代理,第一个location区块开始 location / { root html; #服务默认启动目录 index index.html index.htm; # 默认的首页文件,多个用空格分开 } # 错误页面路由 error_page 500 502 503 504 /50x.html; # 出现对应的http状态码时,使用50x.html回应客户 location = /50x.html { # location区块开始,访问50x.html root html; # 指定对应的站点目录为html } } }
5.2 整体基本理解
虽然上面有了注解,但是看起来还是很迷糊。接着解释:我们可以把nginx.conf分为三个部分进行理解:
第一部分:全局块
第二部分:events块
第三部分:http块
在这里插入图片描述
六. Nginx与网关的区别
本质上API网关也是做了请求的转发,那既然Nginx也可以做请求转发,那这两者有什么区别?
在这里插入图片描述
在具体架构设计时Nginx做负载均衡时,考虑到API网关在系统中不止一个(以集群的方式做高可用),通常可以将Nginx至于API网关前,负责对API网关的负载均衡,然后再由网关决定进入根据判定到哪个真实的web 服务器。让两者的分工更加明确,也就是:API网关聚合服务,Nginx请求转发
业务网关(gateway):对于具体的后端业务应用或者是服务和业务有一定关联性的策略网关。业务网关针对具体的业务需要提供特定的流控策略、缓存策略、鉴权认证策略
流量网关(Nginx):与业务网关相反,定义全局性的、跟具体的后端业务应用和服务完全无关的策略网关。流量网关通常只专注于全局的Api管理策略,比如全局流量监控、日志记录、全局限流、黑白名单控制、接入请求到业务系统的负载均衡等
业务网关一般部署在流量网关之后、业务系统之前,比流量网关更靠近业务系统。通常API网指的是业务网关。有时候我们也会模糊流量网关和业务网关,让一个网关承担所有的工作,所以这两者之间并没有严格的界线。
在这里插入图片描述
nginx与gateway的区别:
编写语言:
○ Nginx是用C语言编写的,这使得它在处理高并发连接时表现出色,但它的配置和扩展相对有限。
○ Gateway(如Spring Cloud Gateway)通常使用Java编写,提供了更丰富的服务治理和路由转发功能,使得在微服务架构中更容易实现扩展功能。
功能特性:
○ Nginx更侧重于反向代理和负载均衡功能,如HTTP代理、TCP代理、HTTP缓存、SSL加密等。
○ Gateway(如Spring Cloud Gateway)提供了丰富的服务治理和路由转发功能,如服务注册和发现、熔断降级、限流等。
部署方式:
○ Nginx通常部署在传统的Web服务器架构中,可以作为流量入口,处理大量的并发连接。
○ Gateway(如Spring Cloud Gateway)通常部署在微服务架构中,与Spring Cloud的其他组件(如Eureka、Zuul等)进行无缝集成,提供统一的API路由管理。
扩展性:
○ 对于Nginx的扩展,通常需要结合Lua等脚本语言,这可能需要额外的学习成本。
○ Gateway(如Spring Cloud Gateway)由于使用Java编写,可以更容易地集成到微服务的扩展功能中,利用Java生态系统的丰富资源。
总结来说,Nginx和Gateway在微服务架构中都发挥着重要的作用,但它们的设计目标、功能特性和扩展方式有所不同。选择哪种作为网关取决于具体的项目需求和技术栈。
Nginx在其中扮演的角色是什么?
● 反向代理
● 负载均衡
SpringGateway在其中扮演的角色是什么?
● 统一鉴权
● 负载均衡
● 服务发现
-
网关
+关注
关注
9文章
5744浏览量
53111 -
服务器
+关注
关注
13文章
9816浏览量
88139 -
HTTP
+关注
关注
0文章
526浏览量
33610 -
nginx
+关注
关注
0文章
171浏览量
12645
原文标题:Nginx实战全攻略:从安装配置到反向代理,详解与网关的差异及性能优化技巧
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
评论