彻底郁闷了,机关算尽,我却一直忘记了可以在php.ini里面设置时区,导致花费了额外的几百块去买VPS,好在我英明神武的选择了月付,浪费的不多,总的来说,于做网站而言,VPS不是一个最好的选择。
一行代码,浪费几百块,这是多么惨痛的血的教训啊!
date.timezone = Asia/Taipei
彻底郁闷了,机关算尽,我却一直忘记了可以在php.ini里面设置时区,导致花费了额外的几百块去买VPS,好在我英明神武的选择了月付,浪费的不多,总的来说,于做网站而言,VPS不是一个最好的选择。
一行代码,浪费几百块,这是多么惨痛的血的教训啊!
date.timezone = Asia/Taipei
刚开始的时候我实在想不出来那帮人有什么理由要把xmarks封掉,很好用的书签同步工具啊,后来我仔细一想,谁让它推出那个site info服务的,你能想象打开一个网站,firefox地址栏下面显示了一大堆客观或者不客观的网址评价么?在中国,简直就是自寻死路,我估计那些洋人怎么也搞不清楚他们为什么被封。学学about.Com,现在已经完全屈服,以前能搜到的绝大部分敏感字眼现在上面都搜不出来(当然是英文版,中文版是国内合作的)。
额,下面说重点,重点是这个书签服务不能用之后呢,我又尝试了几个公用的书签服务,比如Google的书签同步服务,实践证明,效果很差,同步速度很慢,编码问题导致乱码的情况很多,所以,我不得不自己弄一个同步服务器了,好在xmarks有说明书,建立一个自己的书签同步服务器并不是很困难的事情。
英文好的同学可以自行去xmarks网站查询,不过现在它已经被封了,如果你不会翻墙的话(最近封锁严重,TOR基本上没法用,我都改用VPN了)还是看我写的好了,当然,你要替换成自己的域名。
1,在域名服务器端设置一个二级域名foxmarks.hnair.com,同时设置http服务器对这个域打开webdav可写,设置dav用户名为ken,密码为ken。
2,touch一个空文件foxmarks.json在根目录下,设置文件权限为www可读写,这个文件名是固定的,不能修改。
3,在xmakrs的设置选项中,设置使用自己的服务器,书签URL为http://foxmarks.hnair.com/foxmarks.json,用户名和密码为前述设置。
4,开始同步,可以查看一下同步日志,如果不正确,日志中也会有体现的。
要点:一个子域名,一台支持webdav的服务器。
——
[2009-12-05 19:56:52] —— Xmarks/3.3.2 (/Places) starting sync withhttp://foxmarks.hnair.com ——
[2009-12-05 19:56:52] >>> GET http://[email protected]/foxmarks.json
[2009-12-05 19:56:55] >>> Callback ({token:”12472113af9″, commands:[{action:”insert”, nid:”ROOT”, args:{ntype:”folder”, pnid:null, name:”XYZ”, created:1225964511, modified:1259463320, tnid:”fn77nqec-0″, unid:”fn77nqec-1″}}, created:1124284281, modified:1205293426}}], status:0})
[2009-12-05 19:57:01] lcs = 0 scs = 0
[2009-12-05 19:57:01] Success: e
——
之前介绍pscp的文章已经很多了,这里纯属废话一遍,总之呢,简单的说,pscp就是putty套件中一个使用sftp和scp来远程拷贝文件的工具,也就是PuTTY Secure Copy client,由于大家坚信AES-256的牢不可破(其实说不定美国那几爷子早就有了破解算法故意不告诉大家),所以这个Secure还是比较有意义的,既然是远程copy,大家肯定已经了解了这个工具的使用范围,可以用于上传数据:关键性主机的数据更新(因为不允许未加密的数据传输嘛),可以用于推送数据:远程数据备份,之所以这个不叫下载而叫推送,是因为这是主机在上传,不是客户机在上传,也不是客户机在下载。
也许有人更喜欢用通过ssh隧道转发只对本地开放的ftp来 传输文件,毕竟用惯了Windows的人去敲命令行那简直不如让他去死,这种方法在上传数据的时候没有什么不同,可用,而且广泛可用,但在远程数据备份这块,就毫无意义可言了。没有人工干涉的远程备份一般有以下几个原因:
1,服务器所在地没有备份主机(备份主机硬盘满同理,汗),远程有备份主机。
2,需要备份的主机是Ghost host,额,也就是说,它的IP在变动。
3,需要备份的文件是随机生成的,备份主机无从知晓它生成了什么东西……汗。
远程备份数据是一个很折衷的办法,合理的网络布局应该把所有的服务器放在一个机房,而中国特色的网络利益人为分割,导致了广州到北京的距离比广州到美国还要远,当然大家理解为崇洋媚外也没什么问题,花大力气建设中美海底光纤而不花大力气建设国内互联互通的光纤,不是崇洋媚外是什么?扯得太远了,下面以hnair.com域的备份脚本来解释一下pscp的应用:
——
#!/bin/sh
cd /home/ken/babyken
tar –exclude=hnair.com/files/media -cf hnair.com.tar hnair.com
bzip2 -9 hnair.com.tar
mv hnair.com.tar.bz2 hnair.com.$(date +%Y%m%d-%H%M%S).tar.bz2
mv *.bz2 /home/ken/babyken/backup
cd /home/ken/babyken/backup
/usr/local/bin/pscp -i priv_key.ppk *.bz2 [email protected]:/disk3/backup/node68
rm -f hnair*.bz2
——
首先呢自然是切入网站根目录上级,进行打包操作,由于这个MP3文件太大,我就不备份音乐了,在tar的时候把文件夹exclude,可以减少百分之八十的数据总量,也就是说,网站程序和日志大概只有接近两百兆的样子,打包完成后呢就进行压缩操作,使用bz2进行压缩级别最高的压缩……但是我发现文件似乎也小不了多少,回头用7zip压缩看看,接下来把压缩好的文件按照当前日期和时间重新进行命名,也就是那串(date +%Y%m%d-%H%M%S),Unix shell中的时间格式比Windows cmd中的时间格式清晰明白多了,然后呢,就是把已经压缩好并且按照时间命名的文件推送到远程服务器上去,这个命令是:
pscp -i priv_key.ppk *.bz2 [email protected]:/disk3/backup/node68
这个命令的意思呢,就是把当前目录的bz2文件全部推送到主机node66.hnair.com上的/disk3/backup/node68目录中去,使用的登录验证方式是密钥对验证,登录用户名字是ken,密钥的名字是priv_key.ppk,当然,你也可以用密码来验证,考虑到用户密码定期会进行更改,定期去修改这个脚本中的用户密码是一个很重复的工作,使用密钥对就很简单了,甚至可以分发十几个密钥下去给不同的用户,不需要用户的时候直接在备份主机上删除密钥对就可以(似乎和密码登录也差不多……)。
当然了,这一切的前提是你必须先安装了putty,因为putty在*inx操作系统中不是标准配置,如果需要推送文件到不同的主机,你甚至可以调用putty-agent,将密钥对全部装进去。
下面简要的介绍一下另外一个小工具,plink,这个小工具看起来似乎没什么用处,但其实用处大着呢,很早之前我们讲过使用ssh隧道转发可以突破移动WAP网关对于浏览器的封锁,不久之前我们讲过很多管理员喜欢在Windows下使用ssh隧道端口转发来访问只对本地开放的ftp服务器以便传输文件,这个小工具就可以满足在*nix下进行端口转发的需求,更准确的说,plink就是*nix下的putty,当然了,没人会在*nix下去刻意使用putty,NND不是脑子进水嘛,只讲一下Windows下的使用,只需要一行命令,就可以实现端口转发,使用代理服务器或者传输文件啦!
plink -i priv_key.ppk [email protected] -L localhost:3128:localhost:3128
这个命令的意思是,用户ken使用密钥对priv_key.ppk登录到主机node66.hnair.com,并将服务器上只对本地开放的3128端口转发到我的电脑上来,然后我们设置浏览器的代理服务器为本地的3128端口,就可以通过服务器去进行访问啦,当然你可以转发其它的端口,诸如ftp呀,www呀,如果你在电信,访问联通的服务器速度奇慢,而这台服务器是多线,你甚至可以将联通服务器的SSH端口转发到本地来,以便快速的管理,而命令自然不会是-L了,而是-R。
不要忘记第一次连接主机的时候存储fingerprint哦~
公司邮件服务器突然出问题,症状表现为反映迟钝,服务器上查看表现为正在往外狂发垃圾邮件……汗,我以为中毒了,但看起来不像是内部的问题,经过我英明而又缜密的思考,MD,原来是防火墙的问题,当然,也不全然是防火墙的问题,配置也有一定的关系。
问题起因:邮件服务器在局域网,通过IP映射至公网,拥有一个局域网IP192.168.1.3,一个公网IP60.12.34.56,在未更换防火墙之前,已经将邮件服务器主机划分到防火墙外,从容而又奔放地直面那惨淡的互联网。机房在更换防火墙之后,未将邮件主机划到防火墙外,而是使用了默认的IP转发的方式,相信用过双线路由的同志都知道我说的是什么意思,所以,邮件服务器接收到的客户端IP地址均为192.168.1.1,问题就出来鸟……
在Postfix的配置文件中,有一条默认配置文件,
smtpd_recipient_restrictions = permit_mynetworks
这条配置文件本意可以理解为便于做邮件服务器集群,为relay电邮负载均衡之佳选,但是,这个192.168.1.1相当不幸的处于默认的同网段,网关嘛……所以,Postfix就不加以验证地转发了…… 我日…….
之前用过很多种不同的方法来设置虚拟主机,包括放置xml配置文件等等,其实那方法是最难用的,这里给出一个我认为比较完美的方法,
1.在server.xml中设置虚拟主机项,添加host属性在engine中,我们以www.qq.com为例,如下:
<Host name=”www.qq.com” appBase=”/usr/local/webapps/qq.com”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>
更多设置可自行添加,包括日志等等。
2.在这里我们看到,appbase是”/usr/local/webapps/qq.com”,但是,此目录不是程序根目录,我们在”/usr/local/webapps/qq.com”目录下建立一新目录ROOT,然后将程序放入,才能保证虚拟主机正常启用,也就是说,程序根目录是/usr/local/webapps/qq.com/ROOT。
3.在本地/etc/hosts文件中设置www.qq.com对应IP为127.0.0.1
Jboss的EJB应用如果在防火墙后面,通过端口1098和1099调用,需要另外打开3873端口供socket调用,同时需要修改rmi-server地址为外部IP地址或域名。
配置文件一共需要修改四处,下面以域hnair.com内,防火墙后主机IP192.168.1.25为例,
1.首先修改jboss-service.xml,在ejb端口1098附近,修改CallByValue值为true
<attribute name=”CallByValue”>true</attribute>
2.然后修改ejb3.deployer中jboss-service.xml文件,主要是添加域名到3873的调用中
——
<mbean code=”org.jboss.remoting.transport.Connector”
name=”jboss.remoting:type=Connector,name=DefaultEjb3Connector,handler=ejb3″>
<depends>jboss.aop:service=AspectDeployer</depends>
<attribute name=”Configuration”>
<config>
<invoker transport=”socket”>
<attribute name=”numAcceptThreads”>1</attribute>
<attribute name=”maxPoolSize”>300</attribute>
<attribute name=”clientMaxPoolSize” isParam=”true”>50</attribute>
<attribute name=”timeout” isParam=”true”>60000</attribute>
<attribute name=”serverBindAddress”>${jboss.bind.address}</attribute>
<attribute name=”serverBindPort”>3873</attribute>
<!– that’s the important setting –>
<attribute name=”clientConnectAddress”>hnair.com</attribute>
<attribute name=”clientConnectPort”>3873</attribute>
<attribute name=”backlog”>200</attribute>
</invoker>
<handlers>
<handler subsystem=”AOP”>org.jboss.aspects.remoting.AOPRemotingInvocationHandler</handler>
</handlers>
</config>
</attribute>
</mbean>
——
3.设置java启动选项,添加rmi-server的外部地址和禁用本地域名解析到启动脚本
Windows脚本例:set JAVA_OPTS=-Djava.rmi.server.hostname= hnair.com -Djava.rmi.server.useLocalHostname=false
Unix脚本例:添加到jboss启动配置文件run.conf中即可。
4.用run.sh –host=192.168.1.25启动服务或添加–host=192.168.1.25到启动脚本。
尝试了一把nginx和php-fastcgi,感觉速度好像是快了点,也许是错觉,不过以nginx四百多K的体积能做到这样我觉得相当不错,简要写一下配置。首先当然是安装nginx,不管你是编译还是二进制,这个没有太多可以说的,差不多,然后呢是编译php,在apache下面安装习惯了,一直没把–with-apxs去掉,我就说怎么一直不给生成那个php-cgi文件呢,搞了半天是不能同时使用的,靠,configure的时候又不提示一下,无效开关应该要提示才对的嘛,接下来是修改一下php.ini,修改说明如下:
—
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP’s
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting
; this to 1 will cause PHP CGI to fix it’s paths to conform to the spec. A setting
; of zero causes PHP to behave as before. Default is 1. You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
cgi.fix_pathinfo=1
—
倒数第二步呢,当然就是启动php-cgi server,使用命令行启动:php-cgi -b 127.0.0.1:9000 使得其监听在本地9000端口,最后一步就是修改nginx配置了,MMP的配置文件里面居然还有语法,所以不流行撒,看apache的配置都形成了一个规范,配置文件是这样的,其它部分我跳过了,不用修改,只写下修改的虚拟主机部分,我们以bbs.hnair.com为例:
—
###############bbs.hnair.com######哈利路亚#########
server {
listen 80;
server_name bbs.hnair.com;
location / {
index index.html index.htm index.php;
root /usr/local/www/bbs.hnair.com;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/bbs.hnair.com/$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
}
}
—
当然了,一些细小的配置,例如gzip压缩,rewrite,用户验证等等,我再研究下了来,可是想了想,按照web应用的细分,这种结构是为了极大负载设计,那么就不应该有rewrite,用户验证这些东西,simple is the best~
我考虑了一下Mysql数据库服务器负载均衡的架构,发现大多数应用似乎没有加载mysql-proxy,当然本意是为企业版本开发的,那么在这之前的load balancing,他们是用什么来做的呢?使用管理节点+集群的方式是一种,不过我估计PF中的address pools应该也可以,而且PF的方案更有通用性,但是设置过于复杂,且牵涉到具体网络结构,mysql-proxy是一种全新的方案,大家可以把它和mysql的关系理解为squid和apache的关系,不过mysql-proxy并不包含cache的部分,这部分由第三方连接池做了,当前的web应用,瓶颈其实都在数据库,奥运门票预订网站的垮掉,正是这种瓶颈的体现,并不是说在前端没有瓶颈,而是数据库的瓶颈尤为明显。
Mysql-proxy是一个很小巧的程序,只需要一行命令即可执行,如果仅仅是代理的话:
mysql-proxy –proxy-address=202.202.0.10:3389 –proxy-backend-addresses=10.0.0.2:3306
不过很显然,这样做就没办法在mysql中限制访问数据库的IP了,因为都是本地的访问,如果是mysql集群,那么可以用下面的命令来进行负载的均衡:
mysql-proxy –proxy-address=202.202.0.10:3389 –proxy-backend-addresses=10.0.1.2:3306 –proxy-backend-addresses=10.0.1.3:3306 –proxy-backend-addresses=10.0.1.4:3306
mysql-proxy是一个简单的程序,因为它仅仅是做一个代理,如果加上Master-Slaves的方式来做集群,然后把数据库的读写分离,应该是效率非常高的,但是,很多程序的读写并不是分离的,mysql-proxy中指定了一个参数,可以read-only,很大程度上这个参数是多余的,因为在mysql中去统一管理读写的不同用户,更为合理,如果mysql-proxy能把read-only和write-only分开,那么就完美了,把read-only请求转发到Slaves,把write-only请求转发到Master,使用一个端口,一个用户,就能够读写到不同的数据库服务器。
MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication. Its flexibility allows for unlimited uses; common ones include: load balancing; failover; query analysis; query filtering and modification; and many more.
百度的MP3搜索流量果然是很大,一直没有找到合适的屏蔽方法,终于找到了一个较为合适的方法,依然是Setenv,不过和限制reffer不同,限制的是UA,这下大家明白为什么百度的MP3搜索在前年从直接网页点击改为了弹窗再点击,我原本以为是出于展示更多广告的目的,其实不是,是百度为了防止这些个网站封掉它的来源URL,将每个弹窗随机IP reffer,要封掉一堆reffer IP,简直就是疯了,虽然也是可行的,但是不可靠。
以下方法依然不够可靠,因为直接试听的话,还是可以收听的,只是不能下载,不过这至少达到了一个高尚的目的:音乐只能用来听~
# Play by mediaplayer
BrowserMatch “RealMedia” local_media=0
BrowserMatch “Media Player Classic” local_media=0
BrowserMatch “WMFSDK” local_media=0
BrowserMatch “Windows-Media-Player” local_media=0
BrowserMatch “NSPlayer” local_media=0
<FilesMatch “\.(mp3|wma|wmv)”>
Order Deny,Allow
Deny from all
Allow from env=local_media
</FilesMatch>
1.安装cups
cd /usr/ports/print/cups && make install clean
2.为相关文件和设备赋权
chown -R cups:cups /usr/local/libexec/cups
chown -R cups:cups /dev/ulpt0
chown -R cups:cups /dev/unlpt0
3.修改cupsd配置文件
cupsd.conf:修改可调用打印机的网络范围,可修改为192.168.1.0/24
<Location />
# Allow shared printing…
Order allow,deny
Allow 192.168.1.0/24
</Location>
mime.types,mime.convs:去掉application/octet-stream前面的注释,以便接受远程打印文件。
4.下载打印机相应的驱动ppd安装到程序。
5,为客户端添加打印机,使用控制面板添加网络打印机,将URI直接填入,例如:http://192.168.1.1/printers/1600
一台网络打印服务器硬件,少则数百元,多则上千元,真是暴利~