【问题标题】:Main and beta WSGI apps主要和测试版 WSGI 应用程序
【发布时间】:2014-10-21 19:01:01
【问题描述】:

好的,所以我已经四处寻找了几个小时,这让我很难过。

我有一个尚未投入生产的应用程序,我的客户希望将其拆分为不太稳定和更稳定的应用程序。所以,我选择将开发版本移动到/var/www/dev,将半稳定版本复制到/var/www/master(在调试之前,半稳定版本也在/var/www,以免严重破坏访问)。这个想法是domain.com 将始终有效,新的东西/测试将在dev.domain.com 上。

因此,according the apache docs,我现在有两个虚拟主机:

<VirtualHost _default_:443>
ServerAdmin email@example.com
DocumentRoot "/var/www/master"
ServerName domain.com
SSLEngine on
# [ssl stuff]
Header add Strict-Transport-Security "max-age=15768000"
WSGIDaemonProcess master_wsgi user=www-data group=www-data
WSGIScriptAlias /master "/var/www/master/src/main.py"
# [ Aliases .... ]
<Directory "/var/www/master/src">
  Options +ExecCGI
  AddHandler wsgi-script .py
  Order allow,deny
  Allow from all
</Directory>
<Directory "/var/www/master">
  Options +ExecCGI
  AddHandler wsgi-script .py
  Order allow,deny
  Allow from all
</Directory>
 <Location /master>
     # [HTTP auth stuff]
     WSGIProcessGroup master_wsgi
 </Location>
 # modules, cache, error directories, etc
</VirtualHost>

然后复制完全相同的东西,除了:

DocumentRoot "/var/www/dev"
ServerName dev.domain.com
ServerPath /dev/

以及所有其他master 在别名、守护进程等中的实例都变为dev(我确实做了replace-string)。守护进程和进程组是我chasing another SO answer,由于子目录的要求而没有成功(因为显然它们都需要在一个虚拟主机中,但我不能在&lt;Location&gt; 中指定DocumentRoot

现在,如果我这样做,我得到的只是两者的文件列表。请注意,正确的文件列表,但只是文件列表。 如果我去任何一个并将旧副本所在的WSGIScriptAlias更改为/,它就可以像往常一样从该python文件中正常工作(当然这意味着开发内容实际上指向旧模板,所以这不好,因为我不能更改模板,只能更改脚本,因为 templateDir = os.path.realpath(os.path.dirname(os.path.realpath(__file__)) + "/../templates/") + "/" 始终是 /var/www/templates)。

这不是错误,它只是给出文件列表,所以它指向了正确的位置,但是 WSGIScriptAlias 没有做它应该做的事情?我错过了什么?

如果它是相关的,这是httpd.conf 中相关 VH 之前的内容,尽管我对此表示怀疑:

LoadModule wsgi_module modules/mod_wsgi.so
WSGICallableObject app
WSGIPythonHome /usr/local/bin/python
NameVirtualHost *:80
<VirtualHost *:80>
  ServerName domain.com
  Redirect permanent / https://domain.com/
## Heading ##</VirtualHost>

【问题讨论】:

    标签: python apache apache2 mod-wsgi wsgi


    【解决方案1】:

    如果您通过 VirtualHost 分隔实例,为什么不想将 WSGI 应用程序挂载到站点的“/”?为什么将它们放在不同的子 URL 上?

    不管怎样,不管这个问题是什么,你都在做很多不正确的事情。因此,主要问题是:

    1 - 您永远不应将 DocumentRoot 设置为您的网站源代码所在的父目录。 PHP 可能需要它,但 mod_wsgi 不需要。通过将您的代码放在 DocumentRoot 下,您可以确保如果出现配置错误,人们可以下载您的源代码。我想你不希望这样,特别是如果代码包含数据库密码和其他敏感信息。

    2 - WSGIPythonHome 的值是一个目录。将其设置到 Python 二进制文件的位置是错误的,并且以这种方式设置它不会实现任何目标,鉴于此,您可能不需要它。

    3 - 你不需要两个:

    <Directory "/var/www/master/src">
      Options +ExecCGI
      AddHandler wsgi-script .py
      Order allow,deny
      Allow from all
    </Directory>
    <Directory "/var/www/master">
      Options +ExecCGI
      AddHandler wsgi-script .py
      Order allow,deny
      Allow from all
    </Directory>
    

    当您指定目录/位置块时,它也适用于其下方的子目录/URL。

    同时,您不需要 ExecCGI 或 AddHandler 指令。

    实际上你应该只需要包含 WSGI 脚本文件的目录的 Directory 块,除非你也有静态文件资产。

    <Directory "/var/www/master/src">
      Order allow,deny
      Allow from all
    </Directory>
    

    当然要注意关于在 DocumentRoot 下有东西的警告。

    如果您有静态文件资产,则应使用单独的 Alias 指令从它们所在的目录映射它们,并根据需要在该特定目录上设置 Apache 访问控制。静态资产的目录不应该也包含你的代码,所以不要混用,要分开。

    将每个站点的内容安装在“/”处,更好地解释您在使用模板时遇到的问题会有所帮助。

    【讨论】:

    • 是的,其他别名目录中有静态文件资产。 python 路径也是一个目录(该目录中的二进制文件是python)。理由是,最终,每个子目录本质上都是 git 分支的镜像(发布将有许多这样的组织变化),所以理想情况下它们是完全独立的。因此,/var/www/master/src 中引用的模板将引用/var/www/master/templates 中的模板,dev 也是如此。想法是查看main.py 的目录,然后选择相关模板。
    • 虽然我想,既然你提到了它,如果我将应用程序保存在/ 中,如果它要求子域,我可以指向一个目录,如果不是,则指向另一个目录....应该是类似于Request.host_url 在 webob 中的一些拆分和检查,但我现在真的应该尽快将其全部包含在内(参见上面关于发布的警告)。它们是同一事物的两个版本,而不是真正的两个独立应用程序——它们的行为应该是这样的。
    • 你指出我在正确的轨道上。后来进行了一些清理和小修复,它开始正常工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2011-02-07
    • 2012-09-07
    相关资源
    最近更新 更多