简介
CGI
(Common Gateway Interface)通用网关接口 描述了客户端和服务器程序之间传输数据的一种标准。
快速通用网关接口(Fast Common Gateway Interface/FastCGI)是通用网关接口(CGI)的改进,描述了客户端和服务器程序之间传输数据的一种标准。FastCGI致力于减少Web服务器与CGI程式**之间互动的开销,从而使服务器可以同时处理更多的Web请求。与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。
Nginx与Apache不同,只是一个代理程序,而不能执行外部程序!
避免报错先安装这些
yum install fcgi-devel -y # 没有会报错FastCGI library is missing
yum install autoconf automake libtool -y # 安装autoreconf
安装spawn-fcgi
yum install git -y
git clone https://github.com/lighttpd/spawn-fcgi.git
cd spawn-fcgi
./autogen.sh # 生成configure
./configure
make & make install
安装fcgiwrap
git clone https://github.com/gnosek/fcgiwrap.git
cd fcgiwrap
autoreconf -i # 生成configure
./configure
make
# 如果make报错执行
make CFLAGS='-Wno-implicit-fallthrough'
make install
创建管理脚本
cd /etc/init.d/
vim fcgiwrap
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
SPAWN_FCGI="/usr/local/bin/spawn-fcgi"
DAEMON="/usr/local/sbin/fcgiwrap"
NAME="fcgiwrap"
PIDFILE="/var/fcgiwrap/$NAME.pid" #pid位置
FCGI_SOCKET="/var/fcgiwrap/$NAME.socket" #socket位置
FCGI_USER="nginx" #用户
FCGI_GROUP="nginx" #用户组
FORK_NUM=2 #进程数量
SCRIPTNAME=/etc/init.d/$NAME
case "$1" in
start)
echo -n "Starting $NAME... "
PID=`pidof $NAME`
if [ ! -z "$PID" ]; then
echo "$NAME already running"
exit 1
fi
$SPAWN_FCGI -u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -P $PIDFILE -F $FORK_NUM -f $DAEMON
if [ "$?" != 0 ]; then
echo " failed"
exit 1
else
echo " done"
fi
;;
stop)
echo -n "Stoping $NAME... "
PID=`pidof $NAME`
if [ ! -z "$PID" ]; then
kill `pidof $NAME`
if [ "$?" != 0 ]; then
echo " failed. re-quit"
exit 1
else
rm -f $pid
echo " done"
fi
else
echo "$NAME is not running."
exit 1
fi
;;
status)
PID=`pidof $NAME`
if [ ! -z "$PID" ]; then
echo "$NAME (pid $PID) is running..."
else
echo "$NAME is stopped"
exit 0
fi
;;
restart)
$SCRIPTNAME stop
sleep 1
$SCRIPTNAME start
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|status}"
exit 1
esac
chmod +x fcgiwrap
mkdir /var/fcgiwrap/
service fcgiwrap start
cd /var/fcgiwrap/
chmod 777 fcgiwrap.socket
配置nginx
cd /etc/nginx
vim nginx.conf
location ~/cgi-bin/.*\.(sh|py|cgi) {
fastcgi_pass unix:/var//fcgiwrap/fcgiwrap.socket;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
include fastcgi_params;
}
cd /var/share/nginx/html/ # 进入到你的网站根目录
mkdir cgi-bin
编写测试脚本
vim test.sh
#!/bin/bash
echo "context-type:text/html"
echo ""
echo "hello /bin/bash"
vim test1.py
#!/bin/python3
print('context-type:text/html')
print('')
print('hello /usr/bin/python3')
service fcgiwrap start
systemctl restart nginx