Nginx下开多个虚拟机网站防跨站是首要的任务,PHP5.3之前的版本不支持open_basedir,只能通过控制PHP-cgi进程及目录用户权限进行限制,防止跨站访问。
先了解一下网站正常运行所用到的用户、目录权限:
Nginx进程运行用户:接收用户请求,处理静态文件,如果是PHP则转给PHP-CGI处理,网站目录拥有读权限。
PHP-cgi进程用户:处理PHP文件,网站目录拥有读权限,个别目录需要写入权限。
让每个网站使用单独的PHP-CGI进程,创建PHP-FPM配置文件,修改以下:
代码如下 | 复制代码 |
<value name="pid_file">/usr/local/php/logs/php-fpm.pid</value> <value name="error_log">/usr/local/php/logs/php-fpm.log</value> <value name="listen_address">/tmp/wwww.111cn.net.sock</value> <value name="user">www.111cn.net</value> #PHP-CGI运行用户组 <value name="group">www.111cn.net</value> |
启动PHP-CGI进程:
代码如下 | 复制代码 |
/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/www.111cn.net.conf |
设置网站目录权限,设Nginx运行用户为www:
代码如下 | 复制代码 |
chown -R www.111cn.net:www /home/wwwroot/www.111cn.net chmod -R 550 /home/wwwroot/www.111cn.net chmod 701 /home/wwwroot/ |
再修改Nginx网站配置文件,解析PHP所使用的PHP-CGI进程:
代码如下 | 复制代码 |
location ~ .*.(php|php5)?$ { fastcgi_pass unix:/tmp/www.111cn.net.sock; fastcgi_index index.php; include fcgi.conf; } |
php-cgi进程简单管理脚本:
代码如下 | 复制代码 |
#! /bin/sh # chkconfig: 2345 55 25 #http://www.111cn.net cgi=/usr/local/php/bin/php-cgi case "$1" in start) for conf in `ls /usr/local/php/etc/*.conf` do $cgi --fpm --fpm-config $conf done ;; stop) for pid in `ls /usr/local/php/logs/*.pid` do kill -TERM `cat $pid` done ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac |
方法二,如果你是PHP 5.3.3以上版本 ,可参考下面方法,因为这个就更简单了
在5.3.3以上已经增加了HOST配置,可以起到防跨站、跨目录的问题。如果你是PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入:
vi /etc/php.ini #编辑php.ini配置文件,在最后添加以下代码,修改open_basedir的目录为站点路径
代码如下 | 复制代码 |
[HOST=www.111cn.net] open_basedir=/var/wwwroot/www.111cn.net/:/tmp/ [PATH=/var/wwwroot/www.111cn.net] open_basedir=/var/wwwroot/www.111cn.net/:/tmp/ #auto_prepend_file=security.php //允许访问的文件 [HOST=blog.rekfan.com] open_basedir=/var/wwwroot/blog.rekfan.com/:/tmp/ |
方法三,防WEBshell 跨站
作者亲测,需要更改php源程序后,重新编译php。在使用fpm方式安装时,打补丁过程中会修改php的文件,所以需要在打完fpm补丁后再修改php源程序。
代码如下 | 复制代码 |
tar zxvf php-5.2.14.tar.gz gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1 cd php-5.2.14/ vi main/fopen_wrappers.c /* {{{ php_check_open_basedir // 添加的内容开始 char *env_document_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC); // 添加的内容结束 pathbuf = estrdup(PG(open_basedir)); ptr = pathbuf; while (ptr && *ptr) { if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) { ptr = end; /* Nothing to check... */ |