快捷搜索:   nginx

nginx+fastcgi+php安全虚拟主机隔离配制方法

网上关于nginx +fastcgi+php 虚拟主机独立站点安全配置文章很多。

其中 关于Nginx+PHP的虚拟主机目录权限控制的探究   文章已经讲的很详细了。方法很多,有设置特殊目录的,有通过open_basedir配制独立站点,独立目录的。 还有将所有站点目录都写在open_basedir里面。只是没有站点用比较特殊目录名称。别人不知道目录的。是进去不了。还有修改php 源码,加入root_path限制,访问目录。

 

那么我写这篇文章,不想再去考虑怎么样限制在某个目录了。 我主要要说的是:、

1,php.ini 安全配置

2,通过启动多个php-cgi怎么样实现灵活配制

3,nginx fastcgi_pass 怎么样控制发到不同的fastcgi

 

如果你对这些都比较清楚,可以忽略跳过下面的了。

 

1.php.ini 安全配置

配制项目
   

说明

allow_url_fopen=Off
allow_url_include=Off
   

禁止远程包含

register_globals=Off
   

禁止自动注册全局变量

open_basedir="\tmp:"
   

限制操作文件路径(具体站点具体路径)

safe_mode=Off
safe_mode_gid=Off
   

禁止使用安全模式

max_execution_time=30
max_input_time=60
   

限制脚本执行时间(避免耗时限制语句)

memory_limit=32M
upload_max_filesize=5M
post_max_size=8M
max_input_nesting_levels=64
   

限制内存,及文件尺寸

display_errors=Off
log_errors=On
error_log="/var/log/nginx/phperror.log"
   

安全的错误配制

fastcgi.logging=0

cgi.fix_pathinfo=0
   

禁止fastcgi 的pathinfo

最近nginx漏洞在此

expose_php=Off
   

隐藏php的版本信息

enable_dl=Off
   

关闭dl参数

disable_functions =phpinfo,exec,passthru,shell_exec,system,proc_open,

popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
   

禁止恶意函数执行

 

以上我都不打算多说了。参数意思可以看看php手册。

 

2.fastcgi  启动脚本

a.为每个站点建立一个独立用户,都属于同一个组

[root@localhost ~]# groupadd webuser

[root@localhost ~]# useradd   -M   -G webuser  -s /sbin/nologin web-a.com

 

b.建立fastcgi通用启动脚本

 

 [root@www]# egrep -v '#.*|^$' php-cgi.sh

. /etc/rc.d/init.d/functions 

SPAWNFCGI="/usr/local/bin/spawn-fcgi"

FCGIPROGRAM="/usr/bin/php-cgi"

FCGIPROGRAM2="$FCGIPROGRAM $CGI_OPTIONS"

PHP_FCGI_MAX_REQUESTS=500

FCGI_WEB_SERVER_ADDRS="127.0.0.1"

ALLOWED_ENV="SHELL PATH USER"

if test x$PHP_FCGI_CHILDREN = x; then 

PHP_FCGI_CHILDREN=5

fi 

prog="${tmpfile%.*}-fcgi"

FCGI_SOCKET="/tmp/$prog.sock"

FCGI_PIDFILE="/var/run/$prog.pid"

FCGI_LOCKFILE="/var/lock/subsys/$prog"

export PHP_FCGI_MAX_REQUESTS 

export FCGI_WEB_SERVER_ADDRS 

ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"

if test x$UID = x0; then 

EX="$SPAWNFCGI -s $FCGI_SOCKET -f \"$FCGIPROGRAM2\" -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN -P $FCGI_PIDFILE"

else 

EX="$SPAWNFCGI -s $FCGI_SOCKET -f \"$FCGIPROGRAM2\" -C $PHP_FCGI_CHILDREN -P $FCGI_PIDFILE"

fi 

E= 

for i in $ALLOWED_ENV; do 

E="$E $i=${!i}"

done 

RETVAL=0

status() {

local pid

        echo $"Usage: status {program}"

        return 1

fi

pid=`pgrep $base -u $USERID | sed 's/\n/\t/g'`

if [ -n "$pid" ]; then

        echo $"${prog} (pid $pid) is running..."

        return 0

fi

if [ -f $FCGI_PIDFILE ] ; then

        read pid < $FCGI_PIDFILE

        if [ -n "$pid" ]; then

                echo $"${prog} dead but pid file exists"

                return 1

        fi

fi

if [ -f $FCGI_LOCKFILE ]; then

        echo $"${prog} dead but subsys locked"

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论