让Vranish 传递客户端真实且唯一ip到后置服务器 

首先要说明的是,我的vps是使用varnish作为前置缓存服务器的,后置服务器使用的是nginx 和 hiawatha.前者主要负责 静态文件,而后者则连接php-fpm,处理动态页面.

varnish 监听的是80端口,hiawatha、nginx 分别是81,82.既然有了前置的varnish,自然不想让客户端绕过它直接访问后置服务器,所以我之前做法的是让nginx、hiawatha只监听和允许本地(127.0.0.1、localhost)请求,也就是本地的varnish的请求。

这一点不难做到,通过nginx 的allow、deny 以及 hiawatha 的allowlist 控制符即可达到,见下

#nginx

server {
listen 82;
server_name chinesepaladin.tk;
charset utf-8;
root /home/http/chinesepaladin_tk/;
index index.html index.htm;
allow 127.0.0.1;
deny all;
}


#hiawatha

VirtualHost {
Hostname = chinesepaladin.tk
WebsiteRoot = /home/http/chinesepaladin_tk
StartFile = index.php
UseFastCGI = PHP5
UseToolkit = pw
AccessList = allow 127.0.0.1,deny all
}


而varnish 默认的client ip 就是本身的 server ip(即 127.0.0.1),所以本地访问控制就成功了.

可是,用了一段时间后,问题来了。
由于后置服务器的访客来源都是本地,一直以访客ip作为唯一标识符的wp评分插件——wp-postrating出现问题了,因为来自各个地区的访客都被varnish 标记为了同一个用户——本地访客。

也就是说,一旦有一位访客对某篇文章评了分,之后的其他人都无法再评分了。 囧rz

这个问题很恶心,当我意识到后,我认为很棘手。于是向varnish 邮件列表写了一封求教信,不过收获不大。

终于,在昨天,当我在翻看varnish 的wiki时,我找到了一个大概可行的方案,于是今天我便尝试了一下。

还是与请求对象req有关系,详见下:

if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For ", " client.ip;
#req.http.X-Forwarded-For + ", " + client.ip; 不能加'+',报错。
#wiki 里的内容过期了.
} else {
set req.http.X-Forwarded-For = client.ip;
}
}


把上段配置放在vcl_recv()块里面,就行了.这样的话,后置服务器既不会挡掉来自本地的请求,也不会对不通过varnish的请求放行.最重要的是每个访客现在都有了一个唯一的ip来源.

重新读取配置文件,进入控制台
varnishadm -T 127.0.0.1:2000
vcl.load default /etc/sysconfig/varnish/default.vcl
vcl.use default

OK了,评分系统工作正常了。哈哈~

不过高兴没多久,我惊奇的发现使用混合ip的办法,hiawatha居然不认……所有分配给hiawatha的请求依然被无情的挡掉了。我擦~

好在又想到了一个解决方案,就是
1.注释掉hiawatha配置文件里面的所有allowlist.
2.将Binding 块里的Interface 项设成 127.0.0.1,如下

Binding {
Port = 81
Interface = 127.0.0.1 #监听且仅监听 127.0.0.1 地址
MaxKeepAlive = 30
MaxRequestSize = 9999
MaxUploadSize = 10
TimeForRequest = 8,20
}


这样就万无一失了,重启hiawatha.
pkill hiawatha && hiawatha

这次总算成功了。
[ ] ( 2041 次浏览 ) 永久链接 ( 3.1 / 2969 )
编译安装 mysql 5.5.10 和 php 5.3.6 通过 

就在前两天,mysql 开发团队发布了5.5.x分支的最新稳定版—5.5.10,极大的改善了对多核处理器的负载处理能力,于是便打算升级到此版本。

今天早些时候,php 团队也对外发布了其5.3.x分支的最新版本—5.3.6,考虑到我前段时间用的是5.3.6RC1,故而打算跟进到发布版。

于是今天便动手了,先是mysql.

下载源码包,解压,进入目录
我的编译参数:
[root@PowerPC mysql-5.5.10]# cmake . \
> -DCMAKE_BUILD_TYPE:STRING=Release \
> -DCMAKE_INSTALL_PREFIX:PATH=/usr/local/mysql \
> -DCMAKE_USE_RELATIVE_PATHS:BOOL=OFF \
> -DCOMMUNITY_BUILD:BOOL=ON \
> -DENABLED_LOCAL_INFILE:BOOL=OFF \
> -DENABLED_PROFILING:BOOL=OFF \
> -DENABLE_DEBUG_SYNC:BOOL=OFF \
> -DINSTALL_BINDIR:STRING=../bin \
> -DINSTALL_DOCDIR:STRING=docs \
> -DINSTALL_DOCREADMEDIR:STRING=docs \
> -DINSTALL_INCLUDEDIR:STRING=include \
> -DINSTALL_INFODIR:STRING=docs \
> -DINSTALL_LAYOUT:STRING=STANDALONE \
> -DINSTALL_LIBDIR:STRING=lib \
> -DINSTALL_MANDIR:STRING=man \
> -DINSTALL_MYSQLSHAREDIR:STRING=share \
> -DINSTALL_SBINDIR:STRING=../sbin \
> -DINSTALL_SCRIPTDIR:STRING=scripts \
> -DINSTALL_SHAREDIR:STRING=share \
> -DINSTALL_SQLBENCHDIR:STRING=sql \
> -DINSTALL_SUPPORTFILESDIR:STRING=support-files \
> -DMYSQL_DATADIR:PATH=/var/run/mysql \
> -DSYSCONFDIR:PATH=/etc/sysconfig/mysql \
> -DWITHOUT_SERVER:BOOL=OFF \
> -DWITH_EMBEDDED_SERVER:BOOL=OFF \
> -DWITH_EXTRA_CHARSETS:STRING=all \
> -DWITH_INNOBASE_STORAGE_ENGINE:BOOL=OFF \
> -DWITH_PARTITION_STORAGE_ENGINE:BOOL=OFF \
> -DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=OFF \
> -DWITH_SSL:STRING=no \
> -DWITH_UNIT_TESTS:BOOL=OFF \
> -DWITH_ZLIB:STRING=bundle

没有任何问题,直接make && make install,编译安装.

好了之后,由于我使用了一个小把戏,把相对于 INSTALL_PREFIX 的bin/sbin 目录安装到/usr/local 下去了,所以mysql 根目录下的scripts/mysql_install_db 不能用了。

所以,恢复数据库只能换别的方法。

首先,把备份的my.cnf文件放到 /etc/sysconfig/my.cnf 下。
之后,直接运行mysql_secure_installation,重置root密码,刷新权限表。
这时再登录mysql,数据就都回来了。

注:该方法可能只适用于5.5.x 之间的升级(我是从5.5.9->5.5.10),且要求datadir里面文件都在。

至此,mysql升级完成。接下来是php.

下载源码包,解压,进入目录
[root@PowerPC php-5.3.6]# ./configure \
> --prefix=/usr/local/php \
> --exec-prefix=/usr/local \
> --sysconfdir=/etc/sysconfig/php \
> --localstatedir=/var \
> --disable-cli \
> --enable-fpm \
> --with-fpm-user=http \
> --with-fpm-group=web \
> --with-config-file-path=/etc/sysconfig/php \
> --with-config-file-scan-dir=/etc/sysconfig/php \
> --disable-ipv6 \
> --with-regex=php \
> --with-pcre-regex \
> --with-zlib \
> --with-bz2 \
> --with-curl \
> --enable-dba \
> --enable-exif \
> --with-gd \
> --with-gettext \
> --with-mhash \
> --enable-mbstring \
> --with-mcrypt \
> --with-mysql=/usr/local/mysql \
> --with-mysql-sock=/tmp/mysql.sock \
> --with-mysqli=/usr/local/bin/mysql_config \
> --disable-pdo \
> --with-libedit \
> --enable-soap \
> --enable-sockets \
> --with-xmlrpc \
> --enable-zip \
> --without-pear \
> --enable-zend-multibyte

检查依赖,报错。找不到 libedit.h 头文件.

yum install libedit-devel

即可.再次检查,通过。make && make install 编译安装.

不一会儿,就搞定了.
恢复下配置文件,php-fpm.conf、php.ini. 便可以启动php-fpm进程。

OK,升级完成.
[ ] ( 1892 次浏览 ) 永久链接 ( 2.9 / 2979 )
利用Live CD重新安装grub至硬盘 

最近把硬盘重新分区了,以前windows 和 linux 各20G的空间明显感觉不够用了(该死的visual studio 和 sql server,擦~),于是便格盘重新划分了下。

windows 就选择了最新的windows 7 with sp1 的ISO,ubuntu 嘛,由于11.04 natty还未发布,故而使用了其最新的测试版 alpha 3。

由于我是先安装的ubuntu(需要用Live CD 自带的分区工具),后安装的windows.导致我之前的硬盘引导被覆盖了,开机直接进windows了。

这个问题我之前曾经处理过一次,不过由于年代久远,忘了具体操作了,反正是重建grub就对了。

于是火速重启,放入ubuntu live CD,光盘启动,进入Live 模式。

我只记得是与"grub"相关的命令,具体是什么记不清了,于是便列出了BIN_PATH下所有的相关命令。
ls /bin | grep grub
ls /sbin | grep grub
……
终于找到了grub-install 和 update-grub 两个利器。

首先安装grub至硬盘,
mount /dev/sda2 ~/tmp #sda2 为linux root 所在分区
grub-install --root-directory=~/tmp /dev/sda2

接下来就是重建grub.cfg了,
update-grub
即可,接下来就会打印出
found linux kernel 2.xx.xx
found windows loader
……
字样,至此,grub安装完毕,再次bs下微软.
[ ] ( 3850 次浏览 ) 永久链接 ( 3 / 2851 )
让 nginx 支持 HTML5 video 源文件 

最近,也就是过年来了这段时间,我忽然对《明天会更好》这首老歌很感兴趣了,于是昨天便在自己的博客里面分享出了这首歌,当然我选择的是以HTML5 方式展现出来.

在此感谢下W3Schools,让我能够快速上手HTML5 的一些标签.

我是在优酷网下载的该MV,flv格式的,不易于分享,于是便转成了更加开放的ogg.
在视频转换方面,我使用的是ffmpeg2theora工具.

ffmpeg2theora -x 400 -y 350 --sync xxx.flv

我把转换好的ogv文件上传到我自己的服务器上,按照w3school上的例子,把相对路径改成了绝对路径,便了事了。我认为不会有什么问题了,也没有去测试能否播放。

直到今早,我打开我的博客,出人意料的是,我的chrome崩溃了。我开始猜到是html5的问题.

果然,视频不能播放,可是下载没有问题。说明不是权限问题。
也不可能是视频编码的问题,因为我昨天在本地测试过了,是可以播放的。

我百思不得其解,谷歌搜索了一下,在这里找到了答案.

原来是服务器的文件类型 MIME-type 在作怪.因为我服务器中的所有静态文件/资源文件都是由nginx在处理的。而nginx 默认的mime-types 里面没有 ogv 类型.

添加即可,加入

video/ogg ogg;
video/ogg ogv;


重启nginx即可.

注:如果ogg文件是视频的,必须为以上内容。参见:https://developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements#Recognized_MIME.c2.a0types_for_Ogg_media

再测试下,火狐已经可以播放了,不过chrome还是崩溃.
这又是怎么回事? 待解.
[ ] ( 2200 次浏览 ) 永久链接 ( 3 / 2788 )
MySQL 升级后pam-mysql 验证失效的解决办法 

昨天把mysql升级到了5.5.9版本,忽然发现ftp登录不了了……由于我的vsftpd是用pam-mysql验证用户的,怀疑可能是这方面出现了问题.

一一尝试:

1.首先,怀疑是pam-mysql 用来访问vsftpd.users 表的用户ftp 权限不够,

重新授权.
grant all on vsftpd.users to 'ftp'@'localhost' identified by 'XXXX';

flush privileges;
刷新权限表。

尝试ftp登录,还是失败。我用 ftp 身份本地登录mysql,一切正常.看来不是这个问题.

2.怀疑是pam-mysql 口令加密方式有问题。把配置中的crypt=2 改成 明文(0).尝试登录,还是失败。再改回来,用PASSWORD()函数重新设密码,还是失败.

3.难道又是localhost 和 127.0.0.1 的问题?都授权了一下,还是登不进。我擦~

4.不会是pam-mysql不兼容现在的mysql吧?!我倒吸了一口凉气。好在编译安装pam-mysql不是很麻烦,赶紧动手.

下载源码包,解压,进入目录,
./configure --with-mysql=/usr/local/mysql #只要这一句
直接make.

备份之前旧版本的pam-mysql.so 文件.
mv /lib/security/pam_mysql.so /lib/security/pam_mysql.so.old

复制新生成的pam-mysql 模块到 /lib/security 目录下.
cp ./.lib/pam_mysql.so /lib/security/

别忘了重新ld链接下.
ldconfig -v

别的什么也不要改,重启vsftpd.

再次尝试登录ftp,成功了~

我擦,真是pam-mysql 的原因.
[ ] ( 2059 次浏览 ) 永久链接 ( 3 / 2832 )

<< <上一页 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 下一页> >>