proxy_cache 反向代理设置缓存的指令,格式为proxy_cache zone|off,关闭为off,开启直接写keys_zone指令定义缓存区名称
proxy_cache_valid 对不同http状态码的页面设置不同的缓存时间
proxy_cache_key 定义以什么样的key值得到文件名
这样反向代理缓存已经配置完成,重启nginx,然后在查看进程状态,当出现cache manager process进程时表明缓存已经建立成功。
并且生成了缓存文件目录。
最后在浏览器中输入负载均衡服务器的ip地址,当返回页面内容的时候,查看/data/cache/目录,结果生成了缓存文件。
查看该缓存文件正是刚才返回的页面的请求头信息和页面内容信息。
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)网卡发送响应给用户