【问题标题】:How to use SSL with Django app (deployed using mod_wsgi and virtualenv)如何在 Django 应用程序中使用 SSL(使用 mod_wsgi 和 virtualenv 部署)
【发布时间】:2011-12-16 23:22:57
【问题描述】:

免责声明:我真的不知道自己在做什么,所以我的措辞可能有误。我以前也从未在这里问过/回答过问题!

我有一个在 Apache 上运行的 Django 应用程序,我使用 mod_wsgi 和 virtualenv 部署它。我希望应用程序的某些部分使用 SSL,但是当我安装 SSL 证书时,https URL 会从我的 public_html 文件夹而不是应用程序(在 public_html 之外)转到 index.html 文件

例如,访问https://tradekandi.com。该 URL 只是一个基本的 HTML 文件:public_html/index.html 然后访问http://tradekandi.com。这是我的 Django 页面(处于维护模式)。

我整天都在搜索 stackoverflow 和 Google。我尝试从虚拟主机文件中删除 documentroot,但没有任何效果。我尝试向其中添加 SetEnvIf X-Forwarded-Proto https HTTPS=1 行,但这也没有任何作用。

我的虚拟主机文件中有以下几行:

SSLEngine on 
SSLCertificateFile /etc/ssl/certs/tradekandi.com.crt
SSLCertificateKeyFile /etc/ssl/private/tradekandi.com.key
SSLCACertificateFile /etc/ssl/certs/tradekandi.com.cabundle

每当我进行任何更改时,我都会重新启动 apache 并“触摸”应用程序的 wsgi 文件。

如何使 https URL 加载 Django 应用程序?任何帮助将非常感激。谢谢。

更多httpd配置:

<VirtualHost 69.65.42.153:80>
ServerName tradekandi.com
ServerAlias www.tradekandi.com
DocumentRoot /home/trade/public_html
ServerAdmin webmaster@tradekandi.com
UseCanonicalName Off
CustomLog /usr/local/apache/domlogs/tradekandi.com combined
CustomLog /usr/local/apache/domlogs/tradekandi.com-bytes_log "%{%s}t %I .\n%{%s}t %O ."
## User trade # Needed for Cpanel::ApacheConf
<IfModule mod_suphp.c>
    suPHP_UserGroup trade trade
</IfModule>
<IfModule !mod_disable_suexec.c>
    SuexecUserGroup trade trade
</IfModule>
ScriptAlias /cgi-bin/ /home/trade/public_html/cgi-bin/

Include "/usr/local/apache/conf/userdata/*.conf"  
Include "/usr/local/apache/conf/userdata/*.owner-root" 
Include "/usr/local/apache/conf/userdata/std/*.conf" 
Include "/usr/local/apache/conf/userdata/std/*.owner-root" 
Include "/usr/local/apache/conf/userdata/std/2/*.conf" 
Include "/usr/local/apache/conf/userdata/std/2/*.owner-root" 
Include "/usr/local/apache/conf/userdata/std/2/trade/*.conf"  
Include "/usr/local/apache/conf/userdata/std/2/trade/tradekandi.com/*.conf"

</VirtualHost>

<VirtualHost 69.65.42.153:443>
ServerName tradekandi.com
ServerAlias www.tradekandi.com
DocumentRoot /home/trade/public_html
ServerAdmin webmaster@tradekandi.com
UseCanonicalName Off
CustomLog /usr/local/apache/domlogs/tradekandi.com combined
CustomLog /usr/local/apache/domlogs/tradekandi.com-bytes_log "%{%s}t %I .\n%{%s}t %O ."
## User nobody # Needed for Cpanel::ApacheConf
<IfModule mod_suphp.c>
    suPHP_UserGroup nobody nobody
</IfModule>
ScriptAlias /cgi-bin/ /home/trade/public_html/cgi-bin/
SSLEngine on

SSLCertificateFile /etc/ssl/certs/tradekandi.com.crt
SSLCertificateKeyFile /etc/ssl/private/tradekandi.com.key
SSLCACertificateFile /etc/ssl/certs/tradekandi.com.cabundle
CustomLog /usr/local/apache/domlogs/tradekandi.com-ssl_log combined
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
<Directory "/home/trade/public_html/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>
Include "/usr/local/apache/conf/userdata/*.conf"
</VirtualHost>

如果相关的话,这是一个运行 CentOS 的专用服务器,我也用它来托管一个基于 PHP 的站点。

wsgi 文件:

import os
import sys
sys.stdout = sys.stderr

from os.path import abspath, dirname, join
from site import addsitedir
sys.path.append('/home/trade/sites/tradekandi.com.env/lib/python2.7/site-packages')
sys.path.insert(0, abspath(join(dirname(__file__), "../../")))

from django.conf import settings
os.environ["DJANGO_SETTINGS_MODULE"] = "trade.settings"

sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

带有 mod_wsgi 指令的额外配置文件:

Alias /static/ /home/trade/public_html/static/

<Directory /home/trade/public_html/static>
Order deny,allow
Allow from all
</Directory>

WSGIDaemonProcess trade python-path=/home/trade/sites/tradekandi.com.env/lib/python2.7/site-packages
WSGIProcessGroup trade

WSGIScriptAlias / /home/trade/sites/tradekandi.com.env/site/trade/deploy/pinax.wsgi

<Directory /home/trade/sites/tradekandi.com.env/site/trade/deploy>
Order deny,allow
Allow from all
</Directory>

【问题讨论】:

  • 我们需要了解更多的 HTTPd 配置。
  • 哪个文件包含 mod_wsgi 指令?
  • 不,mod_wsgi 指令。 WSGIScriptAlias 等。
  • 哦,我忘了。那在我的 extra.conf 中,我使用 /scripts/ensure_vhost_includes --user=trade 将其导入到 conf 中。上面粘贴的内容
  • 如果是这样,那么 mod_wsgi 将停止 Apache 启动并给出一个关于 mod_wsgi 守护进程组名称之前已被使用过的错误。 IOW,WSGIDaemonProcess 组的名称必须是唯一的,但您的配置建议您将它两次包含到 Apache 配置的不同部分中。如果不是,那么您的 443 虚拟主机可能甚至都没有处于活动状态。

标签: django apache ssl mod-wsgi virtualenv


【解决方案1】:

为了任何可能遇到此问题的人的利益,回答我自己的问题:

我添加了以下几行:

WSGIProcessGroup tradek

WSGIScriptAlias / /home/trade/sites/tradekandi.com.env/site/trade/deploy/pinax.wsgi

到位于 /usr/local/apache/conf/userdata/ssl/2/trade/tradekandi.com 的 .conf 文件,然后使用命令 /scripts/ensure_vhost_includes --user=trade

(我也碰巧更改了ProcessGroup名称)

似乎已经成功了,尽管现在我需要摆脱页面上的不安全元素!感谢 Graham,因为这是您对其他人的回答之一,帮助我解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 2018-03-30
    • 2012-07-15
    • 2015-08-09
    • 2011-09-24
    • 2012-08-03
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多