web服务器优化的一些思路
作为一个新手(并不是菜鸟,而是像我们这样的学生),维护一个网站往往是一个很头疼的问题,尤其是动态网站,更尤其是用java写的网站.
当网站的吞吐量很小的时候你会发现服务器根本不需要维护,因为几乎没有延迟宕机等bug出现,但是当你的网站源代码达到10M以上时你就要小心了,你的网站随时会崩溃,即使没有ddos.
虽然不是专业的服务器维护人员也不是专业的算法工程师,但是我根据经验总结出了一下几个思路,可以很有效的提高你的网站的可用性.
数据库篇
数据库是影响网站可用性的最重要的因素,70%以上的小型网站的宕机问题都是由于数据库崩溃造成的,怎么做呢?
使用连接池
数据库连接池类似tcp连接,需要消耗时空资源来建立,维护,销毁一个连接,再使用它,但是数据库的访问是位于web服务器架构最底层的dao层,可以说和用户之间没有任何直接联系,而且数据库多连接的初衷是多个数据库访问之间相互隔离,互不干扰,以达到安全的目录,但是对于一个网站整体来说,内部的对象和方法都是相互信任的,甚至可以共享一个数据库连接.
这时候我们还需要为每一个请求,每一个服务,每一个方法维护一个数据库连接对象吗?显然是浪费生命.
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
市场上基于java的开源连接池有dbcp,c3p0等比较主流,还有hibernete框架提供了封装好的连接池方法可以使用.
抛弃数据库
服务器缓存
即使建立 了数据库连接池,只是节省了数据库连接的开销,但是数据库还是要经受住大量的并发访问.但是为每一个动态网页访问一次数据库真的必要吗??
对于某些实时更新的网站比如某某股票走势图,那实时访问数据库是必须的,但是对于一个相对更静态的网页来说,比如我这个个人博客,里面的文章几乎是几天一更,这个时候就完全没必要浪费数据库资源了,甚至可以把动态网页(jsp)直接重写成静态的(html)文件给用户看,效果是一样的.
但是重写太鲁莽了,我们要做的是缓存以达到更弹性的效果.
经过上面一讲,大家对服务器缓存肯定没有疑惑了,它就是实现了一种对用户透明的一种优化机制,直接上产品吧,在java市场,web缓存发展的还不是很快,但一个主流的产品是OSCACHE,有以下特点:’
缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。 拥有全面的API–OSCache
API给你全面的程序来控制所有的OSCache特性。
永久缓存–缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。
支持集群–集群缓存数据能被单个的进行参数配置,不需要修改代码。
缓存记录的过期–你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)
“当然了,也可以自己手写”
浏览器缓存
为啥很多人选择关掉browser缓存啊,这明明是有利于双方的优良机制啊,又不是web前端人员嫉cache如仇..
不过缓存真的对小型服务器很友好,尤其是我们这些在阿里云腾讯云上租的廉价学生机,只有可怜如两三兆的出口带宽,不开启浏览器缓存的话真的是浪费钱,最好把超时时间弄长一点,24小时最好,java代码如下:
//设置浏览器缓存30分钟
resp.setHeader(“Cache-Control”, “public”);
resp.setHeader(“Pragma”, “Pragma”);
resp.setDateHeader(“expires”,new Date().getTime()+30*60*1000);
服务器代理
和服务器缓存不一样,代理类似过滤器,但是最好是在新的机器上部署,比如防火墙,好吧,做代理的效果其实就是升级硬件的效果,不过这是一种任务分离的思想,可以显著提高响应速度,亲测有效!
容器篇
定期重启
即使JVM的垃圾回收机制再好,总会有残留的内存垃圾,有的是由bug产生的,也有非bug产生的,但是无论如何,建过网站的小伙伴们都有感受,把服务器重启一番,或者把服务器软件重启一下,整个网站神清气爽,速度刷新.所以有了这个思路,也不必纠结于人生三大错觉之一的”我能管理好内存”了,重启大法好!
对于linux系统,可以利用crond命令来自动的周期性的重启服务器容器(tomcat):
crontab -e 0 0 * * * /usr/local/tomcat/bin/shutdown.sh >>
/root/reboot_tomcat_log 2>&1 1 0 * * *
/usr/local/tomcat/bin/startup.sh >> /root/reboot_tomcat_log 2>&1
crontab -l systemctl restart crond
web服务器优化的一些思路的更多相关文章
- centos7作为web服务器优化
centos7作为web服务器优化 原文 http://itindex.net/detail/51140-centos7-web-服务器 1.加大打开文件数的限制(open files) 查看 uli ...
- Web性能优化:基本思路和常用工具
听了荣华的演讲之后,我对性能优化有了更深层次的认识. 性能优化的重要性 性能优化是为了赢得用户,为了降低成本. 性能优化思路 Web常见优化点 Java常见排查工具
- Web服务器优化
系统 1. 修改远程默认端口 2. Raid5 3. IIS 1. 默认文档,仅保留一个有效的. 2. 数据库 1. 更改默认端口 2. 如果一台服务器,禁用网络登录
- 高并发WEB网站优化方案
一.什么是高并发在互联网时代,所讲的并发.高并发,通常是指并发访问,也就是在某个时间点,有多少个访问同时到来.比如,百度首页同时有1000个人访问,那么也就是并发为1000.通常一个系统的日PV在千万 ...
- Web服务器Nginx多方位优化策略
标签:性能 Web 架构 Nginx 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dongsong.blog.51cto.co ...
- Web服务器性能监控分析与优化
Web服务器性能监控分析与优化 http://www.docin.com/p-759040698.html
- web站点优化之使用tengine搭建静态资源服务器,静态资源合并加载案例剖析
在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构 ...
- 01、NetCore2.0优化之Web服务器 与 IIS解耦
01.NetCore2.0优化之Web服务器 与 IIS解耦 在Asp.Net Core 2.0中,是如何实现跨平台的?不使用IIS了,在linux上的WebServer是什么? ---------- ...
- (转)WEB服务器_IIS配置优化指南
原文地址:https://www.cnblogs.com/heyuquan/p/deploy-iis-set-performance-guide.html 通常把站点发布到IIS上运行正常后,很少会去 ...
随机推荐
- [AngularJS] Angular1.3 ngAria - 1
Accessibility is an often overlooked essential feature of a web application. a11y Is a critical comp ...
- <c:redirect>标签的使用
<c:redirect>标签的使用代码例子 redirect.jsp <%@ page contentType="text/html" pageEncoding= ...
- Unity3D 播放视频
http://blog.csdn.net/jbjwpzyl3611421/article/details/12780625 导入: 影片纹理是通过Apple QuickTime导入的(支持.mov, ...
- 查看慢sql语句
查看慢sql语句 st.text AS SQL_Full --父级完整语句 ,) , ((CASE statement_end_offset THEN DATALENGTH(st.text) ELSE ...
- Spring事务属性具体解释
Spring.是一个Java开源框架,是为了解决企业应用程序开发复杂性由Rod Johnson创建的.框架的主要优势之中的一个就是其分层架构,分层架构同意使用者选择使用哪一个组件,同一时候为 J2EE ...
- 【Linux】touch命令
用途 touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间. 全称 touch全称即为touch 参数 -a :或--time=atime或--time=access或--time ...
- iOS 3DTouch
概述 iOS10系统登录中国,在系统中对3D Touch的使用需求更频繁,所以对iOS9中便引入的3D Touch功能做一些了解是很有必要的 详细 代码下载:http://www.demodashi. ...
- JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储。浮点型数据使用注意事项。全局变量特殊之处
JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储. 所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定: <!DOCTYPE html& ...
- python笔记-列表和元组
列表和元组: -可以将列表和元组当成普通的数组 -列表和元组可以保存任意类型的python对象 -通过从0开始的数字索引访问元素 -列表和元组可以存储不同类型的对象 列表和元组的区别: -列表元素使用 ...
- 如何在C++中调用C程序
注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反. C++和C是两种完全不同的编译链接处理方式,如果直接在C++里面调用C函数,会找不到函数体,报链接错误. 要解 ...