我正在尝试使用 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 路径应该是什么,以使链接仍然可以在独立服务器模式下工作?第二个问题是,我是否正确使用了 VHostMonsterResource?我没有找到太多文档,我从网上找到的示例中拼凑了我的代码。