自学内容网 自学内容网

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点不可以


原文地址:https://blog.csdn.net/it_zhenxiaobai/article/details/137178456

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!