【问题标题】:How to install libcurl with nss backend in aws ec2? (Python 3.6 64bit Amazon Linux)如何在 aws ec2 中安装带有 nss 后端的 libcurl? (Python 3.6 64 位亚马逊 Linux)
【发布时间】:2023-04-26 06:32:01
【问题描述】:

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

首先我尝试将pycurl==7.43.0 --global-option="--with-nss" 添加到我的requirement.txt 文件中,但我收到错误安装错误。所以我最终通过在.ebextensions 中添加一个.config 文件(在部署期间运行)来做到这一点:

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 之间不匹配。


根据另一个 * 问题,对于要与 NSS 后端一起安装的 libcurl,我应该安装它:

sudo apt libcurl4-nss-dev

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

yum install libcurl-devel

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

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

非常感谢!

【问题讨论】:

  • 我和你有几乎相同的堆栈(从其他问题中看到):Django / SQS / Celery / Beanstalk。我让它运行起来,也遇到了 pycurl 的问题,但我使用了 openssl。我不认为 SQS 需要 nss,至少对我而言,openssl 在 Amazon Linux 2.8.6 上与 Python 3.6 配合得很好。
  • 是的,我最终使用了 openssl,它运行良好。我不知道为什么我认为 SQS 需要 nss。还是谢谢!

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


【解决方案1】:

我刚刚遇到了同样的问题并设法解决了它:)

  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

(当然,这应该通过您的 ebextensions 的 files 部分正确部署为 Shell 脚本)。

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

  1. pycurl 定义以下环境变量,以使用您的自定义libcurl 进行编译:
LD_LIBRARY_PATH=/usr/local/lib
PYCURL_CURL_CONFIG=/usr/local/bin/curl-config
PYCURL_SSL_LIBRARY=nss
  1. 运行您的pip install

你可以查看pycurl链接到右边libcurl

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

应该告诉你libcurl.so.4 => /usr/local/lib64/libcurl.so.4

当然python 3.6 -c 'import pycurl' 应该可以工作。

就是这样!您应该能够使用 SQS 运行 Celery。

【讨论】:

    【解决方案2】:

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

    yum install libcurl-devel
    

    在此之后,我将以下行添加到我的 requirements.txt 文件中,以便它包含相关的 ssl 选项 (--with-openssl) 作为安装选项:

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

    一旦我在 requirements.txt 中部署了具有此更改的新版本,pycurl 就可以正常工作,我对此进行了测试:

    python 'import pycurl'
    

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

    libcurl 链接时 ssl 后端 (openssl)

    【讨论】: