利用nginx加速web访问
起因
----------
在最近新系统的设计中对于首页打开速度的问题做了一些考虑,由于页面上还是以动态数据为主,所以简单的静态化数据可能并不行,所以需要从业务和技术结合的角度去考虑这个问题。由于有些数据并不敏感,其实可以放入缓存并定时更新。另外就是有些本身是静态,能否加快并发相应速度。
这里对动态数据想到了2种办法:1)把Action设置成单例,请求的结果直接加在缓存里,再用一个定时线程去刷新这个缓存;2)让输出的结果页静态化,定时更新结果页。
前者控制起来非常灵活,利用双缓冲也能让人感觉不到缓冲时的速度下降,缺点就是要改动比较多的代码。后者正好相反,静态化要依靠外层的框架配置,代码完全不用改动。
选型
-----------
目前比较流行的反向代理服务器有squid和nginx,查了一下资料,发现nginx比较擅长反向代理和负载均衡,而squid强在自身的缓存机制,另外lightd貌似多用来做图片服务器。经过比较感觉nginx的配置文件简单一些,所以决定用这个先尝试一下。
性能测试
----------------
安装完成当然是先做一下性能测试了,这次同样使用ab来进行压力测试。为了做对比,这里也启动了一个tomcat,nginx配置成其的反向代理。我就在本机进行访问,但测试结果令我惊叹。
测试命令:ab -n 10000 -k -c 1000 http://localhost:8080/pscms_hlj_web/images/logo.jpg
tomcat:
- Server Software: Apache-Coyote/1.1
- Server Hostname: localhost
- Server Port: 8080
- Document Path: /pscms_hlj_web/images/logo.jpg
- Document Length: 17619 bytes
- Concurrency Level: 1000
- Time taken for tests: 3.671 seconds
- Complete requests: 4254
- Failed requests: 0
- Write errors: 0
- Keep-Alive requests: 4254
- Total transferred: 76035996 bytes
- HTML transferred: 74951226 bytes
- Requests per second: 1158.92 [#/sec] (mean)
- Time per request: 862.874 [ms] (mean)
- Time per request: 0.863 [ms] (mean, across all concurrent requests)
- Transfer rate: 20228.99 [Kbytes/sec] received
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 33 67.4 0 261
- Processing: 52 255 60.1 272 315
- Waiting: 15 129 61.7 127 261
- Total: 52 288 108.0 272 559
nginx:
- Server Software: nginx/0.7.67
- Server Hostname: localhost
- Server Port: 8000
- Document Path: /pscms_hlj_web/images/logo.jpg
- Document Length: 17619 bytes
- Concurrency Level: 1000
- Time taken for tests: 0.597 seconds
- Complete requests: 10000
- Failed requests: 0
- Write errors: 0
- Keep-Alive requests: 10000
- Total transferred: 179370000 bytes
- HTML transferred: 176190000 bytes
- Requests per second: 16744.67 [#/sec] (mean)
- Time per request: 59.721 [ms] (mean)
- Time per request: 0.060 [ms] (mean, across all concurrent requests)
- Transfer rate: 293309.69 [Kbytes/sec] received
- Connection Times (ms)
- min mean[+/-sd] median max
- Connect: 0 2 8.1 0 44
- Processing: 0 49 19.7 48 97
- Waiting: 0 44 19.8 42 93
- Total: 0 51 19.4 52 99
nginx的性能远远胜出,这应该是这个页面会被缓存的原因,另外支持epoll肯定也有较高的IO性能提升。但这个测试中也发现tomcat已经很稳的挂掉了,nginx的高并发支持真不是盖的。
结论
----------
真实系统中不可能有那么多静态的内容,因为浏览器本地也会有缓存,但是nginx会在很大程度上提升对并发响应的能力。对于一些不需要频繁更新的动态内容也可以做定时缓存,这样也可以大大加快页面的打开速度并降低后端压力。线上系统可以把图片、js、css、静态html都缓存起来,后端只接受动态内容的请求,从而提速web访问速度。
其他发现
--------------
其实nginx是把缓存的内容经过hash后放到文件中的,虽然测试中来看肯定是在内存中拿的结果,但是肯定还是有一次写入。后来查到linux下面有一个自带的文件系统,在/dev/shm下面,默认是内存大小的一半。这样真的可以把缓存的内容指向这个文件里面就行了。
另外,nginx也可以很方便的实现双机热备和负载均衡。负载均衡可以配置weight来调整访问比例,系统会自动把请求进行转向。双机热备会在所有节点都不可用时自动转向,这在系统升级的时候可以做到不中断服务。这些实现做类似如下配置即可:
- upstream testproxy {
- server 127.0.0.1:8080 weight=10;
- server 127.0.0.1:8081 weight=10;
- server 192.168.0.11:8080 backup;
- }
转自:http://passover.blog.51cto.com/2431658/588602
利用nginx加速web访问的更多相关文章
- Centos下Nginx配置WEB访问日志并结合shell脚本定时切割
在一个成熟的WEB系统里,没有日志管理是不可以的,有了日志,可以帮助你得到用户地域来源.跳转来源.使用终端.某个URL访问量等相关信息:通过错误日志,你可以得到系统某个服务或server的性能瓶颈等. ...
- 记一次给nginx的web服务器目录加软链接
先期情况和问题 已安装好nginx服务器和相关配置.nginx的web目录是/usr/share/nginx/html. 现在的问题是希望把web目录换成/root/nginx/html/,但是不更改 ...
- 如何在nginx下实现访问web网站密码认证保护的功能
在某些特定的环境下,我们希望nginx下的web站点在访问时需要用户输入账户密码才能访问.以便拒绝那些不速之客. 其实,配置起来也很简单,按照下面的步骤即可实现. 一.编辑虚拟主机配置文件. serv ...
- Nginx作为web静态资源服务器——跨域访问
跨站访问 为什么浏览器禁止跨域访问 Nginx跨站访问 Syntax:add_header name value [always]; Default:—— Context:http,serve ...
- 七、Nginx学习笔记七Nginx的Web缓存服务
user www; worker_processes 1; error_log /usr/local/nginx/logs/error.log crit; pid /usr/local/nginx/l ...
- nginx的web缓存服务环境部署记录
web缓存位于内容源Web服务器和客户端之间,当用户访问一个URL时,Web缓存服务器会去后端Web源服务器取回要输出的内容,然后,当下一个请求到来时,如果访问的是相同的URL,Web缓存服务器直接输 ...
- 二十二. 安装部署Tomcat服务器、使用Tomcat部署虚拟主机、使用Varnish加速Web
web proxy web1 web2 1.安装部署Tomcat服务器 web1 1.1 使用RPM安装JDK环境 ]# yum -y install java-1.8.0-openjdk ]# ...
- 高级运维(一):反向代理&使用Varnish加速Web
案例1.反向代理 目标: 1.代理服务器可以将远程的Web服务器页面缓存于本地 2.代理服务器端口设置为80端口 3.用户通过访问代理服务器即可获得远程Web服务器页面上的内容 4.远程We ...
- Web开发基本准则-55实录-Web访问安全
Web开发工程师请阅读下面的前端开发准则,这是第一部分,强调了过去几年里我们注意到的Web工程师务须处理的Web访问安全基础点.尤其是一些从传统软件开发转入互联网开发的工程师,请仔细阅读,不要因为忽视 ...
随机推荐
- ViewPager中的子Activity无法响应OnActivityResult的解决方法
ViewPager子Activity通过startActivityForResult()跳转至OtherActivity,OtherActivity回传结果由ViewPager所在的父Activity ...
- C语言:1孩半问题
题目: 一孩半,又称独女户二胎,即中国大陆部分农村的一项计划生育政策,第一胎是女孩的夫妻可以生育第二个子女.如果第二胎有n%人工性别选择干预(选择男孩),试问男女比例为多少.(10分)题目内容: 一孩 ...
- Linux 下开发环境的搭建(软件安装)
一.Centos6.5下安装JDK 步骤1: 查看现有安装的JDK版本 rpm –qa | grep -i java 步骤2: 卸载已有软件 rpm -e --nodeps java-1.7.0-op ...
- 接口调用 POST
/** * 接口调用 POST * @return [type] [description] */ public function portPhone(Request $request) { $pho ...
- Python入门3(赋值)
[一:*,-1的作用] 给大家两个例子: a,b,c,d='spam' print(a) print(b) print(c) print(d) a,*b='spam' print(a) print(b ...
- QT防止程序启动两次的方法
为了使QT 能保证只创建一个实例来进行, 对windows和linux分别采取了全局互斥变量和文件锁的方法. Q_OS_WIN32宏用来表示编译运行的目标平台是windows,Q_OS_LINUX则标 ...
- synchronized锁优化
1.自旋锁和自适应自旋锁 sync在JDK1.6之前之所以被称为重量级锁,是因为对于互斥同步的性能来说,影响最大的就是阻塞的实现.挂起线程与恢复线程的操作都需要转入内核态中完成.从用户态转入内核态是比 ...
- Oracle 判断为空 all space
You can use trim on the column. where trim(product_type) is null The above is not DBMS-independent, ...
- java中的dao模式
java中Dao模式 什么是DAO 1.Data Access Object(数据存取对象) 2.位于业务逻辑和持久化数据之间 3.实现对持久化数据的访问 DAO模式的作用 1隔离业务逻辑代码 ...
- 为什么要使用String
最近在培训课期间指导初学者.任务之一就是要大家完成一个类,要求这个类对key为String类型的map执行dwarwle操作.其中一位学员完成的类中,有如下方法: void dwarwle(HashM ...