Когда хочется создать динамическую веб страницу, но не знаешь языков программирования, кроме умения писать bash скрипты, то даже это достаточно чтобы создать какую-нибудь простую веб страницу.
Данный способ подойдет не только для bash скриптов, но для любого приложения, вывод stdout которого будет отправлен в браузер.
Для этого необходимо установить fcgiwrap, программу, предназначенную запуска CGI-приложений через FastCGI
sudo apt-get install fcgiwrap
Создадим bash скрипт index.sh, который, например, будет просто выводить текущее время
#!/bin/bash
echo "Content-type: text/plain"
echo ""
date
Согласно спецификации HTTP, ответ состоит из заголовок и тела ответа разделенные пустой строкой. Поэтому обязательно после заголовков необходимо добавлять пустую строку и так же необходимо отправить какие-нибудь заголовки
Настройка nginx
Настроим nginx таким образом, чтобы все запросы отправлялись на файл index.sh.
server {
server_name bash.example.com;
root /var/www/bash.example.com;
autoindex off;
location / {
# try to serve file directly, fallback to index.sh
try_files $uri /index.sh$is_args$args;
}
location ~ \.sh(/|$) {
fastcgi_pass unix:/var/run/fcgiwrap.socket;
include /etc/nginx/fastcgi_params;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
internal;
}
}
Файл /etc/nginx/fastcgi_params обычно входит в стандартную установку nginx и заданные переменные будут доступны как обычные переменные в bash скрипте, например
echo "$DOCUMENT_ROOT" # Выведет /var/www/bash.example.com
Получение тела запроса
Чтобы получить содержимое, например, POST запроса, укажем nginx сохранять его во временный файл. Для этого в location добавим несколько строк
location ~ \.sh(/|$) {
client_body_temp_path /tmp;
fastcgi_pass_request_body off;
client_body_in_file_only clean;
fastcgi_param REQUEST_BODY_FILE $request_body_file;
......
}
- client_body_temp_path – указываем директорию, куда будут сохраняться в временные файлы с содержимым запроса
- fastcgi_pass_request_body off – запрещаем передачу исходного тела запроса на FastCGI-сервер
- client_body_in_file_only clean – разрешаем сохранение тело запроса во временный файл и удаляем его после обработки запроса
- fastcgi_param REQUEST_BODY_FILE $request_body_file – сохраняем имя временного файла в переменной $REQUEST_BODY_FILE