第16章 動的プログラミング言語、Web サーバー、およびデータベースサーバー
16.1. 動的プログラミング言語 リンクのコピーリンクがクリップボードにコピーされました!
16.1.1. Python への主な変更点 リンクのコピーリンクがクリップボードにコピーされました!
16.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 の設定 を参照してください。
16.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 インタープリターは解釈できるままとなることに注意してください。
16.1.1.3. バージョンを指定しない Python の設定 リンクのコピーリンクがクリップボードにコピーされました!
システム管理者は、alternatives コマンドを使用して、/usr/bin/python に、バージョンを管理しない python コマンドを設定できます。必要なパッケージ (python3、python38、python39、python3.11、python3.12、または python2) は、バージョンを指定しないコマンドをそれぞれのバージョンに設定する前にインストールする必要があることに注意してください。
/usr/bin/python 実行ファイルは 代替 システムによって制御されます。更新時に手動の変更が上書きされる可能性があります。
その他の Python 関連のコマンド (pip3 など) には、バージョンを指定しないで設定できるバリアントがあります。
16.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.12 に設定するには、以下を使用します。# alternatives --set python /usr/bin/python3.12バージョンを指定しない
pythonコマンドを Python 2 に設定するには、以下のコマンドを実行します。# alternatives --set python /usr/bin/python2
16.1.1.3.2. バージョンを指定しない python コマンドを、必要な Python バージョンに対話的に設定する リンクのコピーリンクがクリップボードにコピーされました!
バージョンを指定しない python コマンドを、必要な Python バージョンに対話的に設定できます。
前提条件
- 必要なバージョンの Python がインストールされていることを確認する。
手順
バージョンを指定しない
pythonコマンドを対話的に設定するには、次のコマンドを実行します。# alternatives --config python- 表示されたリストから必要なバージョンを選択します。
この設定をリセットし、バージョンを指定しない
pythonコマンドを削除するには、次のコマンドを実行します。# alternatives --auto python
16.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
16.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 以外のバージョンが必要な場合は、上記のコマンドを調整して必要なバージョンを含めます。
16.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
16.1.1.5. net-snmp パッケージの Python バインディングが利用できない リンクのコピーリンクがクリップボードにコピーされました!
Net-SNMP のツールスイートは、RHEL 8 のデフォルトの Python の実装である Python 3 にバインディングを提供しません。これにより、python-net-snmp パッケージ、python2-net-snmp パッケージ、または python3-net-snmp パッケージが RHEL 8 では使用できません。
16.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設定変数を変更する時は、変更した値に合わせてhttpdProxyTimeout設定を増やす必要があります。 -
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
16.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ファイルからクライアント証明書を読み込まなくなりました。代わりにファイルのパスを明示的に指定します。
16.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バージョン管理に使用されるようになりました。
16.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 に対応するようになりました。
16.1.6. Node.js が RHEL に新登場 リンクのコピーリンクがクリップボードにコピーされました!
JavaScript プログラミング言語で高速でスケーラブルなネットワークアプリケーションを構築するソフトウェア開発プラットフォームである Node.js が RHEL で初めて提供されます。以前は、Software Collection からしか入手できませんでした。RHEL 8 では Node.js 10 が提供されます。