【ubuntu】nginx環境でシェルスクリプトをcgiとして動かす | 瀬戸内の雲のように

【ubuntu】nginx環境でシェルスクリプトをcgiとして動かす

Posted: 2018-03-06


スポンサーリンク

目次

背景

サーバエンジニアにとって最も身近な開発言語はbashだと思います。プログラミングはできないけどシェル(スクリプト)は書けるよ、という人はけっこう多いのではないでしょうか。

一方、WEBページ等で使うcgiには一般的にPHPやperlが使われることが多いです。なので、webサーバなどのインフラまではサーバエンジニア、そこから先は開発の人 という線引になることが多いかと思います。

しかしフルスタックエンジニアが求められる現在、どうせなら最後まで自分でやりたい!でもPHPは書けない。。ならシェルスクリプトをcgiにすればいいじゃないか!ということでいろいろ調べてみました。

参考: CentOS7で構築する場合の手順
 

環境

  • ubuntu 16.04.3 LTS (Xenial Xerus)
  • nginx/1.10.3 (Ubuntu)
  • fcgiwrap/xenial,now 1.1.0-6 amd64
  • GNU bash, バージョン 4.3.48(1)-release (x86_64-pc-linux-gnu)

環境構築

まずは必要なパッケージをインストールします。
ここではnginxとfcgiwrapのインストール手順を書きます。

 

nginxのインストール

apt で一発です。

apt install -y nginx

起動も一瞬です

service nginx start

psコマンドを打って以下のような感じで表示されれば起動できています。

# ps -ef | grep nginx
root      9295     1  0 15:24 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  9296  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9297  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9298  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9299  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9300  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9301  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9302  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9303  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9304  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9305  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9306  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9307  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9308  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9309  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9310  9295  0 15:24 ?        00:00:00 nginx: worker process
www-data  9311  9295  0 15:24 ?        00:00:00 nginx: worker process
root      9406  9023  0 15:25 pts/20   00:00:00 grep --color=auto nginx

 
最後に自分自身にcurlコマンドを打って、htmlのレスポンスが返ってくれば正しく使えています。

curl http://localhost

レスポンスはこんな感じ(nginxデフォルトのindex.html)

<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>

 

fastcgiのインストール

次にfastcgiをインストールします。

このfastcgiがなぜ必要かというと、本来webサーバ(ここではnginx)は静的なhtmlコンテンツを返す機能だけしかなく、プログラムを実行するような機能は無い物なのです。

そこでその機能を提供するのがfastcgiで、nginxとはtcp or unixソケットを使って実行結果のやり取りをします。

 
さて本題のインストールです。これもaptで一発です。

apt install fcgiwrap

 

nginxの設定

次にfastcgiが動くようにnginxを設定します。
ここでは新しい設定ファイルをincludeディレクトリに作成します。

cd /etc/nginx/conf.d/
vim bash_cgi.conf

とりあえず動くだけでよければ、以下の設定でOKです

# vim bash_cgi.conf
server {
    listen       80;
    server_name  localhost;

    location ~ \.sh$ {
      root   /usr/share/nginx/html/;
      fastcgi_pass      unix:/var/run/fcgiwrap.socket;
      include           /etc/nginx/fastcgi_params;
      fastcgi_param     SCRIPT_FILENAME   $document_root$fastcgi_script_name;
    }
}

これで、.shで終わるファイルはすべて実行可能になります。

 

cgiの作成

とりあえずhello world的なcgiを作ります。

vim /usr/share/nginx/html/hello.sh
#!/bin/sh
echo 'Content-type: text/html'  
echo ''
### 上記2行がないと動作しない
echo '<html>'
echo '<head></head>'
echo '<body>'
echo '<h1>hello world!!</h1>'
echo '</body>'
echo '</html>'

これでnginxを再起動します。

systemctl restart nginx.service

試してみる

ここまでで準備は完了です。試しにlocalhostから確認してみます。

curl http://localhost/hello.sh

以下のように結果が返ってくればOKです。

<html>
<head></head>
<body>
<h1>hello world!!</h1>
</body>
</html>

おまけ:パラメータの受け取り方

cgiではクエリパラメータ(URLの末尾に?でつなげるやつ)やフォームパラメータ(POSTで渡すやつ)で値を受け取りたいことが多いです。
bashのcgiの場合は以下の方法で受け取ることができます。

クエリパラメータ

変数${QUERY_STRING}に格納されます。

サンプルスクリプト

#!/bin/sh
echo 'Content-type: text/html'
echo ''
echo '<html>'
echo '<head></head>'
echo '<body>'
echo '<h1>hello world!!</h1>'
echo "<p>your parameter is ${QUERY_STRING} .</p>"
echo '</body>'
echo '</html>'

こう実行すると

curl "http://127.0.0.1/query_param.sh?test=1&test2=2"

こういう結果が返ってきます

<html>
<head></head>
<body>
<h1>hello world!!</h1>
<p>your parameter is test=1&test2=2 .</p>
</body>
</html>

フォームパラメータ

標準入力に格納されるらしいです。(あんまり意味がわかってない..)
以下のように`cat`で取得できます。

#!/bin/sh
echo 'Content-type: text/html'
echo ''
echo '<html>'
echo '<head></head>'
echo '<body>'
echo '<h1>hello world!!</h1>'
echo "<p>your parameter is `cat` .</p>"
echo '</body>'
echo '</html>'

こう実行すると

curl -X POST -d "test=1" -d "test2=2" "http://127.0.0.1/form_param.sh"

こういう結果が返ってきます。

<html>
<head></head>
<body>
<h1>hello world!!</h1>
<p>your parameter is test=1&test2=2 .</p>
</body>
</html>

以上となります。


スポンサーリンク




コメント一覧

2020/09/16 20:34:59

AmandaGalさん

ОТКРЫЛИ СУПЕР-ПАКИ с ЛУЧШИМИ КУМИРАМИ I БИТВА СОСТАВОВ vs FACELESS FIFA 20


2020/09/17 13:15:25

Rainaobsesさん

Sofias änglarMelindas kamp efter ”Lilla hjärtats” tragiska ödeStreama nu på Dplay


2020/09/24 00:08:00

Evelyndoushさん

[url=https://anthonyuly.byworld.info/soxmtKWrYZCas5w/ca-a-mitpo-ina-ppotiv-andpe-petpova-to-ppoizo-lo-i-kto-havpal.html][img]https://i.ytimg.com/vi/NU4Sut0ZbM8/hqdefault.jpg[/img][/url]

Caшa Mитpoшинa пpoтив Aндpeя Пeтpoвa ЧТO [url=https://anthonyuly.byworld.info/soxmtKWrYZCas5w/ca-a-mitpo-ina-ppotiv-andpe-petpova-to-ppoizo-lo-i-kto-havpal.html]ПPOИЗOШЛO[/url] И КTO HAВPAЛ?


2020/09/17 22:27:01

DevinAveptさん

Eladio CarrioМЃn - Corona Freestyle ( Video Oficial )


2020/09/20 16:16:50

BettyBubさん

Anter Kayu Pakai Toyota Hilux - #Dirumahaja


2020/09/22 22:03:42

RosalynNizさん

МОИ ДЕТИ ВЫЖИВАЮТ ВНУТРИ ВАГОНЕТКИ В МАЙНКРАФТ


2020/09/23 05:39:17

Pavlosfplさん

Привет друзья!
https://drive.google.com/file/d/1M6KESe6-2SPzKQijWyIrS7jND2KDnClq/view?usp=sharing
Есть такой интересный сайт для заказа бурения скважин на воду.Основной деятельностью нашей компании является обеспечение клиента качественной питьевой водой в достаточном количестве. Компания «ПРОФИБУР» использует современный роторный способ бурения, его можно использовать на самых разных грунтах. Ждем Вас у нас в офисе.
Увидимся!
https://airforceots.com/memberlist.php?mode=viewprofile&u=454401
http://docbao365.net/baomoi/profile.php?id=1242056
http://caravaning.in.ua/forum/memberlist.php?mode=viewprofile&u=8653
http://xn--80aakeld5akvia2a6m.xn--p1ai/user/Pavlosagr/
https://dnanir.net/member.php?u=246888


2020/09/24 13:31:05

Yolandalethyさん

[url=https://rohitgiri.arposts.info/aL6Kp6Nwhpuhk2I/lockdown-rescued-two-snakes-in-rainy-night-fursekhola-bagaltari-pokhara-rohit-giri.html][img]https://i.ytimg.com/vi/2ZWsr9NkiZ0/hqdefault.jpg[/img][/url]

Lockdown " Rescued Two Snakes in Rainy Night"Fursekhola & [url=https://rohitgiri.arposts.info/aL6Kp6Nwhpuhk2I/lockdown-rescued-two-snakes-in-rainy-night-fursekhola-bagaltari-pokhara-rohit-giri.html]BagaltariPokharaRohit[/url] Giri


2020/09/25 00:36:42

JuliaLafさん

[url=https://dougdemuro.lvlocal.info/here-s/nX2qsqqEg5yId5E.html][img]https://i.ytimg.com/vi/fGDNzMLfSBY/hqdefault.jpg[/img][/url]

Here's Why [url=https://dougdemuro.lvlocal.info/here-s/nX2qsqqEg5yId5E.html]the[/url] BMW M3 E92 Was the Craziest BMW M3


2020/09/25 22:49:30

AshleySoTさん

[url=https://hasteraho.arworlds.info/2qhroXSVYpxgaaY/v-sk][img]https://i.ytimg.com/vi/xu2jDc0h01s/hqdefault.jpg[/img][/url]

वास्को डी गामा की गन अंदाज़ [url=https://hasteraho.arworlds.info/2qhroXSVYpxgaaY/v-sk]अपना[/url] अपना ज़बरदस्त कॉमेडी - सलमान खान - आमिर खान - परेश रावल


2020/09/26 08:38:49

RobtDexさん

[url=https://megaremont.pro/serpukhov-restavratsiya-vann]Способы реставрации ванн в Серпухове[/url]


2020/09/26 16:34:55

RobtDexさん

[url=https://megaremont.pro/serpukhov-restavratsiya-vann]Обновление ванн[/url]


2020/09/18 11:46:44

Gertiephomyさん

Maaya16th Sep 2020PromoTarangTV


2020/09/19 13:21:07

Mildredmoxさん

Dana White Announces Contract WinnersWeek 7 - Contender Series Season 4


2020/09/20 00:04:58

Juanitacoxさん

💀 สตอรี่ที่ 6SS5 เล่าผีญี่ปุ่นตอนที่ 7-9YamiShibaiSTORIES1923สปอยหนังสปอยหนังผี


2020/09/21 14:14:19

CynthiaDrierさん

CRAVATA Feat DJ Med & Sosa Lossa - Daret Li Tyara (EXCLUSIVE)ЩѓШ±Ш§ЩЃШ§Ш·Ш§ - ШЇШ§Ш±ШЄ Щ„ЩЉШ§ Ш§Щ„Ш·ЩЉШ§Ш±Ш©


2020/09/22 10:16:31

Antonionzhさん

Доброго времени суток товарищи!
Предлагаем Вашему вниманию высококачественные профессиональные плёнки.
Наша организация"ООО Защитные плёнки" работает 15 лет на рынке этой продукции в Беларуси.
Мы можем предложить Вам Защитные плёнки ,архитектурные плёнки,декоративные плёнки,автомобильные плёнки и противопожарные плёнки.
Более подробная информация размещена https://drive.google.com/file/d/1hceZWkDFW4mFU9sDZ64bQAi3ss41Fo5g/view?usp=sharing
С уважением,коллектив "ООО Защитные плёнки".


2020/09/23 13:16:24

AndreaUnenoさん

[url=https://alexgyvershow.byworld.info/tayr2WeAZHt9q6U/----prostoj---lektronnyj-zamok-svoimi-rukami.html][img]https://i.ytimg.com/vi/Quyx7I3EEEA/hqdefault.jpg[/img][/url]

[url=https://alexgyvershow.byworld.info/tayr2WeAZHt9q6U/----prostoj---lektronnyj-zamok-svoimi-rukami.html]🔒Простой электронный замоксвоими руками[/url]


2020/09/27 02:35:21

Zelenazdkさん

Добрый день товарищи[url=https://belyjmost.by/]![/url]
Наша организация занимается свыше 10 лет продажей промышленных и фасадных красок в городе Минске.Основные направления и виды нашей деятельности:
https://drive.google.com/file/d/1Rjn-phsZoQftAlG7KZHhbxRAHyVUWC20/view?usp=sharing
Всегда рады помочь Вам! С уважением, BELYJMOST
http://yszq.net/home.php?mod=space&uid=386030
https://www.heroscapers.com/community/member.php?u=117503
http://boss.why3s.cc/boss/home.php?mod=space&uid=70970
http://www.littlefx.com/member.php?314763-Zelenatrx
http://www.jdwxs8.com/home.php?mod=space&uid=725571


2020/09/27 13:51:04

Antoniokruさん

Здравствуйте друзья[url=http://sfilm.by/]![/url]
Предлагаем Вашему вниманию высококачественные профессиональные плёнки.
Наша организация"ООО Защитные плёнки" работает 15 лет на рынке этой продукции в Беларуси.
Мы можем предложить Вам [url=http://sfilm.by]Защитные плёнки[/url] ,[url=http://sfilm.by]архитектурные плёнки[/url],[url=http://sfilm.by]декоративные плёнки[/url],[url=http://sfilm.by]автомобильные плёнки[/url] и [url=http://sfilm.by]противопожарные плёнки[/url].
Более подробная информация размещена https://drive.google.com/file/d/1hceZWkDFW4mFU9sDZ64bQAi3ss41Fo5g/view?usp=sharing
С уважением,коллектив "ООО Защитные плёнки".



コメントを投稿する


お名前


コメント内容





TOP back