好老师联盟迁移到阿里云中遇到的一些问题

终于有时间将好老师联盟从一个放着100多网站的服务器上迁移到阿里云了,途中遇到的问题不少,记录一下,留个经验

nginx+php-fpm不解析pathinfo的问题

解决办法在这里^_^

主站迁移过程中,发现点击任何子站均无效
经排查,发现程序中使用$_SERVER["server_name"]来获取域名,而nginx+php-fpm模式中,$_SERVER["SERVER_NAME"]或getenv('SERVER_NAME')获取的始终将是Nginx server_name配置中的第一个域名,这一点在程序开发中需要注意。这第一个域名就相当于Apache虚拟主机配置中的ServerName,后面的域名就相当于Apache的ServerAlias。

解决办法,在解析中,修改了server_name为$host变量

        location ~ .+\.php($|/) {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                fastcgi_param  PATH_INFO $fastcgi_path_info;
                include        fastcgi.conf;
                fastcgi_param  SERVER_NAME  $host; 
        }

在某些情况下(具体可参考 wiki.nginx.org),Nginx 内部重定向规则会被启动,例如,当 URL 指向一个目录并且在最后没有包含“/”时,Nginx 内部会自动的做一个 301 重定向,这时会有两种情况: 1、servernameinredirect on(默认),URL 重定向为: servername 中的第一个域名 + 目录名 + /;
2、servernamein_redirect off,URL 重定向为: 原 URL 中的域名 + 目录名 + /。

当你有多个域名要指向同一个虚拟主机,并且你自己写 301 重定向规则把它们合并到某一个域名时,情况就更复杂了: 首先,nginx 检查 URL,如果符合条件,就用该规则(你写的)做第一遍重定向,接着,检查新生成的 URL,如果符合内部自动重定向之条件,就用前面提到的规则再做一次重定向。

至于 PHP 的 $SERVER["SERVERNAME"],在 nginx 中默认是由 nginx 的变量 $servername 提供,这时它和重定向没有关系,始终是 servername 设置中的第一个域名,但这是可以被改变的,在你的 nginx 配置中找到 fastcgiparam 部分,修改 fastcgiparam SERVERNAME $servername;
为 fastcgiparam SERVERNAME $host;
但现在就要注意了,此时的 $SERVER["SERVERNAME"] 会受你写的和 nginx 自己的重定向规则所影响而变化。

现在就清楚了,如果 MediaWiki 是通过 $SERVER["SERVERNAME"] 来自己处理 URL 的话,那么在 nginx + php 的默认环境下,它获得的将始终是 servername 设置中的第一个域名,所以造成了“不管通过什么域名访问 MediaWiki 首页,都会被跳转到其中的一个域名上。”,这不是 nginx 的重定向造成的,虽然默认 servernameinredirect 是 on,但这个指令的影响范围仅仅只是 nginx 自己内部的重定向规则,所以,当你在 nginx + php 的环境中使用多域名虚拟主机,并且你的 php 库、框架、代码大量使用 $SERVER["SERVERNAME"] 时,你也许应该: 1、设置 fastcgiparam SERVERNAME $host;
2、设置 servernameinredirect off; 让 nginx 在处理自己内部重定向时不默认使用 servername 设置中的第一个域名;
3、不要使用 nginx 的 rewrite 规则来重定向、合并多个域名。
当然,后俩条是完全可选的,前提是你清楚你在做什么并且小心处理这时的 $SERVER["SERVERNAME"],也许更好的做法是保持 fastcgiparam SERVERNAME $servername; ,然后合理使用 $SERVER["SERVERNAME"] 和 $SERVER["HTTP_HOST"]。

ubuntu 14.04 安装mongodb3.2的问题

项目中使用了mongodb来做一些存储,迁移到阿里云时,选择的是ubuntu 14.04 server,偷懒使用apt-get install mongo来安装时,发现mongo的版本是2.4的,想使用3.2版本的(因为3.2性能有提升),就这么干了

>apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
>echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list
>apt-get update
>apt-get install mongodb-org
>service mongodb start

此时,发现语言环境设置的有问题,阿里云的这个14.04 64位版本的镜像导致的,只好这么干了

export LC_ALL=C  
浙ICP备16045237号-1