NGINX の SSI

OpenWrt サーバーで運用している NGINX で SSI を試しに使ったみた感じのメモ。

Apache と違って、NGINX では SSI のサポートは消極的・限定的。何年も前から状況が変わらないので、開発中というわけではないだろう。静的コンテンツに特化した NGINX の特性や開発ポリシー的なものと思われる。また、動的コンテンツを使いたいのであれば、サーバーサイドなら PHP、フロントエンドなら JavaScript という世の中の確立された相場もあるので、「今さら SSI」という感じでもあるだろう。

NGINX の設定

SSI は一々、NGINX で HTML の内容をパースするため、NGINX のパフォーマンスに影響が大きいので、無差別に SSI をオンにしないように、NGINX の conf の location で対象を絞った方がいいと思う。例えば、index.html にどうしてもアクセスカウンターを SSI で表示させたいと思っているとしたら、次のようにする:


location /index.html {
	ssi on;
	ssi_types text/plain; # デフォルトの text/html に加えて、text/plain も扱う場合
    
    root /www
}

前述のように、NGINX の SSI は、静的なファイルのインクルードか、CGI からの出力をインクルードする程度のものしか対応する気がないようである。CGI からの出力を HTML ファイルの中に埋め込んで表示する場合は、include virtual コマンドを使う:


引数を与えたい場合

ここで、アプリケーション・サーバーとしては uWSGI を使っている(👉 OpenWrt で uWSGI 環境を整える)。

CGI の場合

uWSGI の CGI モードで動かしている Python プログラムの場合、「?」の後の QUERY_STRING を「+」を区切り文字デリミターとして使い、各 key=value のペアは urlencode して「=」は %3D となっているものを使う必要があった。

このようにすることで、uWSGI の CGI プラグインは、最初のペア(key1=value1)を sys.argv[1] に、2 番目のペア(key2=value2)を sys.argv[2] に urldecode 済みで渡してくれる。

/www/cgi-bin/ssi/test.py


#!/usr/bin/env python

import sys

print('''
Content-Type: text/html

<p>ARGV1: {sys.argv[1]}<br>ARGV2: {sys.argv[2]}</p>
'''.strip())

HTML に埋め込まれた出力部分

WSGI の場合

uWSGI の WSGI モードで動かしている Python プログラムの場合、通常の WSGI プログラムと同じく、QUERY_STRING 全体が渡されるだけで、パースは自前で行う必要があり、CGI モードの場合のように sys.argv へのセットが行われるわけではない。一方で、「=」「&」に対する urlencode はしなくても問題はなかった。

ここで、uWSGI の設定ファイル中で、/wsgi/ssi/test.py へは URL 的には /wsgi/ssi でアクセスできるように設定している:

wsgi.ini


plugin = python

chdir = /www/wsgi
mount = /wsgi/ssi=ssi/test.py

Python プログラム側では、QUERY_STRING を urllib.parse を使ってパースした上で、dict 化している(wsgi の定石手法)。

/www/wsgi/ssi/test.py


#!/usr/bin/env python

import urllib.parse

def application(env, start_response):
	content = '<p>'
	params = dict(urllib.parse.parse_qsl(env['QUERY_STRING']))
	for key in params:
		content += f'{key}: {params[key]}<br>'
	content += '</p>'

	start_response('200 OK', [('Content-Type','text/html')])
	return [content.encode()]

HTML に埋め込まれた出力部分

コメント

このブログの人気の投稿

清水俊史『上座部仏教における聖典論の研究』

シークエンスパパともの先見の明

シークエンスパパとも 本物の霊能力