Nginx-调度器、优化

news/2024/7/7 21:42:23 标签: nginx, 运维

Nginx调度器

一、HTTP调度

1、反向代理语法格式

http {
    upstream webserver {    # 定义源服务器组
    #ip_hash;
    server 192.168.88.100:80 weight=2;
    server 192.168.88.200:80 down;
    server 192.168.88.101:80 max_fails=2 fail_timeout=30;
    }
    server {
        listen       80;
        server_name  _;
        location / {
            proxy_pass http://webserver;    # 调用服务组
        }
    }
}

2、调度算法

轮循(默认):逐一循环调度

weight:指定轮循几率,权重值和访问比率成正比

ip_hash:根据客户端IP分配固定的后端服务器

least_conn:新的请求分配给压力最小的服务器

3、服务器组主机状态

down:表示当前server暂时不参与负载

max_fails:允许请求失败的次数(默认为1)

fail_timeout:max_fails次失败后,暂停提供服务的时间

二、TCP/UDP调度

1、模块

  • ngx_stream_core_module模块
  • 使用--with-stream开启该模块

2、语法格式

stream {
    upstream backend {
        server 192.168.88.100:22;
        server 192.168.88.200:22;
    }
    server {
        listen 12345;
        proxy_pass backend;
    }
}

http {
... ...
}

Nginx优化

一、HTTP错误代码

返回码描述
200一切正常
301永久重定向
302临时重定向
400请求语法错误
401访问被拒绝(账户或密码错误)
403资源不可用,通常由于服务器上文件或目录的权限设置导致
403禁止访问:客户端的IP地址被拒绝
404无法找到指定位置的资源(Not Found)
414请求URI头部太长
500服务器内部错误
502服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答(Bad Gateway)

1、自定义错误页面

http {
fastcgi_intercept_errors on;
server {
error_page 404 /40x.html;

error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}
}

二、Nginx状态页面

1、status模块

--with-http_stub_status_module开启模块功能

可以查看Nginx连接数等信息

如果要添加模块,但不想删除之前nginx数据,可以将nginx源码目录下的objs目录中的nginx文件拷贝到nginx的sbin目录下替代现有主程序,然后killall nginx 再重启即可

./configure --with-stream --with-http_stub_status_module
make
killall  nginx
cp objs/nginx /usr/local/nginx/sbin/
/usr/local/nginx/sbin/nginx

cat /usr/local/nginx/conf/nginx.conf
location /status {
    stub_status on;
}

三、优化nginx并发量

1、常用压力测试工具

ab -c 并发数 -n 总请求数 URL

2、全局配置优化

调整进程数量

#user  nobody;
worker_processes  1;    # 建议与CPU核心数一致

3、EVENT模块优化

网站常见指标:并发、PV、UV

max_clients=worker_processes * worker_connections

注意修改系统ulimit限制/etc/security/limits.conf

events {
    worker_connections  1024;    # 每个worker最大并发连接数
}

4、优化Linux内核参数(最大文件描述符数量)

# 查看最大文件数量
[root@proxy ~]# ulimit -n
# 临时设置最大文件数量
[root@proxy ~]# ulimit -n 100000

[root@proxy ~]# vim /etc/security/limits.conf
    .. ..
*               soft    nofile            100000
*               hard    nofile            100000
#该配置文件分4列,分别如下:
#用户或组    硬限制或软限制    需要限制的项目   限制的值

四、优化Nginx数据包头缓存,支持超长地址

优化前,使用脚本测试超长头部请求是否能获得响应

默认情况下nginx无法支持长地址栏,会报414错误

[root@proxy ~]# cat buffer.sh 
#!/bin/bash
URL=http://192.168.99.5/index.html?
for i in {1..5000}
do
    URL=${URL}v$i=$i
done
curl $URL                              # 经过5000次循环后,生成一个超长的URL地址
[root@proxy ~]# ./buffer.sh
.. ..
<center><h1>414 Request-URI Too Large</h1></center>        #访问失败

修改Nginx配置文件,增加数据包头部缓存大小

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size    200k;        # 请求包头信息的缓存大小    
large_client_header_buffers  4 200k;      # 大请求包头部信息的缓存个数与容量
.. ..
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

优化后,使用脚本测试超长头部请求是否能获得响应

[root@proxy ~]# ./buffer.sh

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

修改配置文件,定义对静态页面的缓存时间

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
expires        30d;            # 定义客户端缓存时间为30天
}
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

六、配置网站限流限速

1、定义limit_rate限制

[root@web1 nginx]# vim /usr/local/nginx/conf/nginx.conf
http {
...    
    limit_rate 100k;                # 全局限速
    server {
        limit_rate 200k;            # 虚拟主机限速
        listen 80;
        server_name www.b.com;
        root html;
        index index.html;
        location /file_a {
            limit_rate 300k;        # file_a目录限速300k
        }
        location /file_b {
            limit_rate 0k;          # file_b目录不限速
        }
    }

2、创建测试目录

[root@web1 nginx]# mkdir html/file_a
[root@web1 nginx]# mkdir html/file_b

3、创建测试文件

[root@web1 nginx]# dd if=/dev/zero of=html/test.img  bs=100M count=1
[root@web1 nginx]# dd if=/dev/zero of=html/file_a/test.img  bs=100M count=1
[root@web1 nginx]# dd if=/dev/zero of=html/file_b/test.img  bs=100M count=1

4、下载测试

wget www.b.com/test.img
wget www.b.com/file_a/test.img
wget www.b.com/file_b/test.img

七、防盗链

valid_referers指令可以检测被访问资源从哪个地址来

1、添加防盗链测试语句

[root@web1 nginx]# vim /usr/local/nginx/conf/nginx.conf
server {
...    
    valid_referers none 192.168.99.100;    # 如果请求头中的referer字段包含者地址是99.100或者没有referer字段则有效,
    if ($invalid_referer){                  # 如果上述测试无效则条件成立
        return 403;                         # 返回错误提示
    }
...
}

2、web1编写测试页面

[root@web1 nginx]# cat html/index.html
web1
测试页面  --
<a href="http://192.168.99.100/nr.html">内容</a>

[root@web1 nginx]# cat html/nr.html
web1内容页面

3、web2编写测试页面

[root@web2 nginx]# cat html/index.html
web2
测试页面  --
<a href="http://192.168.99.100/nr.html">内容</a>

4、测试

从192.168.99.100主页点内容可以访问,但从99.200点不可以


http://www.niftyadmin.cn/n/5475420.html

相关文章

AI预测性测试和风险评估

预测性测试和风险评估是两种不同的概念&#xff0c;但它们在确保软件质量和项目管理中都扮演着重要的角色。 预测性测试 预测性测试是一种利用历史数据和机器学习技术来预测软件在未来可能发生故障的时间和方式的方法。这种方法可以帮助团队提前识别潜在的问题&#xff0c;并…

每日面经:计算机网络part1

1. 计算机网络的组成部分有哪些&#xff1f; a. 硬件设备&#xff1a;计算机网络由各种硬件设备组成&#xff0c;包括计算机、服务器、路由器、交换机、网卡等。这些设备通过物理连接&#xff08;如网线、光纤&#xff09;相互连接。 b. 协议&#xff1a;计算机网络中的通信需…

JS模块化——AMD、CommonJS和ESModules

文章目录 JS模块化——AMD、CommonJS和ESModules方法介绍传统方法&#xff1a;立即执行函数&#xff1a;异步模块定义AMD&#xff1a;CommonJS:ES Modules: CommonJS 和 ES Modules 区别 JS模块化——AMD、CommonJS和ESModules 前端模块化是指将前端代码拆解成互相独立的小块&…

算法-数论-蓝桥杯

算法-数论 1、最大公约数 def gcd(a,b):if b 0:return areturn gcd(b, a%b) # a和b的最大公约数等于b与a mod b 的最大公约数def gcd(a,b):while b ! 0:cur aa bb cur%bpassreturn a欧几里得算法 a可以表示成a kb r&#xff08;a&#xff0c;b&#xff0c;k&#xff0c…

[开源]基于SVM的时间序列预测python代码

整理了SVM的时间序列预测python代码分享给大家。记得点赞哦 #!/usr/bin/env python # coding: utf-8import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn import preprocessing from sklearn.metrics import mean_squared_error from math i…

使用Springboot配置生产者、消费者RabbitMQ?

生产者服务 1、引入依赖以及配置rabbitmq 此时我们通过使用springboot来快速搭建一个生产者服务 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> applica…

Java 中 String 的常用方法

去除 String 首尾的空白符 String str"\n aaa b a "; System.out.println(str.trim());aaa b a分割 String String str "apple,banana,orange"; // 使用逗号作为分隔符&#xff0c;也可以是正则表达式 String[] fruits str.split(","); …