Как установить libcurl с бэкендом nss в aws ec2?(Python 3.6, 64-битная версия Amazon Linux) - PullRequest
2 голосов
/ 08 мая 2019

У меня есть экземпляр ec2 в AWS под управлением Python3.6 (Amazon Linux / 2.8.3), где Мне нужно установить pycurl с NSS ssl backend .

Сначала я попробовал это, добавив 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 установлен правильно, но работник из сельдерея не работает. Журналы сельдерея показывают:

__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)

Так что я предполагаю, что моя проблема в том, что я ранее установил libcurl с openSSL вместо NSS, и, следовательно, несоответствие между libcurl и pycurl.


Согласно другому вопросу stackoverflow, для установки libcurl с бэкэндом NSS я должен был установить его с:

sudo apt libcurl4-nss-dev

Но поскольку сервер работает под управлением Amazon Linux, я не могу использовать команду apt. Поэтому я сделал вместо:

yum install libcurl-devel

И я предполагаю, что это проблема: при установке libcurl с поддержкой OpenSSL, когда мне это нужно с поддержкой NSS.

Как я могу установить libcurl с NSS в Amazon Linux ?? (мне нужен NSS, потому что я запускаю приложение Django с сельдереем, использующим SQS в качестве посредника, а SQS требует NSS).

Большое спасибо!

1 Ответ

0 голосов
/ 29 мая 2019

Я просто столкнулся с той же проблемой и сумел ее исправить:)

  1. Получение параметров конфигурации Amazon Linux для libcurl:
curl-config --configure

Все параметры, относящиеся к путям, могут быть проигнорированы, но другие должны быть сохранены, если вы хотите использовать те же функции, что и для системы libcurl. Конечно, --with-ssl будет заменен на --without-ssl --with-nss.

1.1 Предварительные требования для установки:

sudo yum install libssh2-devel nss-devel

(конечно, лучше добавить в раздел 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

(конечно, это должно быть правильно развернуто как сценарий оболочки через раздел files ваших расширений).

Теперь вы должны увидеть libcurl.so.4 созданный в /usr/local/lib.

  1. Определите следующие envvars для 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' должно работать.

Вот и все! Вы должны быть в состоянии запустить Celery с SQS.

...