Меню Закрыть

Создание сайта на bash

Когда хочется создать динамическую веб страницу, но не знаешь языков программирования, кроме умения писать 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

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии