Django 1.10在Apache2.4之后发送邮件时出现SSLv2_方法导入错误

Django 1.10在Apache2.4之后发送邮件时出现SSLv2_方法导入错误,django,apache,ssl,mod-wsgi,tls1.2,Django,Apache,Ssl,Mod Wsgi,Tls1.2,我正试图在Apache2 mod_wsgi后面安装一个几乎是空的django 1.10项目。在项目设置中,我使用EMAIL\u use\u TLS=True,EMAIL\u PORT='587'从web表单通过gmail发送电子邮件。当我在控制台上独立管理.py runserver时,我可以发送电子邮件。但当django项目位于Apache2之后时,我总是会遇到这样的错误: /home/wr200m/anaconda2/lib/python2.7/lib-dynload/_ssl.so: und

我正试图在Apache2 mod_wsgi后面安装一个几乎是空的django 1.10项目。在项目设置中,我使用EMAIL\u use\u TLS=True,EMAIL\u PORT='587'从web表单通过gmail发送电子邮件。当我在控制台上独立管理.py runserver时,我可以发送电子邮件。但当django项目位于Apache2之后时,我总是会遇到这样的错误:

/home/wr200m/anaconda2/lib/python2.7/lib-dynload/_ssl.so: undefined symbol: SSLv2_method
Django 1.10在康达虚拟环境中的Ubuntu 16.04和python2.7上运行。Apache2可以为一些https站点提供良好的服务。我知道SSLv2在很大程度上已被现代系统弃用,并且在我的系统的openssl上被禁用。mod_ssl.conf具有默认配置(启用除SSLv3禁用之外的所有配置)。无论如何,为什么这个SSLv2_方法是一个依赖项

关于我当前解决方法的注意事项:由于我有一个本地后缀,在这个服务器上转发到gmail,在设置中,我只是更改了EMAIL_HOST='localhost',没有SSL或TLS和SAN身份验证,但最终结果是相同的:mod_wsgi后面的django显示了相同的错误。最后,我编写了一个粗糙的sendmail帮助程序,它使用smtplib作为表单邮件查看器,通过后缀发送邮件,效果很好。当然,我想回到标准的django send_mail。因此,请尽你所能提供建议

以下是Django的回溯:

Environment:


Request Method: POST
Request URL: https://wr2opt/contact/

Django Version: 1.10.5
Python Version: 2.7.12
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'home',
 'contact',
 'django.contrib.sites',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'crispy_forms']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/wr200m/anaconda2/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/home/wr200m/anaconda2/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/wr200m/anaconda2/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/wr200m/workspace/wr200m/optionswww/src/contact/views.py" in contact
  20.         send_mail(subject, message, emailFrom, emailTo, fail_silently=False)

File "/home/wr200m/anaconda2/lib/python2.7/site-packages/django/core/mail/__init__.py" in send_mail
  56.         fail_silently=fail_silently,

File "/home/wr200m/anaconda2/lib/python2.7/site-packages/django/core/mail/__init__.py" in get_connection
  36.     klass = import_string(backend or settings.EMAIL_BACKEND)

File "/home/wr200m/anaconda2/lib/python2.7/site-packages/django/utils/module_loading.py" in import_string
  20.     module = import_module(module_path)

File "/home/wr200m/anaconda2/lib/python2.7/importlib/__init__.py" in import_module
  37.     __import__(name)

File "/home/wr200m/anaconda2/lib/python2.7/site-packages/django/core/mail/backends/smtp.py" in <module>
  3. import ssl

File "/home/wr200m/anaconda2/lib/python2.7/ssl.py" in <module>
  97. import _ssl             # if we can't import it, let the error propagate

Exception Type: ImportError at /contact/
Exception Value: /home/wr200m/anaconda2/lib/python2.7/lib-dynload/_ssl.so: undefined symbol: SSLv2_method

这不是一个真正的解决方案,但我希望如果其他人遇到类似问题,我可以演示一种解决方法

从我的问题下的讨论中可以看出,我的问题似乎是Apache2在anaconda python兼容mod_wsgi能够引入正确的ssl库之前加载了较旧的ssl库。由于此Apache2还通过https服务于其他站点,而我既没有专业知识,也没有时间进一步修补真正的解决方案,因此我选择了以下选项:

  • 在本地系统上,使用中继到外部SMTP服务器()的后缀
  • 然后在django中,定制一个连接到本地后缀的EmailBackend()。因此,不再需要导入ssl

我在使用Apache2托管conda环境时也遇到了这个问题。我的Apache2安装了apt get。我的系统中实际上安装了两个openssl

  • /usr/lib/x86_64-linux-gnu/libssl.so
  • /home/vamei/anaconda3/lib/libssl.so
  • 一个属于系统,另一个属于康达。如果您使用Apache托管站点,Apache将使用系统的openssl,这是conda所不期望的。为了解决这个问题,我在/etc/apache2/envvars中添加了以下行:

    export LD_LIBRARY_PATH=/home/vamei/anaconda3/lib
    
    注意:我也尝试了其他方法,如在不同的帖子中建议的,但都失败了:

  • 在Python中使用os.environ添加LD_LIBRARY_PATH或LD_RUN_PATH
  • 使用mod_env添加系统环境LD_LIBRARY_PATH或LD_RUN_PATH

  • mod_wsgi是为Anaconda Python编译的吗?如果mod_wsgi是为不同的Python发行版编译的,那么您不能试图强制mod_wsgi使用Anaconda构建的Python虚拟环境。这就是说,这可能是由于水蟒在某些情况下有点依赖于设置的
    LD\u LIBRARY\u路径。谢谢。我遵循了您在的答案,使用anaconda2的python从源代码构建,以及在anaconda2中使用pip安装的其他说明。我能够使用mod_wsgi-express启动服务器,没有任何问题(发送了电子邮件)。但是在我安装了mod_wsgi.so(从源代码构建或使用pip构建)之后,问题就更奇怪了,因为反弹的apache2.ldd显示了新构建的mod_wsgi.so有我的anaconda2/lib/libpython2.7.so.1.0,但django上的python可执行文件现在显示的是/usr/bin/python,而不是以前的anaconda2/bin/python,尽管最初的问题一直存在。股票mod_wsgi.so链接到发行版的libpython2.7.so.1.0。您建议我如何处理LD_LIBRARY_PATH?我不太明白“django上的python可执行文件”是什么意思?如果您在运行Django应用程序的内部查看
    sys.executeble
    的值,那么它是什么并不重要,因为mod_wsgi没有通过加载库来执行
    python
    可执行文件,所以这才是最重要的。在Anaconda发行版中找到lib目录,其中包含Anaconda版本的SSL库。这是怎么一回事?尝试在WSGI脚本文件的最开始处导入
    os
    并将
    os.environ['LD\u LIBRARY\u PATH']
    设置到该目录。这意味着Apache将使用错误的目录,因此mod\u ssl很可能会中断。在我的情况下,Apache工作正常。我同意在Apache的整个范围内导入变量不是一个好主意,但我没有找到其他解决方案。也许有人可以建议一种只在WSGI中导入的方法,但你不能,因为mod_WSGI使用的是继承自Apache的进程,它不是一个单独程序的执行者,在这个程序中你有机会引入不同的共享库。唯一安全的解决方案是使用mod_wsgi-express behing Apache或nginx作为代理。谢谢!我决定现在就这样做,mod_ssl仍然在工作。总之,我让我的anaconda python构建了安装了apache2的mod_wsgi,并指出apache2的LD_LIBRARY_路径是在同一anaconda env中使用openssl,而不是在系统版本中使用openssl。现在可以了!旁注:我们仍然看到报告的问题,解决方案是2013年ubuntu问题的解决方案!
    ~/anaconda2/envs/pgadmin4/lib
    ~/anaconda2/envs/pgadmin4/lib/python2.7/lib-dynload
    ~/anaconda2/envs/pgadmin4/lib/python2.7/site-packages/cryptography/hazmat/bindings
    ~/anaconda2/lib
    ~/anaconda2/lib/python2.7/lib-dynload
    ~/anaconda2/lib/python2.7/site-packages/cryptography/hazmat/bindings
    ~/anaconda2/pkgs/cryptography-1.5-py27_0/lib/python2.7/site-packages/cryptography/hazmat/bindings
    ~/anaconda2/pkgs/openssl-1.0.2k-0/lib
    ~/anaconda2/pkgs/openssl-1.0.2k-0/lib/engines
    ~/anaconda2/pkgs/python-2.7.13-0/lib/python2.7/lib-dynload
    
    export LD_LIBRARY_PATH=/home/vamei/anaconda3/lib