nginx的调度和优化

服务器nginx的调度分为http调度和TCP/UDP调度
四台虚拟机,
一台:主机名client 网卡eth0 192.168.4.10/24
二台:主机名proxy 网卡eth0 192.168.4.5/24
网卡eth1 192.168.2.5/24
三台:主机名web1 网卡eth0 192.168.1.100/24
四台:主机名web2 网卡eth0 192.168.1.200/24

版权声明:本文为CSDN博主「(_浪漫☆傲天」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/MANlidong/article/details/99325423

http调度–反向代理

通过nginx实现web的反向代理功能实现 nginx使用轮询的方式调用后端web服务器
命令:upstream

1第一步—部署web1跟web2服务器 并把两台服务器做出区分

注意配置防火墙跟SELinux

[root@web1 ~]# yum  -y  install  httpd
[root@web1 ~]# echo "192.168.2.100" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
[root@web2 ~]# yum  -y  install  httpd
[root@web2 ~]# echo "192.168.2.200" > /var/www/html/index.html
[root@web2 ~]# systemctl restart httpd
2.在nginx服务器上 添加服务器池,实现反向代理
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
#使用upstream定义后端服务器集群,集群名称任意(如webserver)
#使用server定义集群中的具体服务器和端口
upstream webserver {
                server 192.168.2.100:80;
                server 192.168.2.200:80;
        }
.. ..
server {
        listen        80;
        server_name  localhost;
            location / {
#通过proxy_pass将用户的请求转发给webserver集群
            proxy_pass http://webserver;
        }
}
3重新加载配置 , 在客户端游览器访问代理服务器
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload

    [root@client ~]# curl http://192.168.4.5            //使用该命令多次访问查看效果
    [root@client ~]# curl http://192.168.4.5            //使用该命令多次访问查看效果
4.upstream服务器集群池的属性

weight设置服务器权重值,默认值为1
max_fails设置最大失败次数
fail_timeout设置失败超时时间,单位为秒
down标记服务器已关机,不参与集群调度

upstream webserver {
                server 192.168.2.100 weight=1 max_fails=1 fail_timeout=30;
                server 192.168.2.200 weight=2 max_fails=2 fail_timeout=30;
                server 192.168.2.101 down;
        }
#weight设置服务器权重值,默认值为1
#max_fails设置最大失败次数
#fail_timeout设置失败超时时间,单位为秒
#down标记服务器已关机,不参与集群调度
5调用服务器集群池

在server { } 中写入 : proxy_pass http://集群定义的名字

可以关闭一台web服务器 试试轮询 然后在打开 在测试

6配置upstream调度算法
ip_hash — 相同客户端访问相同服务器
    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    .. ..
    http {
    .. ..
    upstream webserver {
    #通过ip_hash设置调度规则为:相同客户端访问相同服务器
                     ip_hash;                                     //改
                    server 192.168.2.100 weight=1 max_fails=2 fail_timeout=10;
                    server 192.168.2.200 weight=2 max_fails=2 fail_timeout=10;
            }
    .. ..
    server {
            listen        80;
            server_name  www.tarena.com;
                location / {
                proxy_pass http://webserver;
            }
    }

加载配置,客户端测试,同上

TCP/UDP调度

需要确认在编译安装是是否开启ngx_stream_core_module模块
在安装编译时输入命令–with-stream 以确保开启
加权的轮询调度算法,调度后端两台服务器.

    [root@proxy ~]# yum -y install gcc pcre-devel openssl-devel        //安装依赖包
    [root@proxy ~]# tar  -xf   nginx-1.12.2.tar.gz
    [root@proxy ~]# cd  nginx-1.12.2
    [root@proxy nginx-1.12.2]# ./configure   \
    > --with-http_ssl_module                                //开启SSL加密功能
    > --with-stream                                       //开启4层反向代理功能
    [root@proxy nginx-1.12.2]# make && make install           //编译并安装
2添加服务器池,实现TCP/UDP反向代理功能
    [root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
    stream {
                upstream backend {
                   server 192.168.2.100:22;            //后端SSH服务器的IP和端口
                   server 192.168.2.200:22;
    }
                server {
                    listen 12345;                    //Nginx监听的端口
                    proxy_connect_timeout 30s;         //连接的超时时间,可选配置
                    proxy_timeout 3s;
                     proxy_pass backend;
                 }
    }
    http {
    .. ..
    }
3重新加载配置 使用客户机1多次访问代理服务器

nginx的优化

1.自定义404报错页面

我们一开始可以访问一个文本不存在的页面,就会出现404
404 文件未找到

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
        charset utf-8;                    //仅需要中文时需要改选项,可选项
error_page   404  /404.html;    //自定义错误页面
.. ..


[root@proxy ~]# vim /usr/local/nginx/html/404.html        //生成错误页面
Oops,No NO no page …

然后重启服务,在访问不存在的页面

2.查看服务器的状态信息

在安装编译是需要用命令–with-http_stub_status_module 开启状态页面模块
修改配置文件,定义状态页面

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
… …
location /status {
                stub_status on;
                 #allow IP地址;
                 #deny IP地址;
        }
… …

优化后查看状态页面信息

    [root@proxy ~]# curl  http://192.168.4.5/status
    Active connections: 1 
    server accepts handled requests
     10 10 3 
    Reading: 0 Writing: 1 Waiting: 0

3.优化nginx的并发量

优化前先对nginx进行测试 回发现nginx的并发量在一千多
实际上是1024,超过这个并发量网站就打不开了

    [root@proxy ~]# ab -n 2000 -c 2000 http://192.168.4.5/
    Benchmarking 192.168.4.5 (be patient)
    socket: Too many open files (24)                //提示打开文件数量过多

修改nginx配置文件,增加并发量
增加cpu核心数 设置最大并发连接数,实际上到不了6w

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes  2;                    //与CPU核心数量一致
events {
worker_connections 65535;        //每个worker最大并发连接数
}
.. ..

重启服务 在继续测设

优化linux的内核参数,最大文件数量
ulimit是临时设置

[root@proxy ~]# ulimit -a                        //查看所有属性值
[root@proxy ~]# ulimit -Hn 100000                //设置硬限制(临时规则)
[root@proxy ~]# ulimit -Sn 100000                //设置软限制(临时规则)
[root@proxy ~]# vim /etc/security/limits.conf
    .. ..
*               soft    nofile            100000
*               hard    nofile            100000

重新加载配置文件 在测试并发量

4.优化nginx数据包头部缓存

用脚本生成一个长的地址

[root@proxy ~]# vim lnmp_soft/buffer.sh 
#!/bin/bash
URL=http://192.168.4.5/index.html?
for i in {1..5000}
do
    URL=${URL}v$i=$i
done
curl $URL                                //经过5000次循环后,生成一个长的URL地址栏

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

[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size    1k;        //默认请求包头信息的缓存    
large_client_header_buffers  4 4m;        //大请求包头部信息的缓存个数与容量
.. ..
}

使用脚本测试头部请求是否获得响应

5.本地缓存静态数据

在游览器地址栏中输入about:cache 显示游览器的缓存信息
清空缓存 修改nginx配置文件 自定义静态页面缓存时间

[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天
}
}

6.日志切割

日志文件越来越大,单个文件10G 如何切割
1把旧的日志重命名
2kill USR1 PID(nginx的进程pid号)
1手动执行

[root@proxy ~]#  mv access.log access2.log
[root@proxy ~]# kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid

2自动执行

    [root@proxy ~]# vim /usr/local/nginx/logbak.sh
    #!/bin/bash
    date=`date +%Y%m%d`
    logpath=/usr/local/nginx/logs
    mv $logpath/access.log $logpath/access-$date.log
    mv $logpath/error.log $logpath/error-$date.log
    kill -USR1 $(cat $logpath/nginx.pid)
    [root@proxy ~]# crontab -e
    03 03 * * 5  /usr/local/nginx/logbak.sh

7.对页面进行压缩处理

修改配置文件

    [root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
    http {
    .. ..
    gzip on;                            //开启压缩
    gzip_min_length 1000;                //小文件不压缩
    gzip_comp_level 4;                //压缩比率
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
                                        //对特定文件压缩,类型参考mime.types
    .. ..
    }

8.服务器内存缓存

将文件缓存在内存,下次访问可以更快
修改配置文件

    http { 
    open_file_cache          max=2000  inactive=20s;
            open_file_cache_valid    60s;
            open_file_cache_min_uses 5;
            open_file_cache_errors   off;
    //设置服务器最大缓存2000个文件句柄,关闭20秒内无请求的文件句柄
    //文件句柄的有效时间是60秒,60秒后过期
    //只有访问次数超过5次会被缓存
    } 
提示:修改完配置文件后一定要重启服务,重启服务,启服务.

你可能感兴趣的:(nginx的调度和优化)