Apache and PHP FastCGI

虽然Nginx加上php有相当优秀的表现,但是有时候,基于业务需要,不得不用ApachephpApache下有两种运行方式,一种是编译成Apache的模块,一种是以cgi方式运行,cgi则可细分为fastcgi,以模块方式运行,无论Apache还是php出现安全漏洞,需要升级软件版本,都需要同时重新编译二者,这是一个很没有统筹科学的态度,以普通cgi方式运行,配置简单,但比之于fastcgi效率不高,每个脚本执行都需要reload script和php.ini,基本上,这个意思就是说,脚本缓存是无效的,所以,我们需要fastcgi。

需要说明的是,在当前php5.3.6版本中,php-fpm已经包含在源代码中,只需要在编译的时候加入相应参数: –enable-fpm,安装完成后,拷贝/src/php-5.3.6/sapi/fpm/init.d.php-fpm 到/usr/local/bin/,然后chmod +x 就可以了

Usage: /usr/local/bin/init.d.php-fpm {start|stop|force-quit|restart|reload}

当然,你知道配置文件默认放在/usr/local/etc/php-fpm.conf,修修改改就可以start了!

php的配置很简单,但Apache的mod_fastcgi是需要单独下载编译的:
1,下载mod_fastcgi:http://www.fastcgi.com/dist/mod_fastcgi-current.tar.gz
解压缩了来安装到Apache里面去,例如,我们把Apache安装在了/usr/local/httpd:

tar zxf mod_fastcgi-current.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
make install top_dir=/usr/local/httpd

2,在配置文件中启用mod_fastcgi,例如我们可以包含一个配置文件在extra目录中,起个名字叫httpd-fastcgi.conf,这个例子呢,我是把php-fpm的socket放在/tmp目录下的:

LoadModule fastcgi_module modules/mod_fastcgi.so
ScriptAlias /php-bin /usr/local/bin
AddHandler application/x-httpd-php5 php
Action application/x-httpd-php5 /php-bin/php-cgi
FastCgiExternalServer /usr/local/bin/php-cgi -socket /tmp/php.sock

当然,基于安全考虑,可以将配置文件单独放在不同的虚拟主机中。

在Centos上安装独立运行的subversion

市面上大多是使用Apache来建立一个仓库,但是,不用apache的项目其实是很多的,所以建立一个独立运行的Subversion仓库是很有必要的,建立一个独立运行的Subversion仓库相当简单,几步操作就可以完成。

首先当然是安装:
yum install subversion

接下来创建一个系统用户并修改它的口令:
useradd svn
passwd svn

然后我们切换到这个用户,创建仓库目录:
su svn
cd
mkdir repositories

对仓库目录进行初始化,创建第一个项目:
cd repositories
svnadmin create myproject

然后,让我们修改一下这个项目的参数,将conf目录中的svnserve.conf配置文件中被注释掉的两项修改如下,很显然,第一项的意思是允许验证用户写入,第二项的意思是指定密码验证方式:
auth-access = write
password-db = passwd

然后我们添加用户,修改conf目录下的passwd文件就可以了,这个文件中,用户名和密码都是明文的,例如我们添加一个用户gfw,密码是fuckfbx,格式应该如下:
[users]
gfw = fuckfbx

然后就很简单了,运行这行命令,或者将这行命令加入rc.local以便开机启动:
svnserve -d -r /home/svn/repositories

如何部署WordPress到Amazon云主机

在过去的10年,架设一个大型网站是一个非常艰巨的任务,那可不是非专业人士可以完成的。现在好了,亚马逊开放了他们的服务器架构,一切都改变了。 计算机硬件被移动到了云端,普通站长和开发人员都可以利用亚马逊的硬件和网络资源来运行自己的应用。在本文中,我们将把WordPress博客安装到云端。


介绍

大多数博客和小型企业站点都托管在共享主机上面,通过固定的月租费用来获得预装软件和特定功能的使用。大多数情况下,共享主机是一个完美的解决方案,但是将你的博客安装在Amazon云端有很多好处是值得我们考虑的:

  • 更容易升级更新. 在Amazon云端创建一个新服务器可以在数分钟内完成。使用该服务,你的网站将有能力应付突如其来的流量爆发,比如你的博客文章被推荐到了Digg或者Reddit的首页,你可以添加更多服务器并平衡负载。
  • 经济有效的大规模服务能力. 如果你的站点吸引了大量的用户,并且最终超过了主机的正常伺服能力,Amazon Web Services 将给你一个经济有效的办法来设计一个符合你的需求的网站服务架构,而你并不需要去雇佣一个完整的网络运作团队来安装和管理网络。这也是许多 Facebook开发人员选择Amazon云服务器的原因。
  • 完善的安装与设置. 在运行WordPress时,这一点可能不是太重要,但如果你想使用PHP和MySQL之外的一些东西来建设你的下一个项目,则没有必要请求主机公司的帮助,你可以就像在你自己的服务器上一样安装你所需要的软件。

是否把WordPress站点放到亚马逊云端由你的博客流量决定,并且你可以根据你的实际需求来决定服务器配置。通过下面的指南,你可以了解到怎样迅速的在Amazon Cloud上设置和运行服务器。 Continue reading 如何部署WordPress到Amazon云主机

创建一个加密的squid代理通道

众所周知,在大陆不能自由的访问互联网,为此人们想出了各种办法,真是八仙过海各显神通,然而,很多办法是既绕圈子,又没有普遍应用的意义,使用ssh tunnel实际上效率是很低的,因为ssh不是为了这个目的而开发,今天我们要介绍的是具有普遍的意义的代理服务器squid和stunnel。

其实这二者组合并不新鲜,也并不罕见,下面说说这个组合的 应用条件:

1,一台运行在自由世界的服务器,或者虚拟机。
2,这台服务器上安装了squid。
3,当然,你必须要可以从中国大陆连接它。

首先我们来配置安装好的squid,很多旧的案例使用stunnel加密squid端口,然后在客户机上使用stunnel解密,这是多走了一个弯路,squid自身已经支持加密的代理方法,在服务器上,我们根本就不需要运行stunnel,例如我们要将这个加密的代理运行在服务器IP地址为216.218.186.2的443端口,具体配置参数如下:

https_port 216.218.186.2:443    cert=/etc/squid/hnair.com.crt key=/etc/squid/hnair.com.key

其中,hnair.com.crt和hnair.com.key是使用openssl生成用于加密的数字证书和密钥,关于自行生成数字证书的方法,可参考如下:

openssl req -new > hnair.com.csr

openssl rsa -in privkey.pem -out hnair.com.key

openssl x509 -in hnair.com.csr -out hnair.com.crt -req -signkey hnair.com.key -days 3650

然后启动squid即可。

接下来,我们需要对客户端进行配置,不管你是Windows还是Linux,都可以到这里下载:ftp://ftp.stunnel.org/stunnel/

将相应的stunnel压缩包解压缩或者安装,添加一个配置文件(stunnel.conf)至程序的目录:

client = yes
[ssl2http]
accept = 127.0.0.1:8080
connect = 216.218.186.2:443

注意,有些Linux发行版中,例如Ubuntu,在进行apt-get安装stunnel的时候,stunnel v3和v4都会安装上去,此时应该使用stunnel4来运行,直接运行 /usr/bin/stunnel4 即可,在Windows中不存在这个问题。

然后,我们将浏览器的代理服务器设置为本机的8080端口,也就是127.0.0.1:8080,即可使用一个加密的通道,自由的访问互联网了,实际上,这个方法被广泛应用在XX功的网站上,只不过他们用的是Apache做反向代理,因为上面还有他们的网站,虽然总是胡说八道来着,由于我们不需要在上面运行网站,所以squid代理服务器是最佳选择。

我很好奇为什么那么多人在卖ssh代理,却没有人卖加密的squid,在squid上添加用户身份验证,即可达到类似的效果,究其原因,其实还是有两个:

第一,ssh代理可以实现socks请求转发,有些应用可能需要。

第二,ssh代理本身效率不高,可以防止用户滥用,流量超荷,而加密的squid如果没有流量限制,那显然是一场悲剧。

自建xmarks书签同步服务

刚开始的时候我实在想不出来那帮人有什么理由要把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
——

尝试了一把nginx和php-fastcgi

尝试了一把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~

封掉百度MP3搜索下载

百度的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>

 

NSIS 脚本浅析

一直以来,B/S程序由于其结构的原因不能像安装WINDOWS程序那样使用setup来进行安装,一般都是由开发人员配置好WEB运行环境,再导入数据库(或者由WEB的安装程序完成此部分),这样一般来说够用了,再如果是不懂开发的人配置这些环境就麻烦了,如果能像安装WINDDOWS程序那样,一路回车法就能安装成功,那就更帅了。

前几天由于公司的项目需要,我小小的的研究了一下NSIS,为什么选它呢?因为它是使用脚本来定制安装程序的,非常灵活,就是要学习一下它的脚本语言,多看一些例子就会用了。

先说一下制作的原理,系统的环境是apache1.3, php5.1.4,mysql5。这几个其实都是不需要安装的,在window2000/xp下,直接配置成服务,并启动服务就行了。所以安装过程应该是分为

1.复制文件到指定目录.
2.配置apache和mysql.
3.把apache和mysql安装成服务并启动.

首先下载并安装NSIS,安装后可以到它的example目录下看一下有很多例子程序。右键点示例脚本选择Compile NSIS Script进行编译,在该目录下会生成一个.exe文件,就是生成的安装程序文件。
NSIS的脚本由一些类似PHP和汇编的语法指定组成,还可以定义函数,宏。每个脚本至少有一个Section,名字为Uninstall的以un.开头的Section被认为是卸载时使用的指令集。

下面是安装程序的全部脚本。
SetCompressor lzma
!include “MUI.nsh”

!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP “E:\logo.bmp”
!define MUI_ABORTWARNING
!define APP_NAME “蓝桥OfficeSystem2.0”

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE “SimpChinese”

Name ${APP_NAME}
Icon “${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico”
UninstallIcon “${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico”
DirText “安装程序将安装 $(^Name) 在下列文件夹。$\r$\n$\r$\n要安装在不同文件夹,单击 [浏览] 并选择其他文件夹。”
InstallDir “C:\lqserver”
OutFile “setup.exe”

Section “setup”
SetOutPath $INSTDIR
File /r Apache
File /r mysql5
File /r officesystem2
File /r php-5.1.4
File /r config.js
File /r sc.exe
Call config
WriteUninstaller “uninstall.exe”
CreateDirectory “$INSTDIR\temp”
CreateDirectory “$SMPROGRAMS\${APP_NAME}”
CreateShortCut “$SMPROGRAMS\${APP_NAME}\启动${APP_NAME}.lnk” “http://localhost/”
CreateShortCut “$SMPROGRAMS\${APP_NAME}\卸载${APP_NAME}.lnk” “$INSTDIR\uninstall.exe”
SectionEnd

Section “Uninstall”
ExecWait “$INSTDIR\sc stop apache”
ExecWait “$INSTDIR\Apache\apache -k uninstall”
ExecWait “$INSTDIR\sc stop mysql”
ExecWait “$INSTDIR\mysql5\bin\mysqld-nt –remove mysql”
RMDir /r $INSTDIR
RMDir /r “$SMPROGRAMS\${APP_NAME}”
SectionEnd

Function config
ExecWait “cscript $INSTDIR\config.js $INSTDIR”
#先停止并禁用IIS服务
ExecWait “$INSTDIR\sc stop w3svc”
ExecWait “$INSTDIR\sc config w3svc start= disabled”
#安装apache和mysql服务
ExecWait “$INSTDIR\Apache\apache -k install”
ExecWait “$INSTDIR\sc start apache”
ExecWait “$INSTDIR\mysql5\bin\mysqld-nt –install mysql –defaults-file=$INSTDIR\mysql5\my.ini”
ExecWait “$INSTDIR\sc start mysql”
FunctionEnd

一些指令的解释
SetCompressor lzma 指定压缩方式
!define APP_NAME “蓝桥OfficeSystem2.0” 定义应用程序的名字以便后面使用。
!insertmacro MUI_PAGE_*
这些是安装程序的所有页面,包括欢迎界面,选择目录,安装文件,完成页面。

Name ${APP_NAME} 指定应用程序的名字,语法和PHP有些类似
Icon “${NSISDIR}\Contrib\Graphics\Icons\arrow-install.ico”
UninstallIcon “${NSISDIR}\Contrib\Graphics\Icons\arrow-uninstall.ico”
指定安装程序和卸载程序的图标,$NSISDIR是NSIS的安装目录,不用修改。
InstallDir “C:\lqserver” 默认安装目录
OutFile “setup.exe” 输出的安装程序文件名称
下面的一个section就是主要的安装和配置指令

File /r 解压一个文件夹及下面所有的文件和子目录到安装位置

Call config 调用config函数,这个函数主要是修改配置文件的作用。
WriteUninstaller “uninstall.exe” 生成卸载程序
ExecWait 是执行程序并等待返回,这样可以防止外部程序的运行而影响到NSIS脚本的执行。比如在apache服务的停止的时候,如果服务没停止完,就进行删除文件的操作就会出错。

在修改apache和mysql配置文件的时候我采用了js脚本来完成。因为用NSIS来完成这个功能太吃力了,用JS脚本进行字符串替换还是比较简单的,主要是把一些目录修改为安装目录就可以了。

还有这里使用了sc.exe,这个程序是命令行下管理windows服务的程序,不是系统自带的,可以去microsoft下载,使用它先禁用iis服务,防止和apache发生冲突。另外使用sc启动和停止服务要比用net命令快的多。

配好了Tomcat和Apache

得来全不费功夫啊,Apache2.1里面专门提供了给Tomcat的ajp接口,三行配置就搞定了Apche对Tomcat的代理,而且可以通过 proxy pass进行负载均衡,完美啊,而且实现http请求的负载均衡,也是很简单的事情,2.1里面更加入了多种cache的支持,包括磁盘缓存,内存缓存, 我在想,2.1一旦出了正式版,squid还有用武之地么?

Reffer:http://tomcat.apache.org/connectors-doc/proxy.html
——————————–
The AJP proxy is a new module based on the standard Http proxy it uses AJP instead of HTTP.
<Location />
ProxyPass ajp://localhost:8009/
</Location>

下面需要配置的就是最困难的oracle了,我还得再去读几遍国外各个网站上的资料了来……中文资料不可信,东抄抄西抄抄,结果TMD全部是错的。