はじめに
- さくらのレンタルサーバは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
)