web性能优化——代理(nginx)
简介
一个很好的原则是调优时每次只个性一个配置。如果对配置的个性不能提高性能的话,改回默认值
优化必须要通过性能测试。不能意淫,需要前后对比,真实说明问题。
场景
- 优化nginx。
- 确保每次请求控制一定资源。
- 减少访问web容器
解决方案
nginx优化
全局优化
# nginx进程数,建议按照cpu数目来指定,一般为它的倍数。
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
# 这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致
worker_rlimit_nofile 65535;
events {
# 使用epoll的I/O模型。
use epoll;
# 每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections
worker_connections 50000;
}
#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#连接超时时间,单位时间是秒
keepalive_timeout 180;
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
#防止网络阻塞
tcp_nopush on;
tcp_nodelay on;
#开启gzip压缩
gzip on;
gzip_min_length 512;
gzip_buffers 4 16k;
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 5;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_types text/plain application/json application/x-javascript text/css application/xml;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
# 这个是指多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
# open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;
# 客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得
open_file_cache max=102400 inactive=20s;
日志
日志是要读写文件的,I/O消耗特别严重。日志是否开启可以根据自己具体的架构需求。
建议的是如下:
- 静态资源不记录。
# 静态资源通过nginx来管理
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
# 关闭日志
access_log off;
include deny/agent.conf;
if (-f $request_filename) {
expires 1d;
break;
}
}
- 动态资源要记,但是需要添加缓存。
access_log logs/access.log main buffer=12k;
限制资源使用
这个其实和安全非常相似。本质是限制资源使用,这样就能让有限的资源为更多人提供服务。
所以可以参见:web安全——代理(nginx)
减少访问web容器
一般web容器的性能都是比较差了,所以尽量阻止访问web容器。
动静分离
一般的web容器的长链接性能都比较弱,而nginx在这方面又特别优秀。
# 动态的服务
server {
server_name sso.xxx.com;
#监听
listen 80;
location / {
#反向代理到指定的服务
proxy_pass http://xxx-server;
#定义服务器的默认网站根目录位置
root /;
proxy_set_header Host $host;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
}
}
# 静态的服务
server {
server_name static.xxx.com;
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css|ico)$ {
# 文件根目录,这个目录根据文件的位置变更即可。
root /home/static;
if (-f $request_filename) {
expires 1d;
break;
}
}
}
缓存化
把一些热点的数据放在缓存服务器,这样能提升性能。
srcache_nginx+redis构建缓存系统。在web应用中通过设置http的缓存特性(最好是基于注释或者配置,对开发者尽量是透明的,不要增加业务复杂度),来判断是否需要缓存。
#设置key,根据域名和uri
set $key $host$request_uri;
#来一个md5,要不然key太长。而且key特别长的时候,貌似在srache_store的时候执行不了
set_md5 $md5key $key;
#调用HttpSRCacheModule的srcache_fetch 在http进入时,执行该方法,如果取到值,则不执行代理(即不执行tomcat),直接返回
srcache_fetch GET /redis2_get $md5key;
#如果没有设置缓存时间,则默认时间为这个
srcache_default_expire 3600s;
#调用HttpSRCacheModule的srcache_store在执行代理(即执行tomcat)后,执行该方法,而且必需为“cache-control” 不等于"no-cahce"才执行。
#srcache_expire的取值优先级
#1、如果有cache-control;max-age=N,则取N
#2、如果没有,有expire,则取expire
#3、如果都没有取srcache_default_expire
srcache_store PUT /redis2_set key=$md5key&expire=$srcache_expire;
静态化
把基本没有变化的请求转为静态文件资源。直接通过文件提供服务。
实现思路见下面的参考资料。
不过可能会有个问题,需要注意并且以后去解决
# 问题
平常访问是没有问题,但在高并发下,你想死的心都有。打开文件不对,一看是前面还没写完,另外一个用户就访问了,又写,导致文件格式不对。
# 建议思路
如果最终还是要写html,还是通过程序去实现。例如:新闻类更新时,由编辑人员点击发布,此时可能就写了一个静态的html,而不是由用户去访问出发写html,避免高并发会出现的问题
需要进一步思考的地方:
缓存化
和静态化
使用的场景。以及在nginx使用静态化
是否合适。
验证方法
- pagespeed.webkaka.com。验证是否开启gzip。
- ab|webbench,来测试接口。
参考资料
web性能优化——代理(nginx)的更多相关文章
- web性能优化——浏览器相关
简介 优化是一个持续的过程.所以尽可能的不要有人为的参与.所以能自动化的或者能从架构.框架级别解决的就最更高级别解决. 这样即能实现面对开发人员是透明的.不响应,又能确保所有资源都是被优化过的. 场景 ...
- Web性能优化-合并js与css,减少请求
Web性能优化已经是老生常谈的话题了, 不过笔者也一直没放在心上,主要的原因还是项目的用户量以及页面中的js,css文件就那几个,感觉没什么优化的.人总要进步的嘛,最近在被angularjs吸引着,也 ...
- Web 性能优化:21 种优化 CSS 和加快网站速度的方法
这是 Web 性能优化的第 4 篇,上一篇在下面看点击查看: Web 性能优化:使用 Webpack 分离数据的正确方法 Web 性能优化:图片优化让网站大小减少 62% Web 性能优化:缓存 Re ...
- 关于WEB 性能优化 (摘抄)
压缩源代码和图片 JavaScript文件源代码可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,JPG图片可以根据具体质量来压缩为50%到70%,PNG可以使用一些开源压缩软件来压缩,比如24色 ...
- Web性能优化系列
web性能优化之重要,这里并不打算赘述.本系列课程将带领大家认识.熟悉.深刻体会并且懂得如果去为不同的站点做性能优化 同时,本系列将还会穿插浏览器兼容性相关问题的解决方案,因为在我看来,兼容性同样属于 ...
- 移动web性能优化笔记
移动web性能优化 最近看了一些文章,对移动web性能优化方法,做一个简单笔记 笔记内容主要出自 移动H5前端性能优化指南和移动前端系列——移动页面性能优化
- web性能优化 来自《web全栈工程师的自我修养》
最近在看<web全栈工程师的自我修养>一书,作者是来自腾讯的前端工程师.作者在做招聘前端的时候问应聘者web新能优化有什么了解和经验,应聘者思索后回答“在发布项目之前压缩css和 Java ...
- web性能优化之--合理使用http缓存和localStorage做资源缓存
一.前言 开始先扯点别的: 估计很多前端er的同学应该遇到过:在旧项目中添加新的功能模块.或者修改一些静态文件时候,当代码部署到线上之后,需求方验收OK,此时你送了一口气,当你准备开始得意于自己的ma ...
- Web 性能优化:Preload与Prefetch的使用及在 Chrome 中的优先级
摘要: 理解Preload与Prefetch. 原文:Web 性能优化:Preload,Prefetch的使用及在 Chrome 中的优先级 作者:前端小智 Fundebug经授权转载,版权归原作者所 ...
随机推荐
- KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册
计算监控属性构造参考 计算监控属性可使用以下形式进行构造: ko.computed( evaluator [, targetObject, options] ) - 这种形式是创建一个计算监控属性最常 ...
- Java——List集合
package om.hanqi.test; import java.util.ArrayList; import java.util.List; public class Test01 { publ ...
- MongoDB修改器的使用1
为什么要使用修改器? 通常我们只会修改文档的一部分,这时候更新整个文档就显得很麻烦,通常是通过原子性的更新修改器来完成. 1."$set"修改器 "$set ...
- 【技巧】只利用 Visual Stdio 自带的工具这么找父类?
很多人说只能 F12 看见子类 其实vs里面有一个叫“对象浏览器” 通过这个就可以直接定位父类,不需要利用reflector之类的工具来找父类 具体如下:
- 仿SGI STL的traits技法
首先是iterator traits,这个是用来萃取迭代器的特性的 #ifndef _STL_ITERATOR_H_ #define _STL_ITERATOR_H_ #include <cst ...
- Android入门(七)碎片的生命周期与限定符
原文链接:http://www.orlion.ga/560/ 这篇文章实际已经在上篇文章中写的差不多了,但是万恶的wordpress没保存!已经不止一次出现这种情况了! 一.碎片的生命周期 1.碎片的 ...
- 关于未捕获异常的处理(WPF)
这一篇文章来谈谈对于WPF应用程序开发中的未捕获异常的处理. 首先,我们当然是要求应用程序开发人员,尽可能地在程序可能出现异常的地方都去捕捉异常,使用try-catch的方式.但是总是有一些意外的情况 ...
- 碉堡了! 纯 CSS 绘制《辛普森一家》人物头像
这篇文章给大家分享一组纯 CSS 绘制的<辛普森一家>人物头像.<辛普森一家>(The Simpsons)是马特·格勒宁为美国福克斯广播公司创作的一部动画情景喜剧.该剧通过对霍 ...
- Gumby – 基于 Sass 的灵活的,响应式 CSS 框架
Gumby 框架是一个基于 SASS 的灵活的,响应式的 CSS 框架.可以借助其灵活,响应式的网格系统和 UI 套件快速创建逻辑的页面布局和应用程序原型. 您可能感兴趣的相关文章 35个让人惊讶的 ...
- Database Primary key and Foreign key [From Internet]
Database Primary key and Foreign key --Create Referenced Table CREATE TABLE Department ( DeptID int ...