web-dev-qa-db-fra.com

nginx - Comment exécuter un script shell à chaque requête?

Je souhaite exécuter un script Shell chaque fois que mon serveur nginx reçoit une requête HTTP. Des moyens simples de faire cela?

49
Saswat Padhi

Vous pouvez exécuter un script Shell via le code Lua à partir du fichier nginx.conf. Vous devez avoir le HttpLuaModule pour pouvoir le faire.

Voici un exemple pour faire ceci.

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

J'ai trouvé les informations suivantes en ligne à cette adresse: https://www.Ruby-forum.com/topic/2960191

Cela suppose que vous avez installé fcgiwrap sur la machine. C'est vraiment aussi simple que:

Sudo apt-get install fcgiwrap

Exemple de script (doit être exécutable)

#!/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>"

Utilisant également ceci comme fichier d'inclusion, non limité aux seuls scripts 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;
}

Je l’ai trouvé extrêmement utile pour ce sur quoi je travaille. J'espère que cela vous aidera dans votre projet RaspberryPI.

40
Don Duvall
  1. Installez OpenResty (OpenResty n’est qu’une version améliorée de Nginx au moyen de modules d’addon). Reportez-vous à https://openresty.org/fr/getting-started.html pour cela.
  2. Configurez aws cli sur l'instance
  3. Écrire un script shell qui télécharge un fichier depuis un compartiment S3 spécifié
  4. Effectuez les modifications requises dans le fichier nginx.conf
  5. Redémarrez le serveur nginx

J'ai testé la requête http en utilisant curl et le fichier est téléchargé dans /tmp répertoire de l'instance respective:

curl -I http://localhost:8080/

Sortie:

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 

Contenu du fichier 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
Durgesh Pandey

Vous pouvez également utiliser le module miroir nginx et poxy_pass pour un script Web qui exécute quoi que ce soit. Dans mon cas, je viens d'ajouter ceci à l'emplacement de mon site principal {...

mirror /mirror;
mirror_request_body off;

et puis un nouvel emplacement appelé miroir que j'avais exécuté un script php qui exécutait n'importe quoi ...

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

0
kierzo