趁这段时间有空,换成Xen的VPS,系统装了Ubuntu 12.04。决定重新配置一下服务器,另外将Web Server从Apache换成Nginx。
目标
搭建一个前端为nginx支持多用户的php虚拟主机。每个站点可以跑在不同的权限的用户下,一个站点被黑的时候希望不要影响到另一个站点,或者一个同学也不要可以随意访问到别的同学的内容。
行动
预备
首先创建用户,例如user01。我们可以通过
1 | adduser user01 |
来添加用户,然后在**~user01目录下面创建一个文件夹www**,权限为750。group为www-data,这样,只有user01可以读写,www-data仅能读,其他人无权访问。
php
从php 5.3.5开始就直接内置支持fpm了,建议直接安装php 5.4。使用php-fpm(php Fastcgi Process Manager),目前这样的方式运行php性能貌似是最高的。
php-fpm的配置放在/etc/php5/fpm/pool.d/下面,我们只需要以.conf结尾命名我们的配置文件就行了,具体可以参考默认的www.conf文件。例如下面文件user01.conf
1 | [user01] |
定义了php进程的权限为user01,监听文件为**/var/run/php5-fpm.user01.sock**。
这里的定义实际上是指的是用**/var/run/php5-fpm.user01.sock这个来处理php时的权限为user01**。到此为止,php的配置就完成了。
nginx
我们nginx的权限为www-data,这样可以读~user01/www目录的内容,但是不能写。nginx的站点配置比较简单。我们来看一下可以工作的简单的配置:
1 | server { |
也就是当处理到.php结尾的uri时,传递到**/var/run/php5-fpm.user01.sock**这个unix套接字处理,此时的php脚本的权限为user01。如果配置得当,就不会影响到其他用户。
wordpress
我们用php的主要原因是wordpress,wordpress默认情况下非常臃肿,运行缓慢。因为页面基本只是在更新文章或者发表评论才会更新,所以平时不需要总是动态生成页面。对此,WP Super Cache插件可以很好地进行缓存。WP Super Cache有两种缓存模式一种是PHP缓存、另一种是mod_rewrite缓存(我们选择这个),mod_rewrite是生成静态的页面文件,然后通过.htaccess文件控制Apache来rewrite url。例如我们访问http://everet.org/2012/01/scar.html,其中uri为/2012/01/scar.html,进入到Apache通过rewrite后就变成了/wp-content/cache/supercache/everet.org/2012/01/scar.html/index.html,然后就可以读取静态文件返回给浏览器了。如果静态文件存在的话,就不需要经过php处理了,否则就调用php动态生成页面,同时插件还会生成那个页面的静态文件,下次就直接读取那个静态文件。
对于Apache,WP Super Cache插件生成的.htaccess可以很好的工作。然而,对于nginx,我们需要手写配置,以将uri映射的静态文件上面。我们来看一下下面的配置,这个是Rahul Bansal大牛的配置,我们拿来用一下。
1 | server { |
我们来慢慢阅读一下这个配置。首先,set $cache_uri $request_uri
就是将请求的uri保存到我们的变量$cache_uri
中。然后,如果请求方法是POST($request_method = POST
)、包含请求字符串($query_string != ""
)、请求的uri包含一些特殊的php文件($request_url ~* "(/wp-admin/|.........
)或者登录过评论过(通过cookie判断,$http_cookie ~* "comment_author|w............"
),就将$cache_uri
设置为’null cache’,这样是让$cache_uri
这个字符串变量变成一个无意义的字符串,以让后面拼接出来的路径无意义。
对于 try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html $uri $uri/ /index.php;
这个是依次尝试访问这些文件,成功就直接返回不再继续,如果都找不到就返回最后一个文件/index.php。我们还记得WP Super Cache生成的静态文件结构是/wp-content/cache/supercache/everet.org/2012/01/scar.html/index.html
,也就是先尝试WP Super Cache生成的缓存,有就直接返回缓存。
用ab测试了一下,对于缓存后的博客文章的RPS可以到900,还挺快的啊。
另外,对于wordpress的wp-config.php文件,里面写有数据库的帐号和密码,所以我们需要将权限改为600,即只有user01自己能够读写,其他人无权访问。