nginx的一些功能
一、四层(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的一些功能的更多相关文章
- Nginx 状态信息功能配置
Nginx 状态信息功能介绍 Nginx 有一个 ngx_http_stub_status_module 模块,主要功能是记录 Nginx 的基本访问状态信息,让使用者了解 Nginx 的工作状态 要 ...
- Nginx启动SSL功能
Nginx启动SSL功能,并进行功能优化,你看这个就足够了 一:开始Nginx的SSL模块 1.1 Nginx如果未开启SSL模块,配置Https时提示错误 nginx: [emerg] the &q ...
- 启动Nginx目录浏览功能及 让用户通过用户名密码认证访问web站点
一.启动Nginx目录浏览功能 [root@abcdocker extra]# cat w.conf server { listen 80; server_name IP地址; location / ...
- Nginx代理缓存功能
Nginx代理缓存功能 Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...
- Nginx 反向代理功能-动静分离
Nginx 反向代理功能-动静分离 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Nginx 反向代理功能-实现Nginx tcp负载均衡
Nginx 反向代理功能-实现Nginx tcp负载均衡 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Nginx 反向代理功能-实现http反向代理
Nginx 反向代理功能-实现http反向代理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Nginx Rewrite相关功能-防盗链
Nginx Rewrite相关功能-防盗链 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Nginx Rewrite相关功能-rewrite指令
Nginx Rewrite相关功能-rewrite指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令
Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
随机推荐
- nginx学习记录【二】nginx跟.net core结合,实现一个域名访问多个.net core应用
1.实现转发 打开conf下的nginx.conf文件,如下图: 2.添加.net core网站的转发 按下面的进行修改,修改完后,就把localhost的80转发到了https://localhos ...
- 使用jasypt对springboot配置信息加密
1.pom文件增加依赖 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactI ...
- itest(爱测试) 4.5.2 发布,开源BUG 跟踪管理 & 敏捷测试管理软件
itest 简介 itest 开源敏捷测试管理,testOps 践行者,极简的任务管理,测试管理,缺陷管理,测试环境管理4合1,又有丰富的统计分析.可按测试包分配测试用例执行,也可建测试迭代(含任务, ...
- VmWare虚拟机和主机配置为同一网段IP
参考博客:将虚拟机IP与主机IP设置在同一网段的方法 - 天懿 - 博客园 (cnblogs.com) 主机地址 主机通过WiFi连接,地址信息为: 虚拟机配置 选择编辑-->虚拟网络编辑器-- ...
- Java中的变量分类(按照位置分类)
变量按位置分 通过上面类的建立我们又得到了新的概念:成员变量和局部变量 成员变量: 可以使用基本数据类型,也可以使用引用数据类型. java中的变量在使用时必须初始化,成员变量可以不对其初始化,系统会 ...
- Asp .Net Core 系列:详解鉴权(身份验证)以及实现 Cookie、JWT、自定义三种鉴权 (含源码解析)
什么是鉴权(身份验证)? https://learn.microsoft.com/zh-cn/aspnet/core/security/authentication/?view=aspnetcore- ...
- ABC317题解报告
我直接从第三题开始讲了. T3 把数组 \(A\) 从大到小排序. 然后从前往后把前 \(q\) 个数加起来,然后判断这 \(q\) 个数的和与 \(d\) 的大小关系,如果大了就变成 \(d\). ...
- ubuntu server 22.04 安装docker
ubuntu server 22.04 安装docker 官方安装文档: https://docs.docker.com/engine/install/ubuntu/ 1.更新软件列表: sudo a ...
- 恢复Everything的默认排序
在窗口里点了文件名/时间排序后,想恢复默认排序: 点击菜单 ,视图-排序-最近打开时间.
- JavaScript 中判断 {}是空对象
Javascript 中判断空对象 简介:在 JavaScript 判断字符串是否是一个空字符串 可以 !"" 返回 true 来判断, 要是判断 {} 是否是空对象,也用 !{} ...