主要和beta WSGI应用程序

时间:2014-08-28 02:45:04

标签: python apache apache2 mod-wsgi wsgi

好的,所以我一直在四处寻找,这让我很难过。

我有一个尚未投入生产的应用程序,我的客户希望它分为不稳定和更稳定的应用程序。所以,我选择将开发版本移动到/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由于子目录要求而没有成功(因为显然它们都需要在一个VirtualHost中,但我不能在{DocumentRoot中指定<Location> 1}})

现在,如果我这样做,我得到的只是两者的文件列表。正确的文件列表,请注意文件列表。 如果我去任何一个并将WSGIScriptAlias更改为旧副本所在的/,它可以正常工作,因为它始终具有(尽管这意味着开发人员实际上指向了旧的模板,因为我无法更改模板,只是脚本,因为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>

1 个答案:

答案 0 :(得分:1)

如果您要通过VirtualHost分隔实例,为什么您不希望在&#39; /&#39;安装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访问控制。静态资产目录不应包含您的代码,因此请勿将它们混合在一起,并将它们分开。

安装在&#39; /&#39;对于每个网站,您对模板问题的更好解释将有所帮助。

相关问题