首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

nginx的一些功能

编程知识
2024年07月24日 21:40

一、四层(tcp/udp)代理

由于nginx默认是不支持四层代理的因此在安装的时候需要加上对应的模块with-stream

./configure --with-stream
# 查看当前nginx安装了什么模块
root@proxy[05:52:09]:/usr/local/nginx
$ sbin/nginx -V
nginx version: nginx/1.24.0
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) 
configure arguments: --with-stream

【1】、创建集群

这个集群是用来实现ssh登录负载均衡的,因此我们不能再http的大括号中进行配置了。需要新建一个集群配置

stream{
    upstream ssh_server{
    server 192.168.121.171:22;
    server 192.168.121.172:22;
}
    server{
        listen 12345;
        proxy_pass ssh_server;
}
}

由于nginx监听12345端口,再启动nginx后,nginx会监听两个端口80和12345

root@proxy[06:04:15]:/usr/local/nginx
$ sbin/nginx 
root@proxy[06:04:28]:/usr/local/nginx
$ ss -tunlp | grep nginx
tcp   LISTEN 0      511          0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=5549,fd=7),("nginx",pid=5548,fd=7))
tcp   LISTEN 0      511          0.0.0.0:12345      0.0.0.0:*    users:(("nginx",pid=5549,fd=6),("nginx",pid=5548,fd=6))

【2】、进行测试

IP:192.168.121.170

port:80

我们设置了ssh_cluster

让nginx监听 port:12345

此时客户端访问ssh 192.168.121.170 -p 12345

代理会自动将任务分到后面的服务器中

在准备另外一台主机进行ssh访问

此时在进行访问时不能访问nginx的22端口了,要访问12345端口,然后退出,再ssh登录,查看轮询效果

ssh 192.168.121.170 -p 12345

⚠️又可能会出现下面的问题

在我第一次ssh登录成功并退出后,在使用ssh登录时会不让登录。此时我们需要将~/.ssh/know_hosts文件删除,再登录即可

然后每一次ssh访问前先删除这个文件

出现这种情况的原因:

Linux存在一种保护机制,当我们首次对一台机器进行ssh登录时,再~/.ssh/know_hosts文件中会生成一条记录IP----机器。当我们下一次再对这个IP进行ssh时,他会进行校验IP----机器,是否和上一次的匹配。

由于我们设置了集群,会有轮询的效果出现,这就导致了,我们虽然访问的IP是同一个,都是nginx集群的IP,但是最后登陆的主机不是同一个,正是由于这种情况,导致当我们第一次登录成功退出后,再登录会报错。此时我们将~/.ssh/know_hosts文件删除即可,在每次登录完成后 都要删除一次这个文件,才能看到集群轮询的效果

如果你搭建集群的机器是由一台机器克隆出来的,那么你不会出现这种情况,由于是一台机器克隆出来的,那么所有机器都一样,不存在匹配失败的问题

image-20240619222804579

二、nginx并发测试

进行压力测试

nginx作为被测试对象

web01作为一大群人去访问nginx

压力测试工具:httpd-tools

Linux系统最大文件打开数量默认值:1024

可以通过修改/etc/security/limits.conf 文件来永久修改Linux系统文件最大打开的数量(重启后生效)

# 查看Linux系统最大文件打开数量
root@proxy[18:26:32]:/usr/local/nginx
$ ulimit -n 
1024
# 修改Linux系统最大文件打开数量(临时修改)
root@proxy[18:30:22]:/usr/local/nginx
$ ulimit -n 100000
root@proxy[18:31:20]:/usr/local/nginx
$ ulimit -n 
100000

# 永久修改Linux系统最大文件打开数量,修改/etc/security/
#*               soft    core            0
#*               hard    rss             10000
# 修改为
*               soft    nofile           100000
*               hard    nofile           100000
# *:表示任意用户都生效	soft/hard:软限制(软限制可以突破,突破后会给出警告)/硬限制(不可突破) nofile:最大文件打开数量

# 再web01上进行压力测试,-n:指定测试次数,-c:指定让多少人来测
ab -n 100 -c 100 http://192.168.121.170/
# 测试完成出现如下界面则说明测试成功
Percentage of the requests served within a certain time (ms)
  50%     29
  66%     29
  75%     30
  80%     30
  90%     32
  95%     32
  98%     33
  99%     33
 100%     33 (longest request)

# 我们如果直接测试,我们会发现nginx的并发性不高,这主要是由于nginx没有打开“并发的锁”,我们需要对nginx进行优化后再进行压力测试。我们直接修改配置文件

#user  nobody;
# 将worker_process的值从1改为2,理论上说这个值可以在大一点,但是由于我们是虚拟机,本身CPU只有两个,调的再大也意义不大
worker_processes  2;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

# worker_connections最大连接数,这个和worker_process一样,理论可以很大,但是由于虚拟机的显示,它不能太大
events {
    worker_connections  50000;

# 修改完配置文件后再将Linux的系统最大文件打开数量修改完成,就可以进行压力测试了。
ab -n 8000 -c 8000 http://192.168.121.170/
# 我们可以发现其并发量可以达到8000-10000,如果实在真实环境下的服务器中并发量会更高

三、nginx支持超长地址

当我要访问页面的地址假如放的特别深,或许可能会有参数,如下:

www.abc.com/aa/vv/cc/xxxxx/wwww/rrrr/ggg/a.html?a=123%b=567....

nginx默认支持1KB的网址查询,当面临这种超长URL传输时,我们就需要对nginx进行进一步的优化了,使其支持超长地址传输

我们可以写一个脚本进行测试

#!/bin/bash
URL=http://192.168.121.170/index.html?
for i in {1..5000}
do
        URL=${URL}v$i=$i
done
curl $URL

# 执行这个脚本,出现了414的状态码,其实网页是存在的,但是因为nginx无法解析这么长的URL,就导致无法查看网页,便会出现414的报错
root@proxy[19:37:40]:~
$ bash buffer.sh 
<html>
<head><title>414 Request-URI Too Large</title></head>
<body>
<center><h1>414 Request-URI Too Large</h1></center>
<hr><center>nginx/1.24.0</center>
</body>
</html>

# 修改nginx配置文件使其能够解析超长的URL,再http中加上如下内容,使其可以解析超长URL,但是这个限制,不能无限大,它受限于服务器的内存
client_header_buffer_size 200k;
large_client_header_buffers 4 200k;


# 修改完成重启nginx后,再执行脚本,就不会再报414的错误了
root@proxy[19:46:04]:/usr/local/nginx
$ bash ~/buffer.sh 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

四、浏览器本地缓存静态数据

​ 我们可以使用nginx去控制客户端的浏览器,当用户第一次访问我们的网站时,服务器将数据传输给用户后,会在client的浏览器中留下缓存,当用户下一次访问时,看似是服务器将数据传输给了客户端,其实是客户端浏览器的缓存提供的数据

​ 通过修改nginx的配置文件可以设置,用户访问什么样的网站时会保留缓存,以及保留的时间是多长

# 当用户访问的网站数据类型是(png|jpg|mp4|html|txt)这些时,浏览器会生成缓存,保留缓存30天
location ~* \.(png|jpg|mp4|html|txt)$ {
        expires 30d;
}
From:https://www.cnblogs.com/xuruizhao/p/18321943
本文地址: http://www.shuzixingkong.net/article/393
0评论
提交 加载更多评论
其他文章 C# 12 新增功能实操!
前言 今天咱们一起来探索并实践 C# 12 引入的全新功能! C#/.NET该如何自学入门? 注意:使用这些功能需要使用最新的 Visual Studio 2022 版本或安装 .NET 8 SDK 。 主构造函数 主构造函数允许你直接在类定义中声明构造函数参数,并自动生成相应的属性。 主构造函数参
C# 12 新增功能实操! C# 12 新增功能实操!
locust多进程实现分布式压测遇到的问题
多进程分布式的实现: locust分布式时,需借助命令locust 一个一个启动worker,在使用中有点繁琐, 下面借助于多进程,按既定worker数量,一键启动; from locust import FastHttpUser, task, User, events, HttpUser #cla
POJ3278 Catch That Cow
Catch That Cow Time Limit:&#160;2000MS Memory Limit:&#160;65536K Total Submissions:&#160;222142 Accepted:&#160;67092 Description Farmer John has been
POJ3278 Catch That Cow POJ3278 Catch That Cow POJ3278 Catch That Cow
第十二节 JMeter基础-中级地址信息【IF控制器】
文章介绍了在JMeter中核对收货地址信息的操作流程,并深入探讨了JMeter中的IF控制器、日志等组件的使用。特别强调了Groovy和Jexl3在表达式语言上的区别,以及它们在Java平台上的应用场景和语法特性。
第十二节 JMeter基础-中级地址信息【IF控制器】 第十二节 JMeter基础-中级地址信息【IF控制器】 第十二节 JMeter基础-中级地址信息【IF控制器】
全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用
本文主要介绍了在使用Python面向对象编程时,如何使用try/except语句捕获并处理异常,并辅以CSV文件读写为例进行讲解,同时说明了如何对Exception对象进行引用。
全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用 全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用 全网最适合入门的面向对象编程教程:24 类和对象的 Python 实现-异常的捕获与处理:try/except 语句、文件读写示例、Exception 引用
在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST
引言 蛋白质语言模型 (Protein Language Models, PLM) 已成为蛋白质结构与功能预测及设计的有力工具。在 2023 年国际机器学习会议 (ICML) 上,MILA 和英特尔实验室联合发布了 ProtST 模型,该模型是个可基于文本提示设计蛋白质的多模态模型。此后,ProtS
在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST 在英特尔 Gaudi 2 上加速蛋白质语言模型 ProtST
【数学建模导论】Task01 数据处理与拟合模型
0 前言 感谢 DataWhale 的开源学习课程 intro-mathmodel,项目仓库在这。 现在开始,跟着Task01 进入数据类的学习,实现每一个代码,包括数据预处理、回归分析与分类分析、假设检验、随机过程与随机模拟、数据可视化图表、三种插值模型。 本篇是知识的梳理和总结,用以更好地食用教
【数学建模导论】Task01 数据处理与拟合模型 【数学建模导论】Task01 数据处理与拟合模型 【数学建模导论】Task01 数据处理与拟合模型
【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。
VMware Cloud Foundation 管理域部署要求至少准备 4 台 ESXi 主机作为最小计算单元,如果采用整合部署(管理域和 VI 工作负载域合并),还需要根据实际情况适量增加 ESXi 计算主机。但是,对于测试学习来说,我们不需要准备这么多物理主机,可以采用嵌套虚拟化部署的方式来完成
【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。 【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。 【VMware VCF】VMware Cloud Foundation Part 04:准备 ESXi 主机。