nginx二级域名泛解析到子目录

需求:自己VPS上跑的是军哥的LNMP,不想装什么面板。但是由于还要给其它人开空间,为了省去绑定一大堆二级域名的功夫,决定研究一下如何在nginx下二级域名泛解析,绑定到子目录。

具体的要求如下:

域名*.example.com均解析到/home/wwwroot/example目录下,创建数个子文件夹如example.com、test.example.com
对应的域名能够直接解析到对应的目录,如访问test.example.com能够访问/home/wwwroot/example/test.example.com下的目录

在网上找了一堆,大部分是用正则匹配server_name然后set $www_root $1;root /home/wwwroot/exmaple/$www_root;这样的。我自己测试了好多次之后发现,index配置偶尔会失效。于是自己钻研琢磨,写成了下面这个样子:

server
        {
                listen       80;
                server_name example.com *.example.com;
                root  /home/wwwroot/dimpurr/$host/;
                #以下配置省略……
        }

完美解决。

CentOS 6.4 x64 安装Tengine+MaraiaDB+php-fpm的记录

学校BBS的新机器67,主要是用来做一个反向代理到216然后加速外网访问,因为学校对67所在的网段有电信的加速部署,所以外网访问很快。(此处67和216为机器IP的最后一段,这里略去完整IP)

新的机器配置还不错,4G的内存和16个核心的CPU(哎……CPU怎么那么多,当初申请的时候才要了8核来着。),贴出来炫耀一下……

 [oott123@FastBird ~]$ free -m
              total       used       free     shared    buffers     cached
 Mem:          3830       1117       2713          0         67        745
 -/+ buffers/cache:        304       3526
 Swap:         3967          0       3967
 [oott123@FastBird ~]$ cat /proc/cpuinfo
 processor       : 0
 vendor_id       : GenuineIntel
 cpu family      : 6
 model           : 45
 model name      : Intel(R) Xeon(R) CPU E5-2650 0 @ 2.00GHz
 stepping        : 7
 cpu MHz         : 2000.000
 cache size      : 20480 KB

参数就不泄漏太多了……总之用的虚拟化技术其实是VMWare(学校Win平台居多导致的)。由于是生产环境,所以悲剧的一点就是不能主动连接外网,对外监听的端口也只开放了80,ssh啥的也要经由VPN才能爬。这次想着服务器条件不错,再加上对速度有一定的要求,打算用Tengine做动静分离的反向代理。很明显这台服务器是负责静态加速的,那么为什么要安装MariaDB和php-fpm呢?

嗯……答案就是我闲的蛋疼了(大雾)。【其实是有一些特殊需求不好说太多。

好了差不多就这样,接下来整理我的TMP安装过程。由于是学校的机器,让信息中心的老师装了CentOS6.4,结果到手以后发现是完整版,各种软件包齐全啊……首先把碍事的mysql卸载掉。

 yum remove mysql mysql-*

一定要卸载掉的原因是这货会和MariaDB冲突……接下来的安装顺序是Tengine->MariaDB->php-fpm

Tegine是编译安装的,源码包和jmalloc都是从官网下载之后SFTP到服务器上的。执行Tegine带jmalloc的编译如下:

 yum install pcre-devel #这个是pcre包,rewrite要用到。
 ./configure --user=apache --group=apache --with-http_stub_status_module --with-http_gzip_static_module --with-http_sysguard_module --with-http_concat_module --with-jemalloc=../jemalloc-3.4.0
 make && make install

不需要太多的模块,因为Tegine支持DSO动态模块加载,之后要加模块可以单独添加。再说这服务器连443端口都没开,ipv6因为是新机房也部署不到,所以ipv6和ssl也没有带进来。由于216上的网页文件都是给的apache/apache这个属主,所以这边也是一样的给apache。这台机器编译起来很爽,1分钟不到就完成了。

然后我从网上下载了别人的nginx的init.d给复制到了对应的目录……这个过程,捂脸就不说了……

接下来是MariaDB,选用5.5稳定版。按官方的安装攻略我如果要rpm包的话得配置他家的yum源,不幸的是67不能访问外网,只得自己手动下载这几个文件:

 http://yum.mariadb.org/5.5/centos6-amd64/rpms/MariaDB-5.5.31-centos6-x86_64-compat.rpm
 http://yum.mariadb.org/5.5/centos6-amd64/rpms/MariaDB-5.5.31-centos6-x86_64-common.rpm
 http://yum.mariadb.org/5.5/centos6-amd64/rpms/MariaDB-5.5.31-centos6-x86_64-shared.rpm
 http://yum.mariadb.org/5.5/centos6-amd64/rpms/MariaDB-5.5.31-centos6-x86_64-server.rpm
 http://yum.mariadb.org/5.5/centos6-amd64/rpms/MariaDB-5.5.31-centos6-x86_64-client.rpm

给出的地址是centos6,x64,Maria5.5的下载地址,别轻易对号入座。下载完后按上面的顺序安装即可:

 rpm -ivh MariaDB-5.5.31-centos6-x86_64-compat.rpm
 rpm -ivh MariaDB-5.5.31-centos6-x86_64-common.rpm
 rpm -ivh MariaDB-5.5.31-centos6-x86_64-shared.rpm
 rpm -ivh MariaDB-5.5.31-centos6-x86_64-server.rpm
 rpm -ivh MariaDB-5.5.31-centos6-x86_64-client.rpm #选装,提供mysql指令

顺序一定要对……先compat,再common,再shared,最后才是server。如果按照官方的来的话倒是好办,设置好直接yum会自动处理依赖关系的。

安装完MariaDB记得执行安全初始化:

 service mysqld restart #开启MariaDB
 /usr/bin/mysql_secure_installation

然后向导会引导你设置root密码,禁止空用户连接等。

最后是php-fpm的安装。先看看自带的php是哪个版本的:

 [oott123@FastBird ~]$ php -v
 PHP 5.3.3 (cli) (built: Feb 22 2013 02:51:11)
 Copyright (c) 1997-2010 The PHP Group
 Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

好嘛,直接就是5.3.3了。那好办,yum install php-fpm直接装上php-fpm就可以了。

还有就是把php-fpm和tegine联系起来。我是让php-fpm监听unix socks了,如下:

 vim /etc/php-fpm.d/www.conf
 #修改处:listen = /tmp/php-cgi.sock

 vim /usr/local/nginx/conf/fastcgi_params
 #文件全文
 fastcgi_param  QUERY_STRING       $query_string;
 fastcgi_param  REQUEST_METHOD     $request_method;
 fastcgi_param  CONTENT_TYPE       $content_type;
 fastcgi_param  CONTENT_LENGTH     $content_length;

 fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
 fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
 fastcgi_param  REQUEST_URI        $request_uri;
 fastcgi_param  DOCUMENT_URI       $document_uri;
 fastcgi_param  DOCUMENT_ROOT      $document_root;
 fastcgi_param  SERVER_PROTOCOL    $server_protocol;
 fastcgi_param  HTTPS              $https if_not_empty;

 fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
 fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

 fastcgi_param  REMOTE_ADDR        $remote_addr;
 fastcgi_param  REMOTE_PORT        $remote_port;
 fastcgi_param  SERVER_ADDR        $server_addr;
 fastcgi_param  SERVER_PORT        $server_port;
 fastcgi_param  SERVER_NAME        $server_name;

 vim /usr/local/nginx/conf/nginx.conf
 #server字段的location配置
         location ~ .*\.(php|php5)?$ {
                 fastcgi_pass unix:/tmp/php-cgi.sock;
                 fastcgi_index index.php;
                 include fastcgi_params;
         }

最后就是对各个软件设置开机自启动:

 chkconfig mysqld on
 chkconfig php-fpm on
 vim /etc/rc.local #加入一行/etc/init.d/nginx start用来开启Tegine

完工。

Typecho的CommentToMail插件不支持https的问题

如题。

在仔细查看了CommentToMail的插件源码后,我发现了这个:

 /**
 * 发送异步请求
 *
 * @access public
 * @param string $filename 存放邮件的临时文件名
 * @param string $siteUrl 网站连接
 * @return void
 */
public static function asyncRequest($filename,$siteUrl) {
    $dmpt=parse_url($siteUrl);
    $host = $dmpt['host'];
    $port = $dmpt['port']?$dmpt['port']:80;
    if(substr($dmpt['path'], -1) != '/') $dmpt['path'] .= '/';
    $url = $dmpt['path'].'action/comment-to-mail';
    $get='send='.$filename;
    $head = "GET ". $url . "?" . $get . " HTTP/1.0\r\n";
    $head .= "Host: " . $host . "\r\n";

它很明确的表达了:我压根就没打算支持SSL,你看我都是用纯粹的fsocksopen在异步请求呢!

既然如此,我也顺便就把博客的ssl去掉了。平心而论,博客加ssl纯粹就是好玩。至于安全性需要加强的部分,我已经把它挪到其它的子域名去了,也乐得一个自在。