有时候,可能有这样一种情况:即通过访问一个 http 请求,运行一下某台远程机器上的一个 shell 脚本,比如:用来启动一个测试,用来发送一个邮件,或者短信通知一下管理员,诸如此类的一个任务,等等;
安装 python,或者 php 这类脚本当然可以实现这类需求,其实还有一个更简单的做法,就是 fcgiwrap;本文就简单说一下其原理。
环境
- nginx 源码安装要点,nginx 当前 1.10.1 版;
- CentOS release 6.8;
安装 fcgiwrap
- 从 Github 下载,最新 1.1.0 版;
- 常规编译安装;
参照 How to install fcgiwrap to serving CGI/Perl Scripts in nginx @ knowledgebase.cc 安装 fcgiwrap 和 spawn-fcgi;
解决错误 Nginx connect() to unix:/var/run/fcgiwrap.socket failed; - P.S.
install -d -m 755 /usr/local/sbin
install -m 755 fcgiwrap /usr/local/sbin
install -d -m 755 /usr/local/man/man8
install -m 644 fcgiwrap.8 /usr/local/man/man8
nginx.conf 片段示例
location ~ (\.sh|\.lua)$ {
root /home/example/autotest;
include fastcgi_params;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
- 可以通过 "HTTP Basic Authentication" 协议(nginx
auth basic
指令)加以简单访问限制;
curl http://username:password@autotest.example.com/ 或者通过 Authorization 头携带凭证也可; - 也可以通过加自定义头来简单限定访问;
curl -H "X-Test-Who: michael" http://autotest.example.com/cpuinfo.sh 来访问;
cpuinfo.sh 示例
#!/bin/sh
# -*- coding: utf-8 -*-
NAME="cpuinfo"
echo -e "X-Test-Author: Michael\r\n"
echo "<html><head>"
echo "<title>$NAME</title>"
echo '<meta name="description" content="'$NAME'">'
echo '<meta name="keywords" content="'$NAME'">'
echo '<meta http-equiv="Content-type" content="text/html; charset=UTF-8">'
echo '<meta name="ROBOTS" content="noindex">'
echo "</head><body><pre>"
echo -e "`date`\n"
echo -e "uname -a"
uname -a
echo -e "\ncpuinfo"
#cat /proc/cpuinfo
echo "</pre></body></html>"
参考资料
-
nginx 安装 lua 模块;
1)nginx - How to run a shell script on every request?
2)动态加载 lua 或者 直接将 lua 编译进 nginx; -
Running Shell Script from html webpage? @ ruby-forum.com;
Echo newline in Bash prints literal \n(echo -e 是一个简单方式); - git server 除了提供 ssh 方式访问外,也可以使用 fcgiwrap 这种方式提供 http 服务;
- HTTP X-Headers 自定义头示例;
X-Test-App: cr,nginx 使用 $http_x_test_app,PHP 使用 X_TEST_APP;
X-Test-Key: nc,nginx 使用 $http_x_test_key,PHP 使用 X_TEST_KEY; - Access permission problem (dot at the end of file permissions)?
-
What does the dot mean at the end of
-rw-r--r--
? How do you set it withchmod
?;