高性能Web服务器Nginx使用指南(11)

proxy_cache            反向代理设置缓存的指令,格式为proxy_cache zone|off,关闭为off,开启直接写keys_zone指令定义缓存区名称

proxy_cache_valid   对不同http状态码的页面设置不同的缓存时间

proxy_cache_key    定义以什么样的key值得到文件名 

这样反向代理缓存已经配置完成,重启nginx,然后在查看进程状态,当出现cache manager process进程时表明缓存已经建立成功。

高性能Web服务器Nginx使用指南

并且生成了缓存文件目录。

高性能Web服务器Nginx使用指南

最后在浏览器中输入负载均衡服务器的ip地址,当返回页面内容的时候,查看/data/cache/目录,结果生成了缓存文件。

高性能Web服务器Nginx使用指南

查看该缓存文件正是刚才返回的页面的请求头信息和页面内容信息。

高性能Web服务器Nginx使用指南

9.Nginx的性能优化

提高Nginx进程和CPU的亲缘性,减少进程上下文的切换

worker_process         开启worker进程数

worker_cpu_affinity   开启利用多核cpu,将worker进程绑定至CPU,提高CPU的性能 

    例如:两核CPU,两个进程

        worker_process 2;

        worker_cpu_affinity 01 10;

    目的:

        提高CPU的缓存命中率,设置worker进程数和CPU核心数一致,并且将一个worker进程绑定至一个CPU核心,这样就可以避免CPU缓存从一个核心切换到另一个核心,减少进程上下文的切换的时间。当然上诉情况仅用于CPU密集型,对于网络密集型和I/O密集型的情况,可以设置CPU核心数是worker进程数的1.5-2倍。

    taskset命令

        查看某个进程运行在哪个CPU核心上。可以将某个进程运行在指定的CPU核心上

        taskset -pc PID                     查看PID的进程运行在哪个CPU核心

        taskset -c <CPU核心> <指定命令> 定义指定命令开启的进程运行在指定CPU核心

[root@CentOS6 ~]# ps -ef |grep ping
root      13707  8104  0 11:14 pts/0    00:00:00 /bin/ping
root      13709  9069  0 11:14 pts/1    00:00:00 grep ping
[root@CentOS6 ~]# taskset -pc  13707
pid 13707's current affinity list: 0,1
[root@CentOS6 ~]# ps -ef |grep ping
root      13729  8104  0 11:18 pts/0    00:00:00 /bin/ping
root      13731  9069  0 11:18 pts/1    00:00:00 grep ping
[root@CentOS6 ~]# taskset -pc  13729
pid 13729's current affinity list: 0

提高处理性能

开启epoll事件处理模型,提高处理效率--use epoll

multi_accept     开启多请求处理机制,worker按串行方式处理连接,一个连接只有一个worker,其他的worker处于休眠状态--multi_accept on

sendfile on        避免内核缓冲区数据和用户缓冲区数据之间的拷贝

提高并发

worker_connections    决定允许客户端每个进程的最大连接数,一般65535足够了--worker_connection 65535

worker_rlimit_nofile    能够打开的最大文件数--worker_rlimit_nofile 65535

提高连接复用率

keepalive_timeout 60     连接超时时间

tcp_nodelay on           提高高频发送小数据报文的实时性

tcp_nopush  on           允许将http首部和内容在同一个报文中发送

开启Nginx压缩功能,节省带宽

gzip on

gzip_comp_level 3        压缩比,1-9,默认是1

gzip_min_length           设置页面开始压缩的最小字节数,默认为0,建议设置为1K,小于1K的页面压缩效果不好。

        页面的字节数就是http头的Content_Length

gzip_buffers                  设置内存大小作为压缩缓存

        例如gzip_buffers    4 16K    设置4个16KB的内存作为压缩缓存

gzip_http_version        设置http协议版本,默认1.1即可

gzip_types                    指定被压缩文件的类型

gzip_vary    on            让前端的缓存服务器缓存经过压缩的页面

fastcgi性能优化

fastcgi_cache_path    /usr/local/nginx/fastcgi_cache    levels=1:2    keys_zone=TEST:10m    inactive=5m

        fastcgi缓存文件路径,目录等级结构、关键字区域存储时间和非活动删除时间

fastcgi_connect_timeout    指定连接到后端fastcgi的超时时间

fastcgi_send_timeout        指定向fastcgi传送请求的超时时间

fastcgi_read_timeout        指定接受fastcgi应答的超时时间

fastcgi_buffer_size            指定读取fastcgi应答第一部分需要大多的缓冲区

fastcgi_buffers                 指定本地需要多少和多大的缓冲区来缓冲fastcgi的应答请求

php-fpm参数优化(php-fpm的配置文件)

request_terminate_timeout    脚本运行超时时间

pm = dynamic | static        调整php-fpm进程的工作模式

pm.max_children                静态模式下的php-fpm进程数量

pm.start_servers                 动态模式下的php-fpm的起始进程数量

pm.min_spare_servers        动态模式下的php-fpm的最小进程数量

pm.max_spare_servers        动态模式下的php-fpm的最大进程数量

pm.max_requests                php-fpm进程处理多少个请求后销毁

request_slowlog_timeout   慢查询日志时间

slowlog                               慢查询日志路径

rlimit_files                           打开的最大文件数

针对Nginx的Linux内核参数优化

net.ipv4.tcp_syncookies = 1       开启SYN cookies

net.ipv4.tcp_max_tw_buckets = 6000    设置timewait的数量

net.ipv4.ip_local_port_range = 1024 65000    设置允许系统打开的端口范围

net.ipv4.tcp_tw_recycle = 1        启用timewait的快速回收

net.ipv4.tcp_tw_reuse = 1           启用timewait的重用,就是将TIME-WAIT sockets重新用于新的tcp连接

net.core.somaxconn = 262144    设置系统同时发起的tcp连接数

net.core.netdev_max_backlog = 262144    当网络接口接受数据包的速率大于内核处理速率的时候,设置发送到队列的数据包的最大数量

net.ipv4.tcp_max_orphans = 262144          设置系统最多多少个TCP套接字不被关联到用户文件句柄

net.ipv4.tcp_max_syn_backlog = 262144    设置尚未收到客户端确认信息的最大连接请求最大值

net.ipv4.tcp_synack_retries = 1     设置内核放弃连接之前发送syn + ack数据包的数量   

net.ipv4.tcp_syn_retries = 1           设置内核放弃建立连接之前发送syn数据包的数量

net.ipv4.tcp_fin_timeout = 1         设置套接字保持在FIN-WAIT-2状态的时间

net.ipv4.tcp_keepalive_time = 30  TCP发送keepalive消息的频度,单位是小时

10.Nginx的I/O模型

Web服务器的网络I/O流程:

    (1)客户发起请求到服务器网卡;

    (2)服务器网卡接受到请求后转交给内核处理;

    (3)内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程

    (4)Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)   

    (5)内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘

    (6)内核调度磁盘,获取需要的资源

    (7)内核将资源存放在自己的缓冲区中,并通知Web服务器进程

    (8)Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中

    (9)Web服务器进程形成响应,通过系统调用再次发给内核以响应用户请求

    (10)内核将响应发送至网卡

    (11)网卡发送响应给用户

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/609fc2f5a92e09977537b71632533576.html