第15章 動的プログラミング言語、Web サーバー、およびデータベースサーバー
15.1. 動的プログラミング言語
15.1.1. Python への主な変更点
15.1.1.1. Python 3
が RHEL 8 におけるデフォルトの Python
実装に
Red Hat Enterprise Linux 8 には、Python 3
の複数のバージョンが同梱されています。Python 3.6
は、RHEL 8 のライフサイクル全体でサポートされる予定です。それぞれのパッケージは、デフォルトではインストールされない場合があります。
Python 2.7
は、python2
パッケージで入手できます。ただし、Python 3
への移行をより円滑に進められるように、Python 2
のライフサイクルは短くなっています。
詳細は、Python のバージョン を参照してください。
デフォルトの python
パッケージまたはバージョンを指定しない /usr/bin/python
実行ファイルは、いずれも RHEL 8 では配布されません。python3
または python2
を直接使用することが推奨されます。もしくは、管理者が、alternatives
コマンドを使用して、バージョン管理外の python
コマンドを設定できます。バージョン管理されていない Python の設定 を参照してください。
15.1.1.2. Python 2 から Python 3 への移行
開発者は、Python 2 で記述したコードを Python 3 に移行できます。
大規模なコードベースを Python 3 に移行する方法は The Conservative Python 3 Porting Guide を参照してください。
この移行が終了すると、元の Python 2 コードは Python 3 インタープリターにより解釈できるようになり、同様に Python 2 インタープリターは解釈できるままとなることに注意してください。
15.1.1.3. バージョンを指定しない Python の設定
システム管理者は、alternatives
コマンドを使用して、/usr/bin/python
に、バージョンを管理しない python
コマンドを設定できます。必要なパッケージ (python3、python38、python39、python3.11
、または python2
) は、バージョンを指定しないコマンドをそれぞれのバージョンに設定する前にインストールする必要があります。
/usr/bin/python
実行ファイルは 代替
システムによって制御されます。更新時に手動の変更が上書きされる可能性があります。
その他の Python 関連のコマンド (pip3
など) には、バージョンを指定しないで設定できるバリアントがあります。
15.1.1.3.1. バージョンを指定しない python コマンドを直接設定
バージョンを指定しない python
コマンドを、選択した Python バージョンに直接設定できます。
前提条件
- 必要なバージョンの Python がインストールされていることを確認する。
手順
バージョンを指定しない
python
コマンドを Python 3.6 に設定するには、以下を使用します。# alternatives --set python /usr/bin/python3
バージョンを指定しない
python
コマンドを Python 3.8 に設定するには、以下を使用します。# alternatives --set python /usr/bin/python3.8
バージョンを指定しない
python
コマンドを Python 3.9 に設定するには、以下を使用します。# alternatives --set python /usr/bin/python3.9
バージョンを指定しない
python
コマンドを Python 3.11 に設定するには、以下を使用します。# alternatives --set python /usr/bin/python3.11
バージョンを指定しない
python
コマンドを Python 3.11 に設定するには、以下を使用します。# alternatives --set python /usr/bin/python3.12
バージョンを指定しない
python
コマンドを Python 2 に設定するには、以下のコマンドを実行します。# alternatives --set python /usr/bin/python2
15.1.1.3.2. バージョンを指定しない python コマンドを、必要な Python バージョンに対話的に設定する
バージョンを指定しない python
コマンドを、必要な Python バージョンに対話的に設定できます。
前提条件
- 必要なバージョンの Python がインストールされていることを確認する。
手順
バージョンを指定しない
python
コマンドを対話的に設定するには、次のコマンドを実行します。# alternatives --config python
- 表示されたリストから必要なバージョンを選択します。
この設定をリセットし、バージョンを指定しない
python
コマンドを削除するには、次のコマンドを実行します。# alternatives --auto python
15.1.1.3.3. 関連情報
-
man ページの
alternatives(8)
およびunversioned-python(1)
15.1.1.4. Python スクリプトでのインタープリターディレクティブの処理
Red Hat Enterprise Linux 8 では、実行可能な Python スクリプトは、少なくとも主要な Python バージョンを明示的に指定するインタープリターディレクティブ (別名 hashbangs または shebangs) を使用することが想定されます。以下に例を示します。
#!/usr/bin/python3 #!/usr/bin/python3.6 #!/usr/bin/python3.8 #!/usr/bin/python3.9 #!/usr/bin/python3.11 #!/usr/bin/python3.12 #!/usr/bin/python2
/usr/lib/rpm/redhat/brp-mangle-shebangs
BRP (buildroot policy) スクリプトは、RPM パッケージをビルドする際に自動的に実行され、実行可能なすべてのファイルでインタープリターディレクティブを修正しようとします。
BRP スクリプトは、以下のようにあいまいなインタープリターディレクティブを含む Python スクリプトを検出すると、エラーを生成します。
#!/usr/bin/python
または
#!/usr/bin/env python
15.1.1.4.1. Python スクリプトでインタープリターディレクティブの変更
RPM ビルド時にビルドエラーが発生する Python スクリプト内のインタープリターディレクティブを変更します。
前提条件
- Python スクリプトのインタープリターディレクティブの一部でビルドエラーが発生する。
手順
インタープリターディレクティブを変更するには、以下のタスクのいずれかを実行します。
platform-python-devel
パッケージからpathfix.py
スクリプトを適用します。# pathfix.py -pn -i %{__python3} PATH …
複数の
PATH
を指定できます。PATH
がディレクトリーの場合、pathfix.py
はあいまいなインタープリターディレクティブを持つスクリプトだけでなく、^[a-zA-Z0-9_]+\.py$
のパターンに一致する Python スクリプトを再帰的にスキャンします。このコマンドを%prep
セクション、または%install
セクションに追加します。-
パッケージ化した Python スクリプトを、想定される形式に準拠するように変更します。この目的のために、
pathfix.py
は、RPM ビルドプロセス以外でも使用できます。pathfix.py
を RPM ビルド以外で実行する場合は、上記の例の%{__python3}
を、/usr/bin/python3
などのインタープリターディレクティブのパスに置き換えます。
パッケージ化された Python スクリプトに Python 3.6 以外のバージョンが必要な場合は、上記のコマンドを調整して必要なバージョンを含めます。
15.1.1.4.2. カスタムパッケージの /usr/bin/python3 インタープリターディレクティブの変更
デフォルトでは、/usr/bin/python3
の形式でのインタープリターディレクティブは、Red Hat Enterprise Linux のシステムツールに使用される platform-python
パッケージから Python を参照するインタープリターディレクティブに置き換えられます。カスタムパッケージの /usr/bin/python3
インタープリターディレクティブを変更して、AppStream リポジトリーからインストールした特定バージョンの Python を参照できます。
手順
Python の特定バージョンのパッケージを構築するには、対応する
python
パッケージのpython*-rpm-macros
サブパッケージを SPEC ファイルの BuildRequires セクションに追加します。たとえば、Python 3.6 の場合は、以下の行を追加します。BuildRequires: python36-rpm-macros
これにより、カスタムパッケージの
/usr/bin/python3
インタープリターディレクティブは、自動的に/usr/bin/python3.6
に変換されます。
BRP スクリプトがインタープリターディレクティブを確認したり、変更したりしないようにするには、以下の RPM ディレクティブを使用します。
%undefine __brp_mangle_shebangs
15.1.1.5. net-snmp
パッケージの Python
バインディングが利用できない
Net-SNMP
のツールスイートは、RHEL 8 のデフォルトの Python
の実装である Python 3
にバインディングを提供しません。これにより、python-net-snmp
パッケージ、python2-net-snmp
パッケージ、または python3-net-snmp
パッケージが RHEL 8 では使用できません。
15.1.2. PHP
への主な変更点
Red Hat Enterprise Linux 8 には PHP 7.2
が同梱されています。このバージョンには、RHEL 7 で利用できた PHP 5.4
に対する重要な変更が追加されています。
-
PHP
はデフォルトで FastCGI Process Manager (FPM) を使用します (スレッド化されたhttpd
で安全に使用できます)。 -
php_value
変数とphp-flag
変数がhttpd
設定ファイルで使用されなくなり、代わりにプール設定の/etc/php-fpm.d/*.conf
で設定する必要があります。 -
PHP
スクリプトのエラーと警告のログは、/var/log/httpd/error.log
ではなく/var/log/php-fpm/www-error.log
ファイルに記録されます。 -
PHP の
max_execution_time
設定変数を変更する時は、変更した値に合わせてhttpd
ProxyTimeout
設定を増やす必要があります。 -
PHP
スクリプトを実行するユーザーが、FPM プール設定 (apache
ユーザーがデフォルトとなる/etc/php-fpm.d/www.conf
ファイル) に設定されるようになりました。 -
設定を変更した場合、または新しい拡張機能をインストールした場合は、
php-fpm
サービスを再起動する必要があります。 -
zip
拡張が、php-common
から、別のパッケージphp-pecl-zip
に移動しました。
以下の拡張機能が削除されました。
-
aspell
-
mysql
(拡張機能のmysqli
およびpdo_mysql
は、php-mysqlnd
パッケージで引き続き利用できます) -
memcache
15.1.3. Perl
への主な変更点
RHEL 8 で提供される Perl 5.26
では、RHEL 7 で提供されていたバージョンに以下のような変更が追加されました。
-
Unicode 9.0
に対応するようになりました。 -
新しい
SystemTap
のプローブop-entry
、loading-file
、およびloaded-file
が提供されるようになりました。 - パフォーマンスを向上させるために、スカラーの割り当て時に、コピーオンライトメカニズムが使用されます。
-
IPv4 ソケットおよび IPv6 ソケットを透過的に処理するために
IO::Socket::IP
モジュールが追加されました。 -
構造化された方法で
perl -V
データにアクセスするために、Config::Perl::V
モジュールが追加されました。 -
Comprehensive Perl Archive Network (CPAN) リポジトリーからモジュールを取得、抽出、ビルド、およびインストールする
cpanm
ユーティリティーを同梱するperl-App-cpanminus
パッケージが追加されました。 -
セキュリティー上の理由により、
@INC
モジュールの検索パスから、現在のディレクトリー (.
) が削除されました。 -
上記の動作上の変更によりファイルの読み込みに失敗した時に、
do
ステートメントが非推奨の警告を返すようになりました。 -
do subroutine(LIST)
呼び出しに対応しなくなり、構文エラーが発生するようになりました。 -
ハッシュがデフォルトでランダム化されるようになりました。ハッシュから鍵と値が返される順序は、
perl
の実行ごとに変わります。ランダム化を無効にするには、PERL_PERTURB_KEYS
環境変数を0
に設定します。 -
正規表現のパターンで、エスケープされていないリテラルの
{
文字が使用できなくなりました。 -
$_
変数に対する語彙的なスコープへの対応が削除されました。 -
配列またはハッシュに
defined
演算子を使用すると、致命的なエラーが発生します。 -
UNIVERSAL
モジュールから関数をインポートすると、致命的なエラーが発生します。 -
find2perl
ツール、s2p
ツール、a2p
、c2ph
ツール、およびpstruct
ツールが削除されました。 -
${^ENCODING}
機能が削除されました。encoding
プラグマのデフォルトモードに対応しなくなりました。UTF-8
以外のエンコーディングでソースコードを記述する場合は、エンコーディングのFilter
オプションを使用します。 -
アップストリームに合わせて、
perl
パッケージが変更になりました。perl
パッケージはコアモジュール群をインストールし、/usr/bin/perl
インタープリターはperl-interpreter
パッケージで提供されます。以前のリリースでは、perl
パッケージに最小限のインタープリターだけが同梱され、perl-core
パッケージにインタープリターとコアモジュールの両方が同梱されていました。 -
Perl モジュールの
IO::Socket::SSL
は、./certs/my-ca.pem
ファイルまたは./ca
ディレクトリーから認証局の証明書、./certs/server-key.pem
ファイルからサーバーの秘密鍵、./certs/server-cert.pem
ファイルからサーバーの証明書、./certs/client-key.pem
ファイルからクライアントの秘密鍵、./certs/client-cert.pem
ファイルからクライアント証明書を読み込まなくなりました。代わりにファイルのパスを明示的に指定します。
15.1.4. Ruby
への主な変更点
RHEL 8 では、RHEL 7 に同梱されていた Ruby 2.5
に新機能および機能強化を追加した Ruby 2.0.0
が提供されます。以下は、主な変更点です。
- インクリメンタルガベージコレクターが追加されました。
-
Refinements
構文が追加されました。 - シンボルは、ガベージコレクションが行われるようになりました。
-
安全レベルの
$SAFE=2
および$SAFE=3
が廃止されました。 -
Fixnum
クラスとBignum
クラスが、Integer
クラスに統合されました。 -
Hash
クラスの最適化、インスタンス変数へのアクセスの向上、ならびにMutex
クラスの小型化および高速化により、パフォーマンスが向上しました。 - 古い API が非推奨になりました。
-
RubyGems
、Rake
、RDoc
、Psych
、Minitest
、test-unit
などのバンドルされたライブライリーが更新されました。 -
Ruby
とともに配布されていたmathn
、DL
、ext/tk
、XMLRPC
などのライブラリーは非推奨になり、同梱されなくなりました。 -
SemVer
バージョン管理スキームが、Ruby
バージョン管理に使用されるようになりました。
15.1.5. SWIG
への主な変更点
RHEL 8 には、SWIG (Simplified Wrapper and Interface Generator) バージョン 3.0 が含まれています。RHEL 7 に同梱されていたバージョン 2.0 に新機能、機能拡張、およびバグ修正が数多く追加されました。特に注目すべきは、C++11 標準仕様への対応が実装されたことです。SWIG
は、Go 1.6
、PHP 7
、Octave 4.2
、および Python 3.5
に対応するようになりました。
15.1.6. Node.js
が RHEL に新登場
JavaScript プログラミング言語で高速でスケーラブルなネットワークアプリケーションを構築するソフトウェア開発プラットフォームである Node.js
が RHEL で初めて提供されます。以前は、Software Collection からしか入手できませんでした。RHEL 8 では Node.js 10
が提供されます。