一、四层(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文件删除即可,在每次登录完成后 都要删除一次这个文件,才能看到集群轮询的效果

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

二、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;
}

nginx的一些功能的更多相关文章

  1. Nginx 状态信息功能配置

    Nginx 状态信息功能介绍 Nginx 有一个 ngx_http_stub_status_module 模块,主要功能是记录 Nginx 的基本访问状态信息,让使用者了解 Nginx 的工作状态 要 ...

  2. Nginx启动SSL功能

    Nginx启动SSL功能,并进行功能优化,你看这个就足够了 一:开始Nginx的SSL模块 1.1 Nginx如果未开启SSL模块,配置Https时提示错误 nginx: [emerg] the &q ...

  3. 启动Nginx目录浏览功能及 让用户通过用户名密码认证访问web站点

    一.启动Nginx目录浏览功能  [root@abcdocker extra]# cat w.conf server { listen 80; server_name IP地址; location / ...

  4. Nginx代理缓存功能

    Nginx代理缓存功能      Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...

  5. Nginx 反向代理功能-动静分离

    Nginx 反向代理功能-动静分离 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  6. Nginx 反向代理功能-实现Nginx tcp负载均衡

    Nginx 反向代理功能-实现Nginx tcp负载均衡 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  7. Nginx 反向代理功能-实现http反向代理

    Nginx 反向代理功能-实现http反向代理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  8. Nginx Rewrite相关功能-防盗链

    Nginx Rewrite相关功能-防盗链 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  9. Nginx Rewrite相关功能-rewrite指令

    Nginx Rewrite相关功能-rewrite指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  10. Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令

    Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

随机推荐

  1. winfrom 程序自己删除自己

    [DllImport("kernel32.dll")] public static extern uint WinExec(string lpCmdLine, uint uCmdS ...

  2. Json.NET Converting between JSON and XML

    Json.NET supports converting JSON to XML and vice versa using the XmlNodeConverter. Elements, attrib ...

  3. 图像处理技术OpencvSharp入门

    目录 第一部分 初识Opencv 1.C# 下Opencv库 2.安装OpenCvSharp 第二部分 OpencvSharp入门 1.加载图像文件 2.显示图像 第三部分 基础应用 1.颜色转换 2 ...

  4. UILabel的DrawDrect方法

    一.问题 如果继承UILabel实现自己的一个Label,并且在子类的DrawRect方法中留空,什么都不写,会发生什么? 代码如下: VC @interface ViewController () ...

  5. iOS手工Crash解析

    一.测试导出来一份ips crash文件,现在需要进行手工解析 现在需要下载对应的dsym文件,为了确定下载好的dsym文件和crash log是不是一致的,可以先看下dsym文件中的uuid p.p ...

  6. iOS开发环境theos开发环境搭建与介绍

    iOS开发环境theos开发环境搭建与介绍 标签(空格分隔): 越狱开发-第一篇 1. 环境准备 一台Mac,本人的机器是MacBook Air (13-inch, Mid 2013),系统是10.1 ...

  7. 深度学习论文翻译解析(二十二):Uniformed Students Student-Teacher Anomaly Detection With Discriminative Latent Embbeddings

    论文标题:Uniformed Students Student-Teacher Anomaly Detection With Discriminative Latent Embbeddings 论文作 ...

  8. 你知道键盘是如何工作的吗?(xv6键盘驱动程序)

    键盘驱动程序 公众号:Rand_cs 键盘如何工作的前文曾经说过,当时是以 Linux 0.11 为基础讲的但不系统,本文以 xv6 的键盘驱动程序为例来系统地讲述键盘是如何工作的.关于驱动程序前文磁 ...

  9. The solution of P3012

    problem & blog 很明显是个 DP. 于是我们定义 \(dp_{i,j,k}\) 为末尾的字符的 ASCII 码为 \(i\),有 \(j\) 个大写字母,\(k\) 个小写字母. ...

  10. == 和 equals 的区别是什么

    == : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址) equals() : 它的作用也是判断两个 ...