分类 性能优化 下的文章

流量!

最近面试总是多多少少会出现这个问题,虽然老高的网站流量不大,但是如果解决这个问题,但是在理论上还是能回答的。

首先能够明确的是,一般问这个问题的人应该没听过C10K这个问题吧,注意修饰词一般。所以你有挺高的概率不需要从更底层的回答这个问题,比如多线程和多进程的取舍,或者使用异步和非阻塞等等。。。不过老高还是建议你去了解一下C10K这个概念!这个地方有原文点我,这个地方有翻译点我

这个问题回答的方式,出发点很多。老高认为这样回答比较好:

阅读剩余部分

删除自带web、数据库、php

yum remove httpd* php* mysql-server mysql* php-mysql -y

删除不需要的程序

yum remove Deployment_Guide-en-US finger cups-libs cups ypbind bluez-libs desktop-file-utils ppp rp-pppoe wireless-tools irda-utils sendmail* samba* talk-server finger-server bind* xinetd nfs-utils nfs-utils-lib rdate fetchmail eject ksh mkbootdisk mtools syslinux tcsh startup-notification talk apmd rmt dump setserial portmap yp-tools -y
yum groupremove "Mail Server" "Games and Entertainment" "X Window System" "X Software Development" "Development Libraries" "Dialup Networking Support" "Games and Entertainment" "Sound and Video" "Graphics" "Editors" "Text-based Internet" "GNOME Desktop Environment" "GNOME Software Development" -y
yum -y groupremove "FTP Server" "PostgreSQL Database client" "PostgreSQL Database server" "MySQL Database server" "MySQL Database client" "Web Server" "Office Suite and Productivity" "E-mail server" "Ruby Support" "Printing client"

关闭selinux

setenforce 0
sed -i 's/^SELINUX=.*$/SELINUX=disabled/' /etc/selinux/config

对系统进行一些优化

sed -i 's/^id:.*$/id:3:initdefault:/' /etc/inittab
init q
[ -z "`cat ~/.bashrc | grep ^PS1`" ] && echo 'PS1="[e[37;40m][[e[32;40m]u[e[37;40m]@h [e[35;40m]W[e[0m]]\$ "' >> ~/.bashrc
sed -i 's/^HISTSIZE=.*$/HISTSIZE=10/' /etc/profile
[ -z "`cat ~/.bashrc | grep history-timestamp`" ] && echo "export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });user=$(whoami); echo $(date "+%Y-%m-%d %H:%M:%S"):$user:`pwd`/:$msg ---- $(who am i); } >> /tmp/`hostname`.`whoami`.history-timestamp'" >> ~/.bashrc
[ -z "`cat /etc/security/limits.conf | grep 'nproc 65535'`" ] && cat >> /etc/security/limits.conf <> /etc/rc.local
[ "$(hostname -i | awk '{print $1}')" != "127.0.0.1" ] && sed -i "s@^127.0.0.1(.*)@127.0.0.1   `hostname` 1@" /etc/hosts
[ -z "`cat /etc/pam.d/system-auth | grep 'pam_tally2.so'`" ] && sed -i '4a auth        required      pam_tally2.so deny=5 unlock_time=180' /etc/pam.d/system-auth

输入vi自动打开vim

[ -z "`cat ~/.bashrc | grep 'alias vi='`" ] && sed -i "s@alias mv=(.*)@alias mv=1nalias vi=vim@" ~/.bashrc && echo 'syntax on' >> /etc/vimrc

升级系统

yum -y update
yum clean all

美化命令行,其实在之前优化那里就美化了,这里只是让它生效而已

. /etc/profile
. ~/.bashrc

删除不需要的服务,这里自行考虑,反正我是只保留几个的~

service modules_dep stop
chkconfig modules_dep off
chkconfig --del modules_dep
service netconsole stop
chkconfig netconsole off
chkconfig --del netconsole
service netfs stop
chkconfig netfs off
chkconfig --del netfs
service nscd stop
chkconfig nscd off
chkconfig --del nscd
service quota_nld stop
chkconfig quota_nld off
chkconfig --del quota_nld
service rdisc stop
chkconfig rdisc off
chkconfig --del rdisc
service restorecon stopd
chkconfig restorecond off
chkconfig --del restorecond
service saslauthd stop
chkconfig saslauthd off
chkconfig --del saslauthd
service snmpd stop
chkconfig snmpd off
chkconfig --del snmpd
service snmptrapd stop
chkconfig snmptrapd off
chkconfig --del snmptrapd
service gpm stop
chkconfig gpm off
chkconfig --del gpm
service iscsi stop
chkconfig iscsi off
chkconfig --del iscsi
service iscsid stop
chkconfig iscsid off
chkconfig --del iscsid
service lm_sensors stop
chkconfig lm_sensors off
chkconfig --del lm_sensors
service lvm2-monitor stop
chkconfig lvm2-monitor off
chkconfig --del lvm2-monitor
service mcstrans stop
chkconfig mcstrans off
chkconfig --del mcstrans
service messagebus stop
chkconfig messagebus off
chkconfig --del messagebus
service multipathd stop
chkconfig multipathd off
chkconfig --del multipathd
service netconsole stop
chkconfig netconsole off
chkconfig --del netconsole
service netfs stop
chkconfig netfs off
chkconfig --del netfs
service netplugd stop
chkconfig netplugd off
chkconfig --del netplugd
service nscd stop
chkconfig nscd off
chkconfig --del nscd
service rawdevices stop
chkconfig rawdevices off
chkconfig --del rawdevices
service rdisc stop
chkconfig rdisc off
chkconfig --del rdisc
service restorecond stop
chkconfig restorecond off
chkconfig --del restorecond
service ntpd stop
chkconfig ntpd off
chkconfig --del ntpd
service ip6tables stop
chkconfig ip6tables off
chkconfig --del ip6tables
service ntpdate stop
chkconfig ntpdate off
chkconfig --del ntpdate
service portreserve stop
chkconfig portreserve off
chkconfig --del portreserve
service udev-post stop
chkconfig udev-post off
chkconfig --del udev-post
service exim stop
chkconfig exim off
chkconfig --del exim

转自http://shuang.ca/centos-optimizer/

前几天再Startssl已经为我的博客申请的证书通过,今天早上学习了RSA加密原理,趁着热乎劲还没过,下午就把本站全部升级为https啦!

看到这个https,瞬间觉得高大上了许多。大家可能认为为自己的网站开启ssl功能很麻烦,其实不然。下面老高就简单的介绍一下开启的步骤,自己也做个记录。

不同的服务器配置ssl的方法大题思路相同,本文以nginx为例。

当然你还可以试试使用Let's Encrypt -- 免费的https证书

阅读剩余部分

这篇文章个人觉得很受用,故仔细翻译了一下,有些地方可能翻译的不好,请见谅!

翻译后发现貌似已经有人翻译过,但是翻译的水平就有点。。。。。那篇文章中不仅忽略了知识点,并且出现了明显的语义和语法错误,有一定的误导作用,所以请务必重新阅读老高的翻译。文章中容易出错的地方老高已经注释(在文章中以【】标出)。

如需转载,请注明出处!

web开发者在发布你的作品前需要考虑的技术细节 What technical details should a programmer of a web application consider before making the site public!

原文地址: 来自stackexchange.com quora的回答

界面和用户体验

  • 要意识到浏览器的实现标准不一,请确保你的网站在主流浏览器中的正常展现。至少要针对一个最新的Gecko引擎(火狐)的浏览器、一个基于Webkit引擎(Safari或者其他移动端)的浏览器、Chrome、你想要支持的IE浏览器(可以借助IE应用程序兼容性VPC镜像)和Opera浏览器。同时需要考虑到在不同的操作系统下浏览器是如何渲染你的网站
  • 需要考虑来自其他浏览器的用户如何使用你的网站:智能手机、屏幕朗读器和搜索引擎,举个例子。--一些易用性信息:网页易读性倡议(WAI)和网站508规范(Section508),移动站开发:移动互联网开发者论坛(MobiForge)。
  • 构架:如果在不影响用户的情况下部署升级。有一个或者多个用来更改架构、代码或者内容更新的可用测试或运行环境,确保他们部署的可控性,以防止造成破坏。有一个自动化部署方案,用来提交更改到生产环境。最优的解决方案是结合使用一个版本控制系统(CVS, Subversion等【译者注:为啥没GIT】)或一个自动构造机制(Ant,NAnt等)。
  • 不要直接给用户展现不友好的错误信息。
  • 不要用纯文本的形式呈现用户的Email,否则他们会被垃圾邮件骚扰。
  • 给用户生成的链接加上rel="nofollow"属性,以避免SEO作弊
  • 为你的站点建立合理的限制机制,这一条同时属于安全细则。
  • 理解什么是渐进增强(progressive enhancement)【译者注:与之相对的是优雅降级(graceful degradation)】。
  • 如果一个请求提交成功,请重定向至其他地方,防止用户的重复提交。
  • 不要忘了考虑无障碍阅读,这对网站的优化来讲是一个好主意,而且有些情况下他是法律强制必须有的。 无障碍网页应用(WAI-ARIA)和Web内容无障碍指南2(WCAG 2)在这方面可以帮到你!
  • 不要让用户思考该如何操作

安全

性能

  • 必要时使用缓存,理解并使用HTTP缓存技术HTML5的Manifest技术
  • 图片优化 - 不要使用一个20KB大小的的图片最为重复背景。
  • 学习如何使用gzip压缩内容
  • 合并/链接多个样式表或多个脚本文件以减少浏览器的请求数,并且使用gzip压缩文件中重复的内容。
  • 看一看雅虎高性能站点,有很多不错的点子,包括提高前端性能和他们的YSlow工具(需求使用Firefox、Safira、Chrome、或Opera浏览器)。同时,Google page speed使用浏览器插件)也是一个不错的性能调校工具,他同时也会优化你的图片。
  • 针对小并且相关的图片使用CSS image sprite技术
  • 访问量大的站点需要考虑将不用内容分至不同的域名下。
  • 静态内容(如图片、css、js脚本还有不需要cookie的普通内容)应该被分配到一个不使用cookie的域名下,因为一个域名下的所有cookie和子域下的cookie将会被包含在所有对应的域名下。一个好的主意是使用CND加速,但是考虑到CND可能会挂,到时候本地的拷贝也会提供服务。
  • 最小化一个浏览器需要渲染一个页面所需要的请求数。
  • 利用工具Google Closure Compiler最小化你的js文件,还有其他的最小化工具
  • 确保有一个favicon.ico在服务器的根目录,就算html里没有提到他,浏览器也会自动请求他。如果你没有一个favicon.ico,那么会导致很多的404错误,并浪费带宽。

SEO

  • 使用搜索引擎友好的URL,如使用www.phpgao.com/technical_details.html,而不用www.phpgao.com/index.php?p=XXX
  • 将你的#变为#!,然后再服务端使用$_REQUEST["escaped_fragment"]接收google机器人发来的请求,换句话说,google会把./#!page=1变为?_escaped_fragments_=page=1。同时,针对使用火狐beta4或者Chrome浏览器的用户,使用history.pushState({"foo":"bar"}, "About", "./?page=1");,是一个不错的选择。这样的话即使浏览器的地址栏有变化,但是页面不会重新加载。这样就允许你使用?代替#以保留动态内容,同时告诉服务器当你通过邮件发送的链接到底是什么页面,同时 ajax不需要额外的请求。【这一段如果看不懂:请参考URL的井号
  • 不要给你的链接添加诸如**点我**的说明。这样做是在浪费SEO优化的机会,同时让读者不容易理解。
  • 需要提供一个XML网站地图,最好使用默认的地址/sitemap.xml
  • 当你有多个URL指向相同的页面,请使用[指出你需要强调的页面,这个问题可以在Google Webmaster Tools被找到。
  • 使用谷歌站长工具Bing站长工具
  • 一开始就是用Google分析(或者一个开源分析工具,例如Piwik)。
  • 了解robots.txt和搜索引擎爬虫的工作机制。
  • 在(www.phpgao.com)或(phpgao.com)之间选择一个,然后使用301重定向将域名重定向到主域名,以防止分权。【博主选用了带www的域名www.phpgao.com,所以访问不带www的域名phpgao.com会被301重定向】
  • 要知道有一些不守规矩的爬虫。
  • 如果你有一些非文本的内容,可以借助Google's sitemap extensions for video 等工具。

技术

  • 理解HTTP,诸如GET,POST,sessions,cookies还有“无状态”的含义。
  • 使用符合W3C规则的XHTML/HTML + CSS页面并确保他们通过验证。此行的目的是避免出现浏览器的怪异模式,同时作为一个奖励,它会更加兼容非传统的浏览器,如屏幕朗读器和手机设备。
  • 理解js在浏览器中如何工作【dom原型】。
  • 理解js、样式表和其他资源如何被载入并解析为一个页面并考虑他们对渲染性能的影响。除非你在分析应用或者使用html5-shims做测试,否则把你的脚本放在html的最后是一个不错的选择。
  • 理解js的沙盒的工作机制,尤其是你在使用iframes的时候。
  • 意识到js是可以被禁用的,而Ajax也仅仅是一个扩展功能,而不是基准功能。尽管大部分用户多ajax置之不顾,但是要记住无脚本已经越来越流行,移动设备也可能不会像你期待的那样运行,并且Google在索引你的站点时几乎不会运行你的JS脚本。
  • 了解301和302重定向的区别(这也是一个SEO论题)
  • 尽可能的掌握你的产品部署平台。
  • 考虑使用样式表重置或者normalize.css.
  • 考虑js框架(jQueryMooToolsPrototypeDojoYUI 3),他们会屏蔽很多不同浏览器使用JS操作DOM的差异。【简化操作,屏蔽差异】
  • 同时考虑到渲染性能和js框架,建议使用诸如Google Libraries API的公共服务库载入框架,好处是浏览器在已经缓存的情况下不需要在从网站下载。【如果每个网站都是用公共库,命中率将大大提高】
  • 不要重复造轮子。再做任何事情之前先google之,看看有没有合适的组建或者已经实现的例子。有99%的几率你需要的功能已经被实现并开源。
  • 另一个方面,在你最终决定需求之前,不要一开始就上很多个库。尤其是针对客户端,最重要的是轻量、快速和灵活。

Bug修复

  • 你必须知道这个事实,纵观整个软件周期,你将花费20%的时间写代码,剩下80%的时间都在维护他,所以好好码吧!
  • 建立一个良好的错误报告解决方案。
  • 有一个客户反馈系统。
  • 将应用的工作原理写成文档,以便作为将来支持和运维的参考。
  • 有计划行的备份你的站点!(同时确保他们是可恢复的备份)Ed Lucas的回答中包含了一些建议。建立一个恢复机制,而不是备份机制。
  • 使用版本控制系统保存你的文件,如SubversionMercurialGit.
  • 不要忘了做验收检测。Selenium可以帮你的忙。
  • 确保你有足够的空间保存log4j, log4netlog4r生产的日志。如果你的生产环境出错,你可以用日志找到问题的根源。
  • 记录日志时请确保你同时记录了可处理和不可处理的错误。汇报/分析日志,他将会告诉你系统哪里出了问题。

typecho的出现让我终结了使用多年的WP,小巧的体积,不错的速度

markdown支持

如果你还不懂markdown语法,请参考markdown语法

由于typecho使用了md语法,那么强烈推荐这篇文章,为你的博客加入目录功能

伪静态

如果想让你的博文地址变成这个样子www.phpgao.com/typecho.html,那就需要开启地址重写功能,俗称伪静态。

这样需要在新链接形式和旧链接形式间做一些转换,而转换的规则就定义在.htaccesshttpd.ini文件里!

linux的下的.htaccess可以直接参考WP的配置,而windows下的IIS请参考如下配置,将下面的代码拷贝至httpd.ini文件,放置到web根目录下

[ISAPI_Rewrite]

# 3600 = 1 hour
CacheClockRate 3600

RepeatLimit 32

RewriteRule ^/(admin|usr)/(.*) /$1/$2 [L]
RewriteRule ^/(.*).html$ /index.php/$1.html [L]
RewriteRule ^/archives/(.*) /index.php/archives/$1 [L]
RewriteRule ^/category/(.*) /index.php/category/$1 [L]
RewriteRule ^/author/(.*) /index.php/author/$1 [L]
RewriteRule ^/([0-9]+)/([0-9]+)/$ /index.php/$1/$2/ [L]
RewriteRule ^/tag/(.*)/$ /index.php/tag/$1 [L]
RewriteRule ^/search/(.*)/$ /index.php/search/$1 [L]
RewriteRule ^/(.*)page/(.*) /index.php/$1page/$2 [L]
RewriteRule ^/(feed.*) /index.php/$1 [L]
RewriteRule ^/action/(.*) /index.php/action/$1 [L]
RewriteRule ^/(.*)comment /index.php/$1/comment [L]
RewriteRule ^/sitemap /index.php/sitemap [L]
RewriteRule ^/go/(.*) /index.php/go/$1 [L]

一定要注意不要同时存在htaccess和httpd.ini两个文件,否则网站会莫名其妙的打不开!

插件

使用了插件后,如果插件为系统添加了一些路由,并且很不幸你的博客像我一样开启了伪静态,那么就需要在伪静态文件中添加对应的路由,把他放倒/index.php后面即可。

这里使用了一点点正则表达式的概念,如果不懂可以参考这篇文章正则表达式教程

地址重写的原理很简单,当一个请求符合RewriteRule后面的地址规则,就按照替换规则生成最终的URL,而整个过程对用户是透明的,URL地址也没有变化。

如果你的sitemap插件总是不生效,那一定要好好检查一下伪静态的设置!

什么是toc?

[toc]

table of contents 即文章目录

toc有什么用

废话,你说目录有啥用,方便查找呗

使用typecho的TX,一定会一点markdown吧,在文章中如果出现##this's h2 tag##,会被程序转换为

this's h2 tag

一个h标签就好比一本书的各个章节,如果我们能把他们清点一下,组成一个目录输出,岂不是妙哉!

TOC如何使用

简单到不能再简单,在你想插入目录的地方放一个[toc][TOC]即可(推荐大写)!

[TOC]必须处于顶格

typecho中的markdown

typecho的源代码中已经使用了激进的MarkdownExtraExtended类来转化md文件,为什么说他很激进呢?因为他扩展了标准的markdown,添加了很多个性化的语法,如直接给元素添加id或者class,还有脚注、缩写词等,用起来确实很爽!但需要注意的是:太多的非标准语法可能会带来移植性差的问题

具体的语法参考请看这里php Markdown Extra

如何使typecho支持toc

要使typecho支持toc需要替换位于源程序中的/wwwroot/var/文件夹下的MarkdownExtraExtended.phpMarkdownExtraExtended.php

原理

这个文件的作用就是为typecho提供md2html的作用,我修改了MarkdownExtraExtended类的__construct方法,为block_gamut数组添加了 doToc 处理模块,并把优先级降到最低。

转换细节位于doToc_doToc_callback中,在此不作赘述。

不完美的地方

  • 要是能加入一个锚点之间平滑滚动的效果就更完美了,改天写个插件弄一弄
  • 在首页也能看到目录,改天看看源代码研究一下,看能不能解决
  • 希望后台加一个选项,自动生成目录,这个比较麻烦,以后看情况解决