标准状况下,软件默认的参数都是对安装软件的硬件标准(最低配置)来设置的,目前咱们服务器的硬件资源远远大于要求的标准,因此为了让服务器性能更加出众,充分利用服务器的硬件资源,咱们通常须要优化APP的并发数来提高服务器的性能。
总结来讲:1.服务器大并发实现;2.提高用户体验;3.为公司省钱。javascript
Nginx是主进程+工做进程模型,也就是一个主进程会挂几个工做进程。php
$ cat /proc/cpuinfo | grep "flags" | wc -l 4
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000; # 依次表明从1到4这四个核 events { worker_connections 10240; # 这个值通常先设比较小,观察进程消耗再决定是否增长并发数 }
# 查看进程及进程是否处于对应核心上 $ ps -eo psr,pid,args | grep "nginx" 0 13977 nginx: master process /usr/local/nginx/sbin/nginx # 父进程 0 13978 nginx: worker process 1 13979 nginx: worker process 2 13980 nginx: worker process 3 13981 nginx: worker process 0 14284 grep --color=auto nginx # 查看nginx链接数 $ netstat -antpl | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 13977/nginx: master # 查看nginx当前链接的人数 $ netstat -antpl | grep nginx | grep ESTABLISHED | wc -l 0
nginx这种web服务器软件都是属于TCP协议的软件,TCP协议的特色就在于每次链接时要进行三次握手,握手成功后再通信数据,通信结束后四次挥手断开链接。
而http协议是一个无状态协议, 每次进行通信都要三次握手四次挥手,那服务器就须要常常去维护握手和断开。 服务器压力过大、浪费的资源也过多。
所以通常都须要开启长链接,在第一个请求结束后,等一段时间,若是这个时间内,再有请求过来,则不断开链接,直接将数据发送给客户端。这样就下降了握手和挥手的次数和频率。css
# 关闭长链接:0表明关闭 keepalive_timeout 0; # 开启长链接 # keepalive_timeout 65; # 一个长链接处理最大请求数(按期释放内存,防止内存溢出) # keepalive_requests 8192;
关闭长链接时:html
# 浏览器访问完马上进入TIME_WAIT状态(主动关闭) $ netstat -antpl Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1317/master tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14698/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1095/sshd tcp 0 0 192.168.31.42:80 192.168.31.28:64977 TIME_WAIT - tcp 0 0 192.168.31.42:80 192.168.31.28:64978 TIME_WAIT - tcp 0 0 192.168.31.42:80 192.168.31.28:64979 TIME_WAIT - tcp 0 0 192.168.31.42:22 192.168.31.28:64678 ESTABLISHED 14636/sshd: root@pt tcp6 0 0 ::1:25 :::* LISTEN 1317/master tcp6 0 0 :::22 :::* LISTEN 1095/sshd # 一段时间后链接消息消失 $ netstat -antpl Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1317/master tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14698/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1095/sshd tcp 0 0 192.168.31.42:22 192.168.31.28:64678 ESTABLISHED 14636/sshd: root@pt tcp6 0 0 ::1:25 :::* LISTEN 1317/master tcp6 0 0 :::22 :::* LISTEN 1095/sshd
开启长链接时:前端
# 因为前面设置长链接超时时间是65秒,这段时间内一直保持在ESTABLISHED状态: $ netstat -antpl Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1317/master tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14828/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1095/sshd tcp 0 0 192.168.31.42:80 192.168.31.28:51700 ESTABLISHED 14829/nginx: worker tcp 0 0 192.168.31.42:22 192.168.31.28:50373 ESTABLISHED 14777/sshd: root@pt tcp 0 0 192.168.31.42:22 192.168.31.28:64678 ESTABLISHED 14636/sshd: root@pt tcp 0 0 192.168.31.42:80 192.168.31.28:51701 ESTABLISHED 14829/nginx: worker tcp6 0 0 ::1:25 :::* LISTEN 1317/master tcp6 0 0 :::22 :::* LISTEN 1095/sshd # 时间超时长链接断开 $ netstat -antpl Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1317/master tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 14828/nginx: master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1095/sshd tcp 0 0 192.168.31.42:22 192.168.31.28:50373 ESTABLISHED 14777/sshd: root@pt tcp 0 0 192.168.31.42:22 192.168.31.28:64678 ESTABLISHED 14636/sshd: root@pt tcp6 0 0 ::1:25 :::* LISTEN 1317/master tcp6 0 0 :::22 :::* LISTEN 1095/sshd
关闭长链接时:
java
开启长链接时:
nginx
gzip(GNU-ZIP)是一种压缩技术。通过gzip压缩后页面大小能够变为原来的30%甚至更小,这样,用户浏览页面的时候速度会块得多。gzip的压缩页面须要浏览器和服务器双方都支持,实际上就是服务器端压缩,传到浏览器后浏览器解压并解析。浏览器那里不须要咱们担忧,由于目前的巨大多数浏览器都支持解析gzip过的页面。
Nginx的压缩输出有一组gzip压缩指令来实现。相关指令位于http{….}两个大括号之间。web
gzip on; # 启动gzip压缩功能 gzip_proxied any; # nginx作前端代理时启用该选项,表示不管后端服务器的headers返回什么信息,都无条件启用压缩 gzip_min_length 1k; # 小于1k的小文件不压缩(小文件可能会越压缩越大) gzip_buffers 4 8k; # 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流,按照原始数据大小以8k为单位申请4倍内存空间 gzip_comp_level 6; # gzip压缩级别,1压缩比最小处理速度最快,9压缩比最大处理最慢也最消耗CPU,通常设置为3便可 gzip_types text/plain text/css application/x-javascript application/javascript application/xml; # 什么类型的页面或文档启用压缩 gzip_vary on; # 开启在http header中添加Vary:Accept-Encoding
语法:expires [time|epoch|max|off]
默认值:expires off
做用域:http,server,location后端
location ~* \.(js|css)?$ { expires 1h; }
server { listen 80; server_name localhost; location / { root html/web1; index index.html index.htm; } # 客户端缓存设置:png或gif文件在客户端缓存一个小时 location ~* \.(png|gif)$ { expires 1h; }
测试浏览器刷新以Chrome为例:浏览器
公司网站平常PV 60万,Nginx服务器该如何优化?