nginx+fastcgi+php安全虛擬主機隔離配制方法
nginx+fastcgi+php安全虛擬主機隔離配制方法:
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"
return 2
fi
echo $"${prog} is stopped"
return 3
}
start() {
echo -n $"Starting $prog: "
daemon env - $E $EX
chmod 777 $ FCGI_SOCKET
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch $FCGI_LOCKFILE
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
rm -f $FCGI_PIDFILE $FCGI_SOCKET
RETVAL=$?
[ "$RETVAL" -eq 0 ] && success "startup" || failure "startup"
echo
[ $RETVAL -eq 0 ] && rm -f $FCGI_LOCKFILE
return $RETVAL
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
condrestart)
if [ -f $FCGI_LOCKFILE ]; then
stop
start
fi
;;
status)
status $FCGIPROGRAM
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
RETVAL=1
esac
exit $RETVAL
上面這個腳本是我用網上腳本改造而成,主要修改,當重啟,或者stop 莫個站點php-cgi 實際是將所有站點都停止了。 這樣不符合獨立虛擬主機的獨立管理原則。
c.獨立站點的 啟動腳本
web-chaohao.com通用包含腳本:
[root@www]# egrep -v '#.*|^$' www.a.com.sh
export PATH=/usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin;
export LANG=zh_CN.GB2312;
#啟動php-cgi 線程數量
PHP_FCGI_CHILDREN=30;
#啟動賬戶
USERID= web-a.com;
#啟動群組
GROUPID=webuser;
CGI_OPTIONS=" -d open_basedir=/home/www/a/:/tmp/ -C ";
TMPPATH=`dirname $0`;
. $TMPPATH/php-cgi.sh;
從上面腳本應該可以看出,這個是每個站點一個腳本,然后腳本,包含 通用腳本 php-cgi.sh
www.a.com.sh 這個里面有個CGI_OPTIONS 配制選項,可以控制open_basedir 允許的站點。 當然,也可以配置其它php.ini key=value 參數。
值得注意的是:
i. 多個配制的話,可以用多個-d 參數。 -d open_basedir=/tmp -d display_errors=on 這樣就會覆蓋掉php.ini 里面配置。 呵呵,比較簡單吧。
ii.很奇怪是當 php -v 版本是:5.1.6好像不起作用,后來升級到5.2.6 配制就生效了。 php-cgi -d 后面設置不生效的情況下,請看下你的php版本。
iii.php-cgi.sh 與站點腳本www.a.com.sh 放到同一目錄.
d.啟動站點
chmod +x www.a.com.sh
./www.a.com.sh
Usage: ./www.chaohao.com.sh {start|stop|restart|condrestart|status}
可以帶參數。
./www.a.com.sh start
Starting www.a.com-fcgi: [ OK ]
ps aux | grep php-cgi
可以看到腳本已經啟動
0.2 0.1 82040 7692 ? Ss 16:35 0:00 /usr/bin/php-cgi -d open_basedir=/home/www/html/www.a.com/:/tmp/ -C
................
e.腳本解析
上面腳本,會自動創建
/var/run/腳本文件名-fcgi.pid
/tmp/腳本文件名-fcgi.sock
文件。 如果執行腳本是,www.a.com.sh
創建文件對應是:/var/run/www.a.com-fcgi.pid 以及 /tmp/www.a.com-fcgi.sock
建議站點名稱,最好能夠跟用戶名,以及腳本名稱統一。如果你的站點是 www.b.com
useradd 設置為 web-b.com
shell腳本設置為b.com.sh
3.nginx sever配制
[root@web49 nginx]# egrep -v '#.*|^$' /etc/nginx/host/webhost.conf
server {
listen 8888;
#綁定域名
server_name www.a.com www.b.com;
access_log /var/log/nginx/chaohao.access.log main;
error_log /var/log/nginx/chaohao.error.log;
index index.php index.shtml;
set $test_host www.chaohao.com;
set $Root_Path /home/www/html/$test_host;
root $Root_Path/html;
set $sock_file www.chaohao.com-fcgi.sock;
if ($host ~* www.a.com|www.b.com)
{
set $sock_file www.a.com-fcgi.sock;
}
set $sock_file unix:/tmp/$sock_file;
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_param _FILENAME $document_root$fastcgi__name;
fastcgi_param Root_Path $Root_Path;
fastcgi_param Root_HTML $document_root;
fastcgi_index index.php;
fastcgi_pass $sock_file;
}
}
如果域名與站點設計比較好,可以直接通過讀取$host 里面變量,作為fastcgi_pass 參數
注意:
fastcgi_pass 如果不支持變量,需要注意了。這個可能與你的nginx 版本有關系。
測試發現 fastcgi_pass nginx 0.639不支持使用變量。后來使用0.7.65版本 支持使用變量了
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解