当前位置: 首页 > news >正文

nginx 80端口转发失效_搞懂Nginx

Nginx 是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好。Nginx 专为性能优化而开发,性能是其最重要的要求,十分注重效率,有报告 Nginx 能支持高达 50000 个并发连接数。

Nginx 知识网结构图

Nginx 的知识网结构图如下:

70ce4cf1fbff6805fa0b8c66ffe412e4.png

反向代理

正向代理: 局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。

b5207e6fbc5217c602a6a69b3afa0937.png

反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端。

此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。

2da130f1aa5e9455446cf0d9bdc203e7.png

负载均衡

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕之后,再将结果返回给客户端。

普通请求和响应过程如下图:

09c9bbecb354db2195750a74b5a56040.png

但是随着信息数量增长,访问量和数据量飞速增长,普通架构无法满足现在的需求。

我们首先想到的是升级服务器配置,可以由于摩尔定律的日益失效,单纯从硬件提升性能已经逐渐不可取了,怎么解决这种需求呢?

我们可以增加服务器的数量,构建集群,将请求分发到各个服务器上,将原来请求集中到单个服务器的情况改为请求分发到多个服务器,也就是我们说的负载均衡。

图解负载均衡:

b9effe3f4f6122a7a2616f58e47057a8.png

假设有 15 个请求发送到代理服务器,那么由代理服务器根据服务器数量,平均分配,每个服务器处理 5 个请求,这个过程就叫做负载均衡。

动静分离

为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析的速度,降低由单个服务器的压力。

动静分离之前的状态:

2a13a71a6a349d4fdcd1adb346a3dd6e.png

动静分离之后:

9876ca8b5b8cfe4ec8905b306a6d3bf6.png

Nginx 如何在 Linux 安装

参考链接:
https://blog.csdn.net/yujing1314/article/details/97267369

Nginx 常用命令

查看版本:
./nginx -v
启动:
./nginx
关闭(有两种方式,推荐使用 ./nginx -s quit):
 ./nginx -s stop
 ./nginx -s quit
重新加载 Nginx 配置:
./nginx -s reload

Nginx 的配置文件

配置文件分三部分组成:

①全局块

从配置文件开始到 events 块之间,主要是设置一些影响 Nginx 服务器整体运行的配置指令。

并发处理服务的配置,值越大,可以支持的并发处理量越多,但是会受到硬件、软件等设备的制约。 fd6029e02229ba4cac72541902a4ddac.png
②events 块

影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 workprocess 下的网络连接进行序列化,是否允许同时接收多个网络连接等等。

支持的最大连接数: 220b3573e7e313e42b11b4dac802d608.png
③HTTP 块
诸如反向代理和负载均衡都在此配置。
location[ = | ~ | ~* | ^~] url{

}

location 指令说明,该语法用来匹配 url,语法如上:

  • =:用于不含正则表达式的 url 前,要求字符串与 url 严格匹配,匹配成功就停止向下搜索并处理请求。

  • ~:用于表示 url 包含正则表达式,并且区分大小写。

  • ~*:用于表示 url 包含正则表达式,并且不区分大小写。

  • ^~:用于不含正则表达式的 url 前,要求 Nginx 服务器找到表示 url 和字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再匹配。

  • 如果有 url 包含正则表达式,不需要有 ~ 开头标识。

反向代理实战

①配置反向代理

目的:在浏览器地址栏输入地址 www.123.com 跳转 Linux 系统 Tomcat 主页面。

②具体实现

先配置 Tomcat,因为比较简单,此处不再赘叙,并在 Windows 访问: ddee153b9857e59ab9c216cec3bf374a.png

具体流程如下图:

4f71e14d6b754a31fc0e6e39358c9c86.png

修改之前:

c581650f95035ea0a11112cde90f0c1a.png

配置如下:

dfdc972014f78d640b9f0a36be410bce.png

再次访问:

4e7e0a5ce52faeda0706b77bcdc47699.png

③反向代理 2

目标:

  • 访问 http://192.168.25.132:9001/edu/ 直接跳转到 192.168.25.132:8080

  • 访问 http://192.168.25.132:9001/vod/ 直接跳转到 192.168.25.132:8081

准备: 配置两个 Tomcat,端口分别为 8080 和 8081,都可以访问,端口修改配置文件即可。

5b3c313b3f682635507fd4560cf09f3f.png

13634aab567c1264bb3df045872fd8a8.png

新建文件内容分别添加 8080!!!和 8081!!!

08a51583e889be6f39391c3eccbdb536.png

af93741794b52467edc8ed39c06d74f0.png

响应如下图:

6232f6d172a4aad15cc9e915e8f97634.png

8bbedc0c2c665da99f8a4d7c64d5ff72.png

具体配置如下:

5a1ae24e22d97bdefd9c36ec9070bb3b.png

重新加载 Nginx:

./nginx -s reload

访问:

44a84c0e9bce2772557c5794fc2e8b0c.png

44a84c0e9bce2772557c5794fc2e8b0c.png

实现了同一个端口代理,通过 edu 和 vod 路径的切换显示不同的页面。

反向代理小结

第一个例子:浏览器访问 www.123.com,由 host 文件解析出服务器 ip 地址
192.168.25.132 www.123.com。

然后默认访问 80 端口,而通过 Nginx 监听 80 端口代理到本地的 8080 端口上,从而实现了访问 www.123.com,最终转发到 tomcat 8080 上去。

第二个例子:

  • 访问 http://192.168.25.132:9001/edu/ 直接跳转到 192.168.25.132:8080

  • 访问 http://192.168.25.132:9001/vod/ 直接跳转到 192.168.25.132:8081

实际上就是通过 Nginx 监听 9001 端口,然后通过正则表达式选择转发到 8080 还是 8081 的 Tomcat 上去。

负载均衡实战

①修改 nginx.conf,如下图: ecb087dc98717ae7d8d436de24e4d80e.png

3ca17152d89f09d5eb9c3c7c3dc5dbec.png

②重启 Nginx:
./nginx -s reload

③在 8081 的 Tomcat 的 webapps 文件夹下新建 edu 文件夹和 a.html 文件,填写内容为 8081!!!!

④在地址栏回车,就会分发到不同的 Tomcat 服务器上:

972df17a809213e2daa405a5f15e22b9.png

f88941960fec39cc1448943c718372b6.png

负载均衡方式如下:

  • 轮询(默认)。

  • weight,代表权,权越高优先级越高。

  • fair,按后端服务器的响应时间来分配请求,相应时间短的优先分配。

  • ip_hash,每个请求按照访问 ip 的 hash 结果分配,这样每一个访客固定的访问一个后端服务器,可以解决 Session 的问题。

7824fe5c08a0760e42c55c931dcb0ef6.png

200a365dfa64b2a42c6e24e5b55a71f7.png

f1de620dedb1883c7e9c793cdeb69eee.png

动静分离实战

什么是动静分离?把动态请求和静态请求分开,不是讲动态页面和静态页面物理分离,可以理解为 Nginx 处理静态页面,Tomcat 处理动态页面。

动静分离大致分为两种:

  • 纯粹将静态文件独立成单独域名放在独立的服务器上,也是目前主流方案。

  • 将动态跟静态文件混合在一起发布,通过 Nginx 分开。

动静分离图析:

63cd944391c45de215b05257a03c6d7d.png

实战准备,准备静态文件:

049283543e20e9d6dea1a19ab28f175b.png

6f4f58958a4c76a9b63ae4b899b9da1b.png

配置 Nginx,如下图: 9a1a96c1b438d885c86c8ce8c513dc46.png

Nginx 高可用

如果 Nginx 出现问题: 4be410aea3dbef8343ea8d1bb1b7fd00.png 解决办法:

f17dfabc3460a6442c7f596477554214.png

前期准备:

  • 两台 Nginx 服务器

  • 安装 Keepalived

  • 虚拟 ip

安装 Keepalived:

[root@192 usr]# yum install keepalived -y
[root@192 usr]# rpm -q -a keepalived
keepalived-1.3.5-16.el7.x86_64
修改配置文件:
[root@192 keepalived]# cd /etc/keepalived
[root@192 keepalived]# vi keepalived.conf

分别将如下配置文件复制粘贴,覆盖掉 keepalived.conf,虚拟 ip 为 192.168.25.50。

对应主机 ip 需要修改的是:

  • smtp_server 192.168.25.147(主)smtp_server 192.168.25.147(备)

  • state MASTER(主) state BACKUP(备)
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.25.147
   smtp_connect_timeout 30
   router_id LVS_DEVEL # 访问的主机地址
}

vrrp_script chk_nginx {
  script "/usr/local/src/nginx_check.sh"  # 检测文件的地址
  interval 2   # 检测脚本执行的间隔
  weight 2   # 权重
}

vrrp_instance VI_1 {
    state BACKUP    # 主机MASTER、备机BACKUP    
    interface ens33   # 网卡
    virtual_router_id 51 # 同一组需一致
    priority 90  # 访问优先级,主机值较大,备机较小
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.25.50  # 虚拟ip
    }
}
启动代码如下:
[root@192 sbin]# systemctl start keepalived.service

ad4cddacf4f94f12b2323b1134c41ad6.png

访问虚拟 ip 成功: 751f8daf7230eb3b23c1f36d2d0339b1.png

关闭主机 147 的 Nginx 和 Keepalived,发现仍然可以访问。

原理解析

069b042b948a99409674030d1e998053.png

如下图,就是启动了一个 master,一个 worker,master 是管理员,worker是具体工作的进程。

d901b456f2fb185af754aad7e71b48cb.png worker 如何工作?如下图:

70ec05570e66221bdb233f3607446e4f.png

小结 worker 数应该和 CPU 数相等;一个 master 多个 worker 可以使用热部署,同时 worker 是独立的,一个挂了不会影响其他的。

相关文章:

  • python04-0.1_Python04(基础语法)
  • MSSQL 中 Stuff 的应用
  • 最大独立匹配_射频电路设计中阻抗匹配的必要性
  • SQL日期推算...
  • python强制关闭线程_在python中实现强制关闭线程的示例
  • ABAP將數字輸出前面補0
  • potplayer哪个版本最好用_市面上有多少云手机?哪个最好用?
  • ABAP两个非法修改系统程式的方法...
  • python作者 es6_Es6 写的文件import 起来解决方案详解
  • route命令详解_程序员必备的学习笔记《TCP/IP详解》IP选路、动态选路、UDP 协议...
  • 5分钟让你整明白美国金融危机爆发的原因
  • python中字典copy_python中字典、元祖、浅拷贝、深拷贝
  • javascript在IE和Firefox中的兼容考虑
  • python计算两字符串中的位置,从Python中的字符串中获取两个字符
  • 读者skyfalling:《.NET 2.0面向对象编程揭秘》读后有感
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【RocksDB】TransactionDB源码分析
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • Fundebug计费标准解释:事件数是如何定义的?
  • iOS小技巧之UIImagePickerController实现头像选择
  • javascript从右向左截取指定位数字符的3种方法
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Python学习之路13-记分
  • Quartz初级教程
  • React系列之 Redux 架构模式
  • SQLServer之创建数据库快照
  • webpack4 一点通
  • 从tcpdump抓包看TCP/IP协议
  • 离散点最小(凸)包围边界查找
  • 如何在 Tornado 中实现 Middleware
  • 探索 JS 中的模块化
  • 一、python与pycharm的安装
  • Java性能优化之JVM GC(垃圾回收机制)
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • ###项目技术发展史
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $.ajax()方法详解
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (篇九)MySQL常用内置函数
  • (十一)手动添加用户和文件的特殊权限
  • (四) Graphivz 颜色选择
  • (四)库存超卖案例实战——优化redis分布式锁
  • (学习日记)2024.01.09
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)Scala的“=”符号简介
  • .NET HttpWebRequest、WebClient、HttpClient
  • // an array of int
  • /3GB和/USERVA开关
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @SuppressWarnings注解
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • @WebService和@WebMethod注解的用法