服务器

partyline优化建议

安装浏览器扩展测试

chrome扩展: https://developers.google.com/speed/docs/insights/using_chrome

图片、css、js静态资源缓存时间

除对缓存有特殊要求的资源外, 资源的缓存时间使用expires响应头, 设置为一周以上,一年以下

调整CSS结构加速首屏呈现速度

提取并内嵌关键的css样式,延迟加载次要样式(在首屏呈现后加载)

将需要在首屏加载时使用的样式内嵌在<style> 内,次要样式使用js加载,如:

<html>
  <head>
    <style>
      .blue{color:blue;}
    </style>
    </head>
  <body>
    <div class="blue">
      Hello, world!
    </div>
    <script>
      var cb = function() {
        var l = document.createElement('link'); l.rel = 'stylesheet';
        l.href = 'small.css';
        var h = document.getElementsByTagName('head')[0]; h.parentNode.insertBefore(l, h);
      };
      var raf = requestAnimationFrame || mozRequestAnimationFrame ||
          webkitRequestAnimationFrame || msRequestAnimationFrame;
      if (raf) raf(cb);
      else window.addEventListener('load', cb);
    </script>
  </body>
</html>

减少首屏内容大小:
https://developers.google.com/speed/docs/insights/PrioritizeVisibleContent

优化css推送:
https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery

精简压缩html,css,js

参考:https://developers.google.com/speed/docs/insights/MinifyResources

图片压缩

  • 图片格式选择:png格式各方面优于gif , 尽量使用png替代gif格式的图片,仅对简单图像,如小于10x10像素或少于三种颜色的图像。对照片类图片使用jpg格式,不要使用bmp或者tiff格式。

需要动态处理的图片(如新闻图片),可以使用在程序内调用对应的上述外部程序,如上传图片成功后,php中可使用execsystem等函数调用jpegtran或optipng操作图片,如果能找到使用编程语言存在精简压缩处理图片的类库或函数,请使用类库或函数处理更好。

固定的图片如css样式图片,背景图片,icon等,可以直接使用 chrome扩展 保存处理后的图片或对应压缩工具处理过的图片来替换。


服务器架构方案,安装服务器模块自动优化

pagespeed有服务器自动优化模块,当前只支持nginx和apache。

在源服务器跟squid之间加入一层(或者直接使用nginx或者apache做反向代理),放入一个nginx(安装ngx_pagespeed模块)服务器,为节省带宽,最好是跟squid在同一服务器或同一内网,nginx作为源服务器的反向代理,squid作为nginx的反向代理和缓存服务器。缺点是占用部分服务器资源。响应时间可能略有增加。

ngx_pagespeed能完成基础优化。这是测试站点得分,与设想架构不同的是,这是在squid外包装了nginx作为反向代理。测试服务器在北京,存取香港服务器速度很慢,因而响应时间一项得分表现不佳

文件系统损坏原因

原因:
关于昨天服务器文件系统损坏的原因,我怀疑可能是这样的,上周给服务器装了个ngx_pagespeed,一个用来提高网站性能的nginx模块,它运行时产生大量的cache文件(按默认设置放在系统盘的/var/目录上)。网站高访问量时会对cache文件进行高速读写,可能这样导致系统盘的文件系统损坏。

现在新服务器上把这些cache放在单独的临时文件系统分区,跟系统盘分离了。

Windows批处理备份mysql

服务器使用windows2008rc,用批处理写一个mysql的备份脚本,放到Windows计划任务,每天零时执行。

  • 使用mysql自带的 mysqldump 命令备份整个数据库
  • 使用好压的命令行压缩
  • 保留一周备份文件
  • 写入日志

详细代码如下:

@echo off
set "ymd=%date:~,4%%date:~5,2%%date:~8,2%"
set storeDir="F:\databases\%ymd%"
set /A keepFromDay=%ymd%-7

md %storeDir% 2>nul
"E:\xampp\mysql\bin\mysqldump.exe"  -u用户名 -p密码 --lock-tables   --all-databases > %storeDir%\db.sql 2>nul
echo Haozip loading...
cd /d %storeDir%

"C:\Program Files\HaoZip\HaoZipC.exe" a -tzip db.sql.zip db.sql
del /q db.sql

rem del 7 days backup files
@echo off

for /f %%i in ('dir /b ..\') do (
   if %%i LSS %keepFromDay%   (
    echo deleting %%i 
    rd /s /q "F:\databases\%%i" 
   )    
)

echo Finish at  %date% %time%  >> ../backup.log

php-fpm优化

当前内存使用情况

1
2
3
4
5
[root@cpp22 ~]# free -m
			total       used       free     shared    buffers     cached
Mem:          7870       7736        134          0       1009       5010
-/+ buffers/cache:       1716       6154
Swap:         2047          0       2047

查看php-fpm进程是否够用:

使用

1
netstat -napo |grep "php-fpm" | wc -l

查看一下当前fastcgi进程个数,如果个数接近conf里配置的上限,就需要调高进程数。

php最大执行时间的设置

如果file_get_contents请求的远程资源如果反应过慢,file_get_contents就会一直卡在那里不会超时。我们知道php.ini 里面max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的request_terminate_timeout参数。

pm.*的设置

如果设置成static,php-fpm进程数自始至终都是pm.max_children指定的数量,不再增加或减少。如果设置成 dynamic,则php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加, 保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于 pm.max_spare_servers。

windows下ftp自动更新

服务器(windows 2008 RC2)迁移到阿里云后, 原来的ftp自动更新脚本(php脚本,使用了ftp模块的函数)出现问题了,连接到海外的FTP服务器(澳大利亚的主机)后,列目录会出错,具体就是ftp_nlist函数执行超时,无法下载文件,具体原因未知。

当前服务器已开通FTP服务,测试用FTP脚本连接本地FTP没有问题的,于是现在解决方案为:
在本地新建一个帐户,想办法用其他方法将海外FTP的文件同步到本地FTP,将FTP脚本的配置修改为本地连接的帐户,使用同步后的文件更新,这样自动更新脚本的逻辑无需更改。

利用SSH隧道进行反向代理

公司有几个网站要迁移到阿里云,数据已经被我迁移过去了,域名还在备案,使用未备案的域名访问,阿里云是会直接封锁的,万恶的备案!!!

公司有一个临时方案,把域名和数据暂时放在北京office的一台Linux服务器上,备案通过后再切换到阿里云服务器,但是当把数据弄到临时服务器后,突然发现网站的一个功能模块出现兼容性问题,代码里很多地方是针对windows处理的, 由于开发机和原服务器都是windows系统,在文件目录分隔符系统字符编码等一些地方没有考虑到linux的情形,而且这模块不是我开发的, 代码写得有些凌乱,改了两天也算勉强能用了。