Python: 无法连接到 HTTPS URL 因为 SSL 模块不可用
Python: Can't connect to HTTPS URL because the SSL module is not available
我正在尝试连接到 Stripe 以设置付款。我让它在我的开发机器上工作,但是当我推送到产品时,我收到以下 SSL 错误:
无法连接到 HTTPS URL,因为 SSL 模块不可用。
以下是我的设置的详细信息:
- Ubuntu 16.04
- 阿帕奇 2
- mod_wsgi
- Python3.6
- Django 1.11
- Python/django 进程全部安装并且 运行 在名为 "protectyourreviews"
的 anaconda (miniconda) 虚拟环境中
我已经阅读了多个建议重新安装 python 的其他 SO 答案,但要确保首先安装依赖项。在内部安装和 anaconda 环境应该不是问题吗? anaconda 不应该为我处理所有依赖项吗?
我启用了 HTTPS 并为整个域工作(所有请求都路由到 https)。当我检查我的安装时,我确实有 openssl,当我在我的 django 环境中打开 shell 时,我可以毫无问题地导入和使用该模块......所以我不确定如何继续解决这个问题.
非常感谢任何帮助!
此外,这是一个堆栈跟踪:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in urlopen
589. conn = self._get_conn(timeout=pool_timeout)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in _get_conn
251. return conn or self._new_conn()
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in _new_conn
827. raise SSLError("Can't connect to HTTPS URL because the SSL "
During handling of the above exception (Can't connect to HTTPS URL because the SSL module is not available.), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/adapters.py" in send
440. timeout=timeout
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in urlopen
639. _stacktrace=sys.exc_info()[2])
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/util/retry.py" in increment
388. raise MaxRetryError(_pool, url, error or ResponseError(cause))
During handling of the above exception (HTTPSConnectionPool(host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in request
121. **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/sessions.py" in request
508. resp = self.send(prep, **send_kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/sessions.py" in send
618. r = adapter.send(request, **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/adapters.py" in send
506. raise SSLError(e, request=request)
During handling of the above exception (HTTPSConnectionPool(host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/user/protectyourreviews/protectyourreviews/../payments/views.py" in stripe_test
35. source=token
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/resource.py" in create
467. response, api_key = requestor.request('post', url, params, headers)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/api_requestor.py" in request
150. method.lower(), url, params, headers)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/api_requestor.py" in request_raw
335. method, abs_url, headers, post_data)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in request
139. self._handle_request_error(e)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in _handle_request_error
159. raise error.APIConnectionError(msg)
Exception Type: APIConnectionError at /payments/test/stripe/
Exception Value: Unexpected error communicating with Stripe. If this problem persists,
let us know at support@stripe.com.
(Network error: SSLError: HTTPSConnectionPool(host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)))
编辑
在新的 python virtualenv 中重新安装 mod_wsgi 后,它仍在尝试打开旧的 anaconda 路径。我已经更改了 WSGIDaemonProcess 中的 python-home 和 python-path 指令,但无论我尝试什么,它仍然试图从 miniconda3 目录(我已经已删除)。
这是来自 Apache 错误日志的跟踪:
Current thread 0x00007f99f6769780 (most recent call first):
[Mon Aug 28 20:13:15.264466 2017] [core:notice] [pid 26528] AH00051: child pid 26775 exit signal Aborted (6), possible coredump in /etc/apache2
[Mon Aug 28 20:13:15.264608 2017] [core:notice] [pid 26528] AH00051: child pid 26776 exit signal Aborted (6), possible coredump in /etc/apache2
[Mon Aug 28 20:13:16.340556 2017] [wsgi:info] [pid 26789] mod_wsgi (pid=26789): Python home /home/user/miniconda3/envs/protectyourreviews.
[Mon Aug 28 20:13:16.341203 2017] [wsgi:warn] [pid 26789] (2)No such file or directory: mod_wsgi (pid=26789): Unable to stat Python home /home/user/miniconda3/envs/protectyourreviews. Python interpreter may not be a$
[Mon Aug 28 20:13:16.341357 2017] [wsgi:info] [pid 26789] mod_wsgi (pid=26789): Initializing Python.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
编辑 2
是的,我从干净的源目录中执行了 start。我将 mod_wsgi tar 文件复制到新目录,并在新目录中安装 运行 configure/make/make。我相信我在新安装之前也删除了 apache 模块文件以防万一。
我已经尝试了以下指令的多次迭代(两者/仅 python-home / 仅 python-path)但无论我尝试什么,我都无法弄清楚为什么mod_wsgi 继续在删除的 miniconda3 文件夹中查找。是否还有其他一些我忘记的配置文件?
这是我的 wsgi.load:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
这是我的 Apache2 指令(其中 pyr_env 是我的新 Python virtualenv 文件夹):
WSGIDaemonProcess protectyourreviews python-home=/home/user/pyr_env/ python-path=/home/user/protectyourreviews
WSGIProcessGroup protectyourreviews
WSGIScriptAlias / /home/user/protectyourreviews/zz_test/test.wsgi
<Directory /home/user/protectyourreviews/zz_test>
<Files test.wsgi>
Require all granted
</Files>
</Directory>
编辑 3
我按照您建议的说明进行操作 in the docs,结果如下。
这是 ldd 的输出:
$ ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fffad973000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f05b8c02000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f05b89e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f05b861a000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f05b83f1000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f05b81d7000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f05b7fd2000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f05b7dcf000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f05b7ac6000)
/lib64/ld-linux-x86-64.so.2 (0x0000558bed982000)
这是取消设置后的输出 LD_LIBRARY_PATH:
$ unset LD_LIBRARY_PATH
$ ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007ffd91bd2000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f8bec8a6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8bec689000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8bec2be000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f8bec095000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8bebe7b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8bebc76000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f8beba73000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8beb76a000)
/lib64/ld-linux-x86-64.so.2 (0x000055e8861a5000)
编辑 4
我确保在虚拟环境文件夹上正确设置了权限,并再次重新编译以绝对确保我拥有正确的版本。这是该过程的所有输入和输出:
#----CHANGE PERMISSIONS OF VIRTUAL ENVIRONMENT
$ sudo chgrp -R www-data /home/user/pyr_env/
$ sudo chmod -R g+rwx /home/user/pyr_env/
#----DELETE OLD FOLDER
$ rm -r mod_wsgi-4.5.17/
#----START FRESH WITH CONFIG/MAKE/INSTALL
$ tar xvfz 4.5.17.tar.gz
$ cd mod_wsgi-4.5.17/
$ ./configure --with-python=/usr/bin/python3
$ make
$ sudo make install
/usr/bin/apxs2 -i -S LIBEXECDIR=/usr/lib/apache2/modules -n 'mod_wsgi' src/server/mod_wsgi.la
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' src/server/mod_wsgi.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install install src/server/mod_wsgi.la /usr/lib/apache2/modules/
libtool: install: install src/server/.libs/mod_wsgi.so /usr/lib/apache2/modules/mod_wsgi.so
libtool: install: install src/server/.libs/mod_wsgi.lai /usr/lib/apache2/modules/mod_wsgi.la
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/lib/apache2/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/apache2/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/apache2/modules/mod_wsgi.so
#----OUTPUT OF LDD
$ ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007ffcfb9a9000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f19ae26f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f19ae052000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f19adc87000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f19ada5e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f19ad844000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f19ad63f000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f19ad43c000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f19ad133000)
/lib64/ld-linux-x86-64.so.2 (0x000055aa1cb7a000)
#----RESTART APACHE
$ sudo apache2ctl restart
不幸的是,我在 Apache 中看到了完全相同的错误。这是 apache2/error.log:
Current thread 0x00007fb350fee780 (most recent call first):
[Wed Aug 30 14:13:08.130076 2017] [core:notice] [pid 9754] AH00051: child pid 28636 exit signal Aborted (6), possible coredump in /etc/apache2
[Wed Aug 30 14:13:08.130179 2017] [core:error] [pid 9754] AH00546: no record of generation 0 of exiting child 28636
[Wed Aug 30 14:13:08.130833 2017] [wsgi:info] [pid 28639] mod_wsgi (pid=28639): Python home /home/user/miniconda3/envs/protectyourreviews.
[Wed Aug 30 14:13:08.130907 2017] [wsgi:warn] [pid 28639] (2)No such file or directory: mod_wsgi (pid=28639): Unable to stat Python home /home/user/minico$
[Wed Aug 30 14:13:08.130992 2017] [wsgi:info] [pid 28639] mod_wsgi (pid=28639): Initializing Python.
[Wed Aug 30 14:13:08.131665 2017] [wsgi:info] [pid 28638] mod_wsgi (pid=28638): Python home /home/user/miniconda3/envs/protectyourreviews.
[Wed Aug 30 14:13:08.131716 2017] [wsgi:warn] [pid 28638] (2)No such file or directory: mod_wsgi (pid=28638): Unable to stat Python home /home/user/minico$
[Wed Aug 30 14:13:08.131782 2017] [wsgi:info] [pid 28638] mod_wsgi (pid=28638): Initializing Python.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
它仍在尝试打开已删除的 miniconda 文件夹...
问题是 Anaconda Python 附带了自己的 SSL 库,并且在编译 Python ssl 模块时不使用系统 SSL 库。 Apache 中的 mod_ssl 模块正在使用系统库。
因此,如果您在 Apache 中启用 mod_ssl,它会引入系统 SSL 库。当您的应用程序导入 Python ssl 模块时,它会继承已经加载的系统 SSL 库,这与 ssl 模块的编译目标和预期不同,因此失败。
所以这个问题是由 Anaconda Python 忽略系统 SSL 库并使用它自己的库引起的。
唯一的解决方案是使用系统 Python 版本而不是 Anaconda Python,或者 运行 您的 WSGI 应用程序使用 mod_wsgi-express 在您的主要 Apache 安装之后,这将仅充当 SSL 的终止点,然后代理到 mod_wsgi-express 实例。
除非您有特殊要求,否则最好使用系统 Python 版本而不是 Anaconda Python。
我正在尝试连接到 Stripe 以设置付款。我让它在我的开发机器上工作,但是当我推送到产品时,我收到以下 SSL 错误:
无法连接到 HTTPS URL,因为 SSL 模块不可用。
以下是我的设置的详细信息:
- Ubuntu 16.04
- 阿帕奇 2
- mod_wsgi
- Python3.6
- Django 1.11
- Python/django 进程全部安装并且 运行 在名为 "protectyourreviews" 的 anaconda (miniconda) 虚拟环境中
我已经阅读了多个建议重新安装 python 的其他 SO 答案,但要确保首先安装依赖项。在内部安装和 anaconda 环境应该不是问题吗? anaconda 不应该为我处理所有依赖项吗?
我启用了 HTTPS 并为整个域工作(所有请求都路由到 https)。当我检查我的安装时,我确实有 openssl,当我在我的 django 环境中打开 shell 时,我可以毫无问题地导入和使用该模块......所以我不确定如何继续解决这个问题.
非常感谢任何帮助!
此外,这是一个堆栈跟踪:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in urlopen
589. conn = self._get_conn(timeout=pool_timeout)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in _get_conn
251. return conn or self._new_conn()
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in _new_conn
827. raise SSLError("Can't connect to HTTPS URL because the SSL "
During handling of the above exception (Can't connect to HTTPS URL because the SSL module is not available.), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/adapters.py" in send
440. timeout=timeout
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in urlopen
639. _stacktrace=sys.exc_info()[2])
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/util/retry.py" in increment
388. raise MaxRetryError(_pool, url, error or ResponseError(cause))
During handling of the above exception (HTTPSConnectionPool(host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in request
121. **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/sessions.py" in request
508. resp = self.send(prep, **send_kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/sessions.py" in send
618. r = adapter.send(request, **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/adapters.py" in send
506. raise SSLError(e, request=request)
During handling of the above exception (HTTPSConnectionPool(host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/user/protectyourreviews/protectyourreviews/../payments/views.py" in stripe_test
35. source=token
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/resource.py" in create
467. response, api_key = requestor.request('post', url, params, headers)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/api_requestor.py" in request
150. method.lower(), url, params, headers)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/api_requestor.py" in request_raw
335. method, abs_url, headers, post_data)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in request
139. self._handle_request_error(e)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in _handle_request_error
159. raise error.APIConnectionError(msg)
Exception Type: APIConnectionError at /payments/test/stripe/
Exception Value: Unexpected error communicating with Stripe. If this problem persists,
let us know at support@stripe.com.
(Network error: SSLError: HTTPSConnectionPool(host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)))
编辑
在新的 python virtualenv 中重新安装 mod_wsgi 后,它仍在尝试打开旧的 anaconda 路径。我已经更改了 WSGIDaemonProcess 中的 python-home 和 python-path 指令,但无论我尝试什么,它仍然试图从 miniconda3 目录(我已经已删除)。
这是来自 Apache 错误日志的跟踪:
Current thread 0x00007f99f6769780 (most recent call first):
[Mon Aug 28 20:13:15.264466 2017] [core:notice] [pid 26528] AH00051: child pid 26775 exit signal Aborted (6), possible coredump in /etc/apache2
[Mon Aug 28 20:13:15.264608 2017] [core:notice] [pid 26528] AH00051: child pid 26776 exit signal Aborted (6), possible coredump in /etc/apache2
[Mon Aug 28 20:13:16.340556 2017] [wsgi:info] [pid 26789] mod_wsgi (pid=26789): Python home /home/user/miniconda3/envs/protectyourreviews.
[Mon Aug 28 20:13:16.341203 2017] [wsgi:warn] [pid 26789] (2)No such file or directory: mod_wsgi (pid=26789): Unable to stat Python home /home/user/miniconda3/envs/protectyourreviews. Python interpreter may not be a$
[Mon Aug 28 20:13:16.341357 2017] [wsgi:info] [pid 26789] mod_wsgi (pid=26789): Initializing Python.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
编辑 2
是的,我从干净的源目录中执行了 start。我将 mod_wsgi tar 文件复制到新目录,并在新目录中安装 运行 configure/make/make。我相信我在新安装之前也删除了 apache 模块文件以防万一。
我已经尝试了以下指令的多次迭代(两者/仅 python-home / 仅 python-path)但无论我尝试什么,我都无法弄清楚为什么mod_wsgi 继续在删除的 miniconda3 文件夹中查找。是否还有其他一些我忘记的配置文件?
这是我的 wsgi.load:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so
这是我的 Apache2 指令(其中 pyr_env 是我的新 Python virtualenv 文件夹):
WSGIDaemonProcess protectyourreviews python-home=/home/user/pyr_env/ python-path=/home/user/protectyourreviews
WSGIProcessGroup protectyourreviews
WSGIScriptAlias / /home/user/protectyourreviews/zz_test/test.wsgi
<Directory /home/user/protectyourreviews/zz_test>
<Files test.wsgi>
Require all granted
</Files>
</Directory>
编辑 3
我按照您建议的说明进行操作 in the docs,结果如下。
这是 ldd 的输出:
$ ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fffad973000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f05b8c02000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f05b89e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f05b861a000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f05b83f1000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f05b81d7000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f05b7fd2000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f05b7dcf000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f05b7ac6000)
/lib64/ld-linux-x86-64.so.2 (0x0000558bed982000)
这是取消设置后的输出 LD_LIBRARY_PATH:
$ unset LD_LIBRARY_PATH
$ ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007ffd91bd2000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f8bec8a6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8bec689000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8bec2be000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f8bec095000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8bebe7b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8bebc76000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f8beba73000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8beb76a000)
/lib64/ld-linux-x86-64.so.2 (0x000055e8861a5000)
编辑 4
我确保在虚拟环境文件夹上正确设置了权限,并再次重新编译以绝对确保我拥有正确的版本。这是该过程的所有输入和输出:
#----CHANGE PERMISSIONS OF VIRTUAL ENVIRONMENT
$ sudo chgrp -R www-data /home/user/pyr_env/
$ sudo chmod -R g+rwx /home/user/pyr_env/
#----DELETE OLD FOLDER
$ rm -r mod_wsgi-4.5.17/
#----START FRESH WITH CONFIG/MAKE/INSTALL
$ tar xvfz 4.5.17.tar.gz
$ cd mod_wsgi-4.5.17/
$ ./configure --with-python=/usr/bin/python3
$ make
$ sudo make install
/usr/bin/apxs2 -i -S LIBEXECDIR=/usr/lib/apache2/modules -n 'mod_wsgi' src/server/mod_wsgi.la
/usr/share/apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' src/server/mod_wsgi.la /usr/lib/apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install install src/server/mod_wsgi.la /usr/lib/apache2/modules/
libtool: install: install src/server/.libs/mod_wsgi.so /usr/lib/apache2/modules/mod_wsgi.so
libtool: install: install src/server/.libs/mod_wsgi.lai /usr/lib/apache2/modules/mod_wsgi.la
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/lib/apache2/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/apache2/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/apache2/modules/mod_wsgi.so
#----OUTPUT OF LDD
$ ldd /usr/lib/apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007ffcfb9a9000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f19ae26f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f19ae052000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f19adc87000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f19ada5e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f19ad844000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f19ad63f000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f19ad43c000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f19ad133000)
/lib64/ld-linux-x86-64.so.2 (0x000055aa1cb7a000)
#----RESTART APACHE
$ sudo apache2ctl restart
不幸的是,我在 Apache 中看到了完全相同的错误。这是 apache2/error.log:
Current thread 0x00007fb350fee780 (most recent call first):
[Wed Aug 30 14:13:08.130076 2017] [core:notice] [pid 9754] AH00051: child pid 28636 exit signal Aborted (6), possible coredump in /etc/apache2
[Wed Aug 30 14:13:08.130179 2017] [core:error] [pid 9754] AH00546: no record of generation 0 of exiting child 28636
[Wed Aug 30 14:13:08.130833 2017] [wsgi:info] [pid 28639] mod_wsgi (pid=28639): Python home /home/user/miniconda3/envs/protectyourreviews.
[Wed Aug 30 14:13:08.130907 2017] [wsgi:warn] [pid 28639] (2)No such file or directory: mod_wsgi (pid=28639): Unable to stat Python home /home/user/minico$
[Wed Aug 30 14:13:08.130992 2017] [wsgi:info] [pid 28639] mod_wsgi (pid=28639): Initializing Python.
[Wed Aug 30 14:13:08.131665 2017] [wsgi:info] [pid 28638] mod_wsgi (pid=28638): Python home /home/user/miniconda3/envs/protectyourreviews.
[Wed Aug 30 14:13:08.131716 2017] [wsgi:warn] [pid 28638] (2)No such file or directory: mod_wsgi (pid=28638): Unable to stat Python home /home/user/minico$
[Wed Aug 30 14:13:08.131782 2017] [wsgi:info] [pid 28638] mod_wsgi (pid=28638): Initializing Python.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
它仍在尝试打开已删除的 miniconda 文件夹...
问题是 Anaconda Python 附带了自己的 SSL 库,并且在编译 Python ssl 模块时不使用系统 SSL 库。 Apache 中的 mod_ssl 模块正在使用系统库。
因此,如果您在 Apache 中启用 mod_ssl,它会引入系统 SSL 库。当您的应用程序导入 Python ssl 模块时,它会继承已经加载的系统 SSL 库,这与 ssl 模块的编译目标和预期不同,因此失败。
所以这个问题是由 Anaconda Python 忽略系统 SSL 库并使用它自己的库引起的。
唯一的解决方案是使用系统 Python 版本而不是 Anaconda Python,或者 运行 您的 WSGI 应用程序使用 mod_wsgi-express 在您的主要 Apache 安装之后,这将仅充当 SSL 的终止点,然后代理到 mod_wsgi-express 实例。
除非您有特殊要求,否则最好使用系统 Python 版本而不是 Anaconda Python。