如何在AWS EC2中使用NSS后端安装libcurl? (Python 3.6 64位Amazon Linux)

时间:2019-05-08 14:34:06

标签: python amazon-web-services amazon-ec2 libcurl pycurl

我在AWS中有一个运行Python3.6(Amazon Linux / 2.8.3)的ec2实例,其中我需要使用NSS ssl后端安装pycurl

首先,我通过将pycurl==7.43.0 --global-option="--with-nss"添加到我的requirement.txt文件中来进行尝试,但是安装错误。因此,最后我在.config中添加了一个.ebextensions文件(在部署过程中运行):

container_commands:
  09_pycurl_reinstall:
    # the upgrade option is because it will run after PIP installs the requirements.txt file.
    # and it needs to be done with the virtual-env activated
    command: 'source /opt/python/run/venv/bin/activate && PYCURL_SSL_LIBRARY=nss pip3 install pycurl --global-option="--with-nss" --upgrade --no-cache-dir --compile --ignore-installed'


Pycurl似乎已正确安装,但是celery worker没有运行。芹菜工作者的日志显示:

__main__.ConfigurationError: Could not run curl-config: [Errno 2] No such file or directory

如果我通过SSH连接到实例并运行python 3.6 -c 'import pycurl',则会收到更详细的错误:

ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (nss)

所以我想我的问题是我以前用openSSL而不是NSS安装了libcurl,因此libcurl和pycurl之间不匹配。


根据另一个stackoverflow问题,对于要与NSS后端一起安装的libcurl,我应该使用以下命令进行安装:

sudo apt libcurl4-nss-dev

但是由于服务器正在运行Amazon Linux,所以无法使用apt命令。所以我改为:

yum install libcurl-devel

我想这是问题所在:当我需要NSS支持时,它将安装具有OpenSSL支持的libcurl。

如何在Amazon Linux上安装带有NSS的libcurl?(我需要NSS,因为我正在使用celery使用SQS作为代理运行Django应用,而SQS需要NSS)。

非常感谢您!

2 个答案:

答案 0 :(得分:1)

在我的python ec2实例上安装pycurl时遇到了很多问题-首先,pip根本不会安装pycurl。必须ssh并运行

yum install libcurl-devel

此后,我更新了我的require.txt文件,以包括相关的ssl选项(--with-openssl)作为安装选项;

pycurl==7.43.0.5 --install-option="--with-openssl"

在我对Requirement.txt进行此更改后,部署了新版本后,我用pycurl进行了很好的测试;

python 'import pycurl'

我知道我需要使用错误消息中的openssl

libcurl链接时SSL后端(openssl)

答案 1 :(得分:0)

我只是遇到了同样的问题,并设法解决了这个问题:)

  1. 检索libcurl的Amazon Linux配置选项:
curl-config --configure

所有引用路径的选项都可以忽略,但是如果您要使用与系统libcurl相同的功能,则必须保留其他选项。当然,--with-ssl将替换为--without-ssl --with-nss

1.1安装所需的库:

sudo yum install libssh2-devel nss-devel

(当然,您应该将其添加到ebextensions的packages> yum部分中)

  1. 从源代码编译libcurl(我选择7.61.1以匹配Amazon Linux 2018.03使用的版本):
wget https://curl.haxx.se/download/curl-7.61.1.tar.gz
tar xf curl-7.61.1.tar.gz
cd curl-7.61.1
./configure '--build=x86_64-redhat-linux-gnu' '--host=x86_64-redhat-linux-gnu' '--target=x86_64-amazon-linux-gnu' '--program-prefix=' '--cache-file=../config.cache' '--disable-static' '--enable-symbol-hiding' '--enable-ipv6' '--enable-threaded-resolver' '--with-gssapi' '--with-nghttp2' '--without-ssl' '--with-nss' '--with-ca-bundle=/etc/pki/tls/certs/ca-bundle.crt' '--enable-ldap' '--enable-ldaps' '--enable-manual' '--with-libidn2' '--with-libpsl' '--with-libssh2' 'build_alias=x86_64-redhat-linux-gnu' 'host_alias=x86_64-redhat-linux-gnu' 'target_alias=x86_64-amazon-linux-gnu' 'CFLAGS=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
make
sudo make install

现在您应该看到在libcurl.so.4中创建了/usr/local/lib64

  1. 安装pycurl以便链接到自定义libcurl
export LD_LIBRARY_PATH=/usr/local/lib64
sudo -E PYCURL_CURL_CONFIG=/usr/local/bin/curl-config PYCURL_SSL_LIBRARY=nss /opt/python/run/venv/bin/pip install pycurl

该库已(奇怪地)安装到/opt/python/run/venv/lib64/python3.6/dist-packages中。您可以检查它是否链接到右侧的libcurl

ldd /opt/python/run/venv/lib64/python3.6/dist-packages/pycurl.cpython-36m-x86_64-linux-gnu.so

应向您显示libcurl.so.4 => /usr/local/lib64/libcurl.so.4

  1. 配置PYTHONPATH以包括以下奇怪的安装路径:
export PYTHONPATH="$PYTHONPATH:/opt/python/run/venv/local/lib64/python3.6/dist-packages"

这样,您应该可以在SQS上运行Celery。