nginx - 如何在每个请求上运行shell脚本?

时间:2014-04-06 07:26:05

标签: shell nginx

每次我的nginx服务器收到任何HTTP请求时,我想运行一个shell脚本。有什么简单的方法吗?

4 个答案:

答案 0 :(得分:50)

您可以通过nginx.conf文件中的Lua代码执行shell脚本来实现此目的。您需要HttpLuaModule才能执行此操作。

这是一个例子。

location /my-website {
  content_by_lua_block {
    os.execute("/bin/myShellScript.sh")
  } 
}

答案 1 :(得分:40)

我在此地址在线找到了以下信息:https://www.ruby-forum.com/topic/2960191

这确实需要在机器上安装fcgiwrap。它真的很简单:

sudo apt-get install fcgiwrap

示例脚本(必须可执行)

#!/bin/sh
# -*- coding: utf-8 -*-
NAME=`"cpuinfo"`
echo "Content-type:text/html\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>"
date
echo "\nuname -a"
uname -a
echo "\ncpuinfo"
cat /proc/cpuinfo
echo "</pre></body></html>"

也将此作为包含文件使用,不仅限于shell 脚本。

location ~ (\.cgi|\.py|\.sh|\.pl|\.lua)$ {
    gzip off;
    root /var/www/$server_name;
    autoindex on;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    include /etc/nginx/fastcgi_params;
    fastcgi_param DOCUMENT_ROOT /var/www/$server_name;
    fastcgi_param SCRIPT_FILENAME /var/www/$server_name$fastcgi_script_name;
}

我发现它对我正在处理的工作非常有帮助,我希望它可以帮助您完成RaspberryPI项目。

答案 2 :(得分:3)

  1. 安装OpenResty(通过插件模块,OpenResty只是Nginx的增强版本)。为此请参考https://openresty.org/en/getting-started.html
  2. 在实例上配置aws cli
  3. 编写一个Shell脚本,该脚本从指定的S3存储桶下载文件
  4. 在nginx.conf文件中进行所需的更改
  5. 重新启动Nginx服务器

我已经使用curl测试了http请求,并在相应实例的/tmp目录中下载了文件:

curl -I http://localhost:8080/

输出:

curl -I http://localhost:8080/
HTTP/1.1 200 OK
Server: openresty/1.13.6.2
Date: Tue, 14 Aug 2018 07:34:49 GMT
Content-Type: text/plain
Connection: keep-alive 

nginx.conf文件的内容:

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}
http {
    server {
        listen 8080;
        location / {
           default_type text/html;
           content_by_lua '
                ngx.say("<p>hello, world</p>")
           ';
        }

        location / {
            content_by_lua_block{
            os.execute("sh /tmp/s3.sh")
            }
        }

    }
}

答案 3 :(得分:0)

您还可以使用nginx镜像模块并将其poxy_pass传递到可以运行任何内容的Web脚本,就我而言,我只是将其添加到主站点位置{...

mirror /mirror;
mirror_request_body off;

然后是一个名为mirror的新位置,我已经运行了一个执行任何操作的php脚本...

location = /mirror {
    internal;
    proxy_pass http://localhost/run_script.php;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

https://nginx.org/en/docs/http/ngx_http_mirror_module.html