我知道您可以根据域或路径进行重定向以重写 URI 以指向特定于站点的位置,并且我还看到了针对每个站点的一些粗鲁if
和elif
声明,如下面的代码所示,我想避免.
if site == 'site1':
...
elif site == 'site2:
...
从一个通用的 Python Web 框架(即 Pylons、TurboGears 等)运行多个站点有哪些好的和聪明的方法?
我知道您可以根据域或路径进行重定向以重写 URI 以指向特定于站点的位置,并且我还看到了针对每个站点的一些粗鲁if
和elif
声明,如下面的代码所示,我想避免.
if site == 'site1':
...
elif site == 'site2:
...
从一个通用的 Python Web 框架(即 Pylons、TurboGears 等)运行多个站点有哪些好的和聪明的方法?
Django 内置了这个。请参阅站点框架。
作为一种通用技术,在附加到您希望特定于主机的数据的数据库模式中包含一个“主机”列,然后Host
在检索数据时在查询中包含 HTTP 标头。
在带有 mod_python 的 apache 上使用 Django,我只需使用以下 apache 配置托管多个(不相关的)django 站点:
<VirtualHost 1.2.3.4>
DocumentRoot /www/site1
ServerName site1.com
<Location />
SetHandler python-program
SetEnv DJANGO_SETTINGS_MODULE site1.settings
PythonPath "['/www'] + sys.path"
PythonDebug On
PythonInterpreter site1
</Location>
</VirtualHost>
<VirtualHost 1.2.3.4>
DocumentRoot /www/site2
ServerName site2.com
<Location />
SetHandler python-program
SetEnv DJANGO_SETTINGS_MODULE site2.settings
PythonPath "['/www'] + sys.path"
PythonDebug On
PythonInterpreter site2
</Location>
</VirtualHost>
不需要多个 apache 实例或代理服务器。为每个站点使用不同的 PythonInterpreter 指令(您输入的名称是任意的)使命名空间保持独立。
我使用 CherryPy 作为我的 Web 服务器(它与 Turbogears 捆绑在一起),我只是在绑定到 localhost 的不同端口上运行 CherryPy Web 服务器的多个实例。然后我使用 mod_proxy 和 mod_rewrite 配置 Apache,以根据 HTTP 请求将请求透明地转发到正确的端口。
在本地端口上使用多个服务器实例是个好主意,但您不需要功能齐全的 Web 服务器来重定向 HTTP 请求。
我会使用磅作为反向代理来完成这项工作。它体积小、速度快、简单,完全符合我们的需要。
什么是英镑:
- 反向代理:它将请求从客户端浏览器传递到一个或多个后端服务器。
- 负载均衡器:它将来自客户端浏览器的请求分发到多个后端服务器,同时保留会话信息。
- SSL 包装器:Pound 将解密来自客户端浏览器的 HTTPS 请求,并将它们作为纯 HTTP 传递给后端服务器。
- HTTP/HTTPS sanitizer:Pound 将验证请求的正确性并只接受格式正确的请求。
- 故障转移服务器:如果后端服务器发生故障,Pound 会注意到这一事实并停止向其传递请求,直到它恢复为止。
- 请求重定向器:可以根据请求的 URL 在服务器之间分发请求。