在 Gentoo LEMP 上安装 FcgiWrap 并启用 Perl、Ruby 和 Bash 动态语言
本教程与前一篇关于在 Gentoo 上安装 LEMP 的教程密切相关,并讨论了其他服务器扩展问题,例如通过Fcgiwrap Gateway启用动态脚本语言(如 Perl、Bash 或 Ruby),以及编辑 Nginx 虚拟主机配置文件以使用.pl、.rb和.cgi脚本提供动态内容。
要求
- 在 Gentoo 上安装 LEMP 堆栈 -在 Gentoo Linux 中安装 Lemp
步骤 1:在 Gentoo LEMP 上启用 FCGIWRAP
Fcgiwrap是Nginx FastCGI 通用网关接口的一部分,它处理其他动态脚本语言,如 Perl 或 Bash 或 Ruby 脚本,通过独立的方式处理通过 TCP 或 Unix 套接字从 Nginx 接收的请求,并将生成的结果返回给 Nginx,后者再将响应转发回最终客户端。
1.首先使用以下命令在 Gentoo Linux 上安装FCcgiwrap进程。
# emerge --ask www-misc/fcgiwrap
2.默认情况下,Fcgiwrap 软件包在 Gentoo 上不提供任何初始化脚本来管理进程。软件包编译并安装后,创建以下初始化脚本,帮助您使用三种方法管理 Fcgiwrap 进程:使用Unix 域套接字启动进程、使用本地TCP 套接字或同时使用两者。
使用 TCP 套接字脚本
在/etc/init.d/路径上创建一个 init 文件,文件内容如下。
# nano /etc/init.d/fcgiwrap
添加以下文件内容。
#!/sbin/runscript ip="0.0.0.0" port="12345" start() { ebegin "Starting fcgiwrap process..." /usr/sbin/fcgiwrap -s tcp:$ip:$port & tcp_sock=`netstat -tulpn | grep fcgiwrap` echo "Socket details: $tcp_sock" eend $? "Errors were encountered while starting fcgiwrap process" } stop() { ebegin "Stopping fcgiwrap process..." pid=`ps a | grep fcgiwrap | grep tcp | cut -d" " -f1` kill -s 1 $pid tcp_sock=`netstat -tulpn | grep fcgiwrap` if test $tcp_sock = 2> /dev/null ; then echo "Fcgiwrap process successfully stoped" tcp_sock=`netstat -atulpn | grep $port` if test $tcp_sock = 2> /dev/null ; then echo "No open fcgiwrap connection found..." else echo "Wait to close fcgiwrap open connections...please verify with 'status'" echo -e "Socket details: \n$tcp_sock" fi else echo "Fcgiwarp process is still running!" echo "Socket details: $tcp_sock" fi eend $? "Errors were encountered while stopping fcgiwrap process..." } status() { ebegin "Status fcgiwrap process..." tcp_sock=`netstat -atulpn | grep $port` if test $tcp_sock = 2> /dev/null ; then echo "Fcgiwrap process not running" else echo "Fcgiwarp process is running!" echo -e "Socket details: \n$tcp_sock" fi eend $? "Errors were encountered while stopping fcgiwrap process..." }
如你所见,脚本文件开头有两个变量,分别是ip和port。根据你自己的需要更改这些变量,并确保它们不与系统上的其他服务重叠,尤其是 port 变量 - 这里的默认值是12345 - 请相应更改。
在 IP 变量上使用0.0.0.0可使进程绑定和侦听任何 IP(如果您没有防火墙,则可以在外部访问),但出于安全原因,您应该将其更改为仅在本地侦听127.0.0.1,除非您有其他原因,例如在不同节点上远程设置 Fcgiwrap 网关以提高性能或实现负载平衡。
3.创建文件后,附加执行权限并使用启动、停止或状态开关管理守护进程。状态开关将显示相关套接字信息,例如它监听的IP-PORT对以及是否有任何活动连接已初始化。此外,如果进程有处于TIME_WAIT状态的活动连接,则您无法重新启动它,直到所有 TCP 连接都关闭。
# chmod +x /etc/init.d/fcgiwrap # service start fcgiwrap # /etc/init.d/fcgiwrap status
使用 Unix 套接字脚本
如前所述,Fcgiwrap 可以使用两个套接字同时运行,因此将第二个脚本的名称稍微更改为fcgiwrap-unix-socket,以确保两者可以同时启动和运行。
# nano /etc/init.d/fcgiwrap-unix-socket
对于 UNIX 套接字,请使用以下文件内容。
#!/sbin/runscript sock_detail=`ps a | grep fcgiwrap-unix | head -1` start() { ebegin "Starting fcgiwrap-unix-socket process..." /usr/sbin/fcgiwrap -s unix:/run/fcgiwrap-unix.sock & sleep 2 /bin/chown nginx:nginx /run/fcgiwrap-unix.sock sleep 1 sock=`ls -al /run/fcgiwrap-unix.sock` echo "Socket details: $sock" eend $? "Errors were encountered while starting fcgiwrap process" } stop() { ebegin "Stopping fcgiwrap-unix-socket process..." pid=`ps a | grep fcgiwrap | grep unix | cut -d" " -f1` rm -f /run/fcgiwrap-unix.sock kill -s 1 $pid echo "Fcgiwrap process successfully stoped" #killall /usr/sbin/fcgiwrap sleep 1 echo "Socket details: $sock" eend $? "Errors were encountered while stopping fcgiwrap process..." } status() { ebegin "Status fcgiwrap-unix-socket process..." if test -S /run/fcgiwrap-unix.sock; then echo "Process is started with socket: $sock_detail" else echo "Fcgiwrap process not running!" fi eend $? "Errors were encountered while stopping fcgiwrap process..." }
4.再次确保此文件可执行,并使用相同的服务开关:start、stop或status。我已将此套接字的默认路径设置为/run/fcgiwrap-unix.sock系统路径。启动该进程并使用状态开关验证它,或者列出/run目录内容并找到套接字,或者使用ps -a | grep fcgiwrap命令。
# chmod +x /etc/init.d/fcgiwrap-unix-socket # service start fcgiwrap-unix-socket # /etc/init.d/fcgiwrap-unix-socket status # ps -a | grep fcgiwrap
如前所述,Fcgiwrap 可以同时使用 TCP 和 UNIX 套接字运行,但如果您不需要外部网关连接,则仅坚持使用Unix 域套接字,因为它使用进程间通信,这比通过 TCP 环回连接进行通信更快,并且使用更少的 TCP 开销。
第 2 步:在 Nginx 上启用 CGI 脚本
5.为了让 Nginx 通过快速通用网关接口解析和运行 Perl 或 Bash 脚本,必须在根路径或位置语句上使用 Fcgiwrap 定义配置虚拟主机。
下面给出了一个示例(localhost),它使用 Fcgiwrap TCP 套接字作为默认根文档路径,激活根路径(/var/www/localhost/htdocs/)中所有带有.pl和.cgi扩展名的文件上的 Perl 和 CGI 脚本,第二个位置使用Unix 域套接字,带有index.pl文件,第三个位置使用TCP 套接字和index.cgi文件。
将以下内容(或其中的部分内容)放入您想要的虚拟主机配置文件中,通过修改fastcgi_pass参数语句在不同位置使用 UNIX 或 TCP 套接字激活动态 Perl 或 Bash 脚本。
# nano /etc/nginx/sites-available/localhost.conf
编辑localhost.conf使其看起来像下面的模板。
server { listen 80; server_name localhost; access_log /var/log/nginx/localhost_access_log main; error_log /var/log/nginx/localhost_error_log info; root /var/www/localhost/htdocs/; location / { autoindex on; index index.html index.htm index.php; } ## PHP –FPM Gateway ### location ~ \.php$ { try_files $uri =404; include /etc/nginx/fastcgi.conf; fastcgi_pass 127.0.0.1:9001; } ## Fcgiwrap Gateway on all files under root with TCP Sockets### location ~ \.(pl|cgi|rb)$ { fastcgi_index index.cgi index.pl; include /etc/nginx/fastcgi.conf; fastcgi_pass 127.0.0.1:12345; } ## Fcgiwrap Gateway on all files under root second folder with index.pl using UNIX Sockets### location /second { index index.pl; root /var/www/localhost/htdocs/; location ~ \.(pl|cgi|rb)$ { include /etc/nginx/fastcgi.conf; fastcgi_pass unix:/run/fcgiwrap-unix.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } ## Fcgiwrap Gateway on all files under root third folder with index.cgi using TCP Sockets### location /third { index index.cgi; location ~ \.(pl|cgi|rb)$ { include /etc/nginx/fastcgi.conf; fastcgi_pass 127.0.0.1:12345; } }
6.完成编辑 Nginx localhost.conf或您的特定虚拟主机配置文件后,移动到您的网站默认文档根路径,创建这两个文件夹以反映您的位置声明,并为每个位置创建具有特定扩展名的索引文件。
# cd /var/www/localhost/htdocs # mkdir second third
在第二个位置创建index.pl文件,内容如下。
# nano /var/www/localhost/htdocs/second/index.pl
添加此内容以获取环境变量。
#!/usr/bin/perl print "Content-type: text/html\n\n"; print <<HTML; <html> <head><title>Perl Index</title></head> <body> <div align=center><h1>A Perl CGI index on second location with env variables</h1></div> </body> HTML print "Content-type: text/html\n\n"; foreach my $keys (sort keys %ENV) { print "$keys = $ENV{$keys}<br/>\n"; } exit;
然后在第三个位置创建index.cgi文件,内容如下。
# nano /var/www/localhost/htdocs/third/index.cgi
添加此内容以获取环境变量。
#!/bin/bash echo Content-type: text/html echo "" cat << EOF <HTML> <HEAD><TITLE>Bash script</TITLE></HEAD> <BODY><PRE> <div align=center><h1>A BASH CGI index on third location with env variables</h1></div> EOF env cat << EOF </BODY> </HTML> EOF
7.编辑完成后,使两个文件均可执行,重新启动 Nginx 服务器并确保两个 Fcgiwrap 套接字都在运行。
# chmod +x /var/www/localhost/htdocs/second/index.pl # chmod +x /var/www/localhost/htdocs/third/index.cgi # service nginx restart # service fcgiwrap start # service fcgiwrap-unix-socket start
接下来,将您的本地浏览器重定向至以下 URL。
http://localhost http://localhost/second/ http://localhost/third/
结果应如下面的屏幕截图所示。
8.如果一切就绪并正确配置,请在重新启动后通过发出以下命令启用两个 Fcgiwrap 守护程序自动启动(如果您已将 Nginx 配置为使用两个 CGI 套接字)。
# rc-update add fcgiwrap default # rc-update add fcgiwrap-unix-socket default
步骤 3:在 Fcgiwrap 上激活 Ruby 支持
9.如果您需要在 Nginx FCGI 上运行动态 Ruby 脚本,则必须使用以下命令在 Gentoo 上安装Ruby解释器。
# emerge --ask ruby
10.编译并安装软件包后,转到 Nginx sites-available并编辑localhost.conf文件,在最后一个花括号“ } ”之前添加以下语句,这将激活在 Nginx localhost 提供的默认文档根路径下的第四个位置运行 Ruby 脚本的支持。
# nano /etc/nginx/sites-available/localhost.conf
使用以下 Nginx 指令。
## Fcgiwrap Gateway on all files under root fourth folder with index.rb under TCP Sockets### location /fourth { index index.rb; location ~ \.rb$ { include /etc/nginx/fastcgi.conf; fastcgi_pass 127.0.0.1:12345; } } ## Last curly bracket which closes Nginx server definitions ## }
11.现在,为了测试配置,在/var/www/localhost/htdocs路径下创建第四个目录,创建一个带有.rb扩展名的可执行 Ruby 索引脚本并添加以下内容。
# mkdir /var/www/localhost/htdocs/fourth # nano /var/www/localhost/htdocs/fourth/index.rb
Ruby index.rb 示例。
#!/usr/bin/ruby puts "HTTP/1.0 200 OK" puts "Content-type: text/html\n\n" puts "<html><HEAD><TITLE>Ruby script</TITLE></HEAD>" puts "<BODY><PRE>" puts "<div align=center><h1>A Ruby CGI index on fourth location with env variables</h1></div>" system('env')
12.在文件上添加执行权限后,重新启动 Nginx 守护程序以应用配置。
# chmod +x /var/www/localhost/htdocs/fourth/index.rb # service nginx restart
打开浏览器并导航到 URL http://localhost/fourth/,它将显示以下内容。
现在就是这样,您已经将 Nginx 配置为在 FastCGI 网关上提供动态 Perl、Ruby 和 Bash 脚本,但请注意,在 Nginx CGI 网关上运行此类解释脚本可能很危险,并会给您的服务器带来严重的安全风险,因为它们使用您系统下的活动 shell 运行,但可以扩展静态 HTML 施加的静态屏障,为您的网站添加动态功能。