2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

さくらのレンタルサーバでPython3(PY_UNSUPPORTED_OPENSSL_BUILD=static)

Posted at

はじめに

  • さくらのレンタルサーバはPython3が入ってないか or 入っているのは3.8
  • OpenSSLも古い
    • 3.9までは古いOpenSSLでもOK
  • CGIとして動かしたい
    • Python実行後にOpenSSLのパスを指定できない(と思う)

Python3の初期のモノをさくらにインストールする記事はいくつか見かけたが、3.10以降は?なので、3.12でCGIを動かすまでを試してみる。

さくらのレンタルサーバ状況

3.8.x
※旧仕様の一部サーバは、2.7.xです。

新仕様のサーバは3.8.xが入っている様だが、今現在の私のサーバは2.7.xのままでOpenSSLは1.0.2oである。ここに無理やり3.12.xを入れてみる。

OpenSSLのビルド

さくらのFreeBSD11ではOpenSSLが1.0.xと古く、Python3.9までならOpenSSLを別途用意しなくてもビルド可能だが、Python3.10以降はOpenSSL1.1.1以降が必須となりビルドが必要。とりあえず現在のLTSである3.0.xで試してみる。
パスは$HOME/localとしたがどこでも良い。キモは--openssldir=/etc/sslでFreeBSDの標準のCAバンドルを参照することと、install_swで証明書関連やドキュメントはインストールせずバイナリー等のみをローカルにインストール。

ソースを展開して

mkdir -p $HOME/local/src
cd $HOME/local/src/
curl -O https://www.openssl.org/source/openssl-3.0.13.tar.gz
tar xvfpz openssl-3.0.13.tar.gz 
cd openssl-3.0.13

オプションを指定してビルド

./config --prefix=$HOME/local/openssl/3.0.13 --openssldir=/etc/ssl
make
make install_sw

これで~/local/openssl/3.0.13に実行ファイルやライブラリ等が入り/etc/sslに置かれた証明書バンドルや設定を参照するOpenSSL環境が出来あがる。

LD_LIBRARY_PATH=$HOME/local/openssl/3.0.13/lib \
~/local/openssl/3.0.13/bin/openssl version
OpenSSL 3.0.13 30 Jan 2024 (Library: OpenSSL 3.0.13 30 Jan 2024)

Pythonのビルド

pyenvなどの環境設定は省略。次の投稿とか。

コンソールから利用するならLD_LIBRARY_PATH環境変数でOpenSSLの場所を指定しビルドすれば動くが、CGIとして実行したいので、環境変数を設定したくない。CGIの頭でos.environ[]にてOpenSSLライブラリのパスを設定してもダメみたい。どうしたら良いか?ライブラリとして参照せずスタティックに組み込んでしまう。PY_UNSUPPORTED_OPENSSL_BUILD=staticがキモ。

上記OpenSSLの場所を指定しスタティックでビルド

CONFIGURE_OPTS="--with-openssl=$HOME/local/openssl/3.0.13" \
PY_UNSUPPORTED_OPENSSL_BUILD=static \
pyenv install 3.12.2

多分、3.11.x, 3.10.xでもいけると思う(やってない)。

import sslしたり、

$ ~/.pyenv/versions/3.12.2/bin/python
Python 3.12.2 (main, Mar 13 2024, 15:42:09) [GCC 7.5.0] on freebsd11
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 3.0.13 30 Jan 2024'
>>> 

次のコードが動けば多分とりあえず動いてる?

import urllib.request

with urllib.request.urlopen('https://dummyjson.com/products/1') as response:
   html = response.read()
   print(html)

このPython3.12環境にPoetryを入れて、とりあえず

  • Flask + Flask-CORS
  • FastAPI + Pydantic V1 + a2wsgi

をCGIとして動作させることができた。(ハロワレベル)

まとめ

  • OpenSSLをビルドする(証明書等はOSのデフォルトを参照で)
  • PythonのビルドはOpenSSLをstaticでビルド(PY_UNSUPPORTED_OPENSSL_BUILD)
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?