0

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 で見つけた例からコードをつなぎ合わせました。

4

3 に答える 3

1

これはやりすぎのようです。VHostMonsterResource を使用する理由 これが必要な特定の理由があるかもしれませんが....ほとんどの場合:

  • Apacheにsslを処理させます。次に、apache は、非 SSL グッズを提供するねじれたアプリに渡され、apache に戻されます。Apache の構成に関するネット上のドキュメント。

  • 本当にしたい場合は、sslポートに別のサーバーを追加できます

テストしていませんが、構造は次のようになります。

root = resource.Resource()
root.putChild("", Index())
root.putChild("files", static.File(PATH))

http = internet.TCPServer(8090, server.Site(root))
# change this port # to 443 if no apache
https= internet.SSLServer(8443, server.Site(root), ServerContextFactory())

application = service.Application("http_https_Server")
http.setServiceParent(application)
https.setServiceParent(application)

開発者向けのヒント: 開発中に、数行追加するだけで、ssl サーバーを追加して、実行中の web_server に SSH で接続し、変数やその他の状態を調べることができます。クールな方法。

ssl = internet.TCPServer(8022, getManholeFactory(globals(), waldbiec ='some non-system waldbiec passwork')) 
ssl.setServiceParent(application)
于 2012-07-14T00:02:49.610 に答える
0

そのため、vhost.VHostMonsterResourceソースを調べた後、ApacheProxyPassURLの追加マーカーで逆プロキシURLプレフィックスを指定できる別のリソースを作成できると判断しました。

最初に、vhost.VHostMonsterResourceは、URLパスにエンコードされたデータからリバースプロキシのホストとポートを特定する、バックエンドWebサイトの特別なURLであることが最終的にわかりました。URLパス(スキームとネットの場所がない)は次のようになります。

/$PATH_TO_VHMONST_RES/$REV_PROXY_SCHEME/$REV_PROXY_NETLOC/real/url/components/

$PATH_TO_VHMONST : Path in the (internal) twisted site that corresponds to the VHostMonsterResource resource.
$REV_PROXY_SCHEME : http or https that is being used by the reverse proxy (Apache).
$REV_PROXY_NETLOC : The net location (host and port) or the reverse proxy (Apache).

したがって、この情報をURLにエンコードすることにより、リバースプロキシから構成を制御できます。その結果、ツイストサイトはリバースプロキシからのHTTPリクエストを理解します。

ただし、元の例のように外部サイトのサブツリーをプロキシしている場合、この情報は失われます。したがって、私の解決策は、追加のパス情報をデコードできる追加のリソースを作成することでした。新しいプロキシURLパスは次のようになります。

/$PATH_TO_MANGLE_RES/$REV_PROXY_PATH_PREFIX/$VHOSTMONST_MARKER/$REV_PROXY_SCHEME/$REV_PROXY_NETLOC/real/url/components/

$PATH_TO_MANGLE_RES : The path to the resource that decodes the reverse proxy path info.
$REV_PROXY_PATH_PREFIX : The subtree prefix of the reverse proxy.
$VHOSTMONST_MARKER : A path component (e.g. "vhost") that signals a VHostMonster Resource should be used to further decode the path.
于 2012-07-22T19:54:47.073 に答える
0

Twisted アプリケーションを構成して、独自のルートの場所を認識できるようにします。その情報を使用して、URL を正しく生成できます。

于 2012-07-13T17:31:27.807 に答える