Python 用の Twisted フレームワークを使用して Web アプリケーションを作成しようとしています。スタンドアロン サーバー (ala twistd) として実行する場合、または Apache リバース プロキシでアプリケーションを動作させたい。例えば
アパッチhttps://example.com/twisted/ --> https://internal.example.com/
いくつかの調査を行った後、これを機能させるには vhost.VHostMonsterResource を使用する必要があるように思われました。そこで、次のディレクティブを使用して apache をセットアップしました。
ProxyPass /twisted https://localhost:8090/twisted/https/127.0.0.1:443
これが私の基本的なSSLサーバーです:
from twisted.web import server, resource, static
from twisted.internet import reactor
from twisted.application import service, internet
from twisted.internet.ssl import SSL
from twisted.web import vhost
import sys
import os.path
from textwrap import dedent
PORT = 8090
KEY_PATH = "/home/waldbiec/projects/python/twisted"
PATH = "/home/waldbiec/projects/python/twisted/static_files"
class Index(resource.Resource):
def render_GET(self, request):
html = dedent("""\
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Index</title>
</head>
<body>
<h1>Index</h1>
<ul>
<li><a href="/files/">Files</a></li>
</ul>
</body>
</html>
""")
return html
class ServerContextFactory:
def getContext(self):
"""
Create an SSL context.
Similar to twisted's echoserv_ssl example, except the private key
and certificate are in separate files.
"""
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file(os.path.join(KEY_PATH, 'serverkey.pem'))
ctx.use_certificate_file(os.path.join(KEY_PATH, 'servercert.pem'))
return ctx
class SSLService(internet.SSLServer):
def __init__(self):
root = resource.Resource()
root.putChild("", Index())
root.putChild("twisted", vhost.VHostMonsterResource())
root.putChild("files", static.File(PATH))
site = server.Site(root)
internet.SSLServer.__init__(self, PORT, site, ServerContextFactory())
application = service.Application("SSLServer")
ssl_service = SSLService()
ssl_service.setServiceParent(application)
ほとんど動作しますが、絶対リンクであるため、apache をリバース プロキシとして使用すると、インデックス ページの「ファイル」リンクが希望どおりに動作しません。
私の主な質問は、相対リンクを使用する以外に、リンクがスタンドアロンサーバーモードでも機能するように、リンクの完全な URL パスを計算する方法はありますか? 2 つ目の質問は、VHostMonsterResource を正しく使用していますか? 多くのドキュメントが見つからなかったので、Web で見つけた例からコードをつなぎ合わせました。