15장. 동적 프로그래밍 언어, 웹 서버, 데이터베이스 서버
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 2
는 라이프사이클이 더 짧기 때문에 고객이 더 원활하게 Python 3
으로 전환할 수 있도록 지원됩니다.
자세한 내용은 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
,python3.12
또는 python2
)은 각 버전에 버전되지 않은 명령을 구성하기 전에 설치해야 합니다.
/usr/bin/python
실행 파일은 alternatives
시스템에 의해 제어됩니다. 수동 변경 사항은 업데이트 시 덮어쓸 수 있습니다.
pip3
과 같은 추가 Python 관련 명령에는 구성 가능한 변형이 없습니다.
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.12로 구성하려면 다음을 사용합니다.# 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. 추가 리소스
-
alternatives(8)
및unversioned-python(1)
도움말 페이지
15.1.1.4. Python 스크립트에서 인터프리터 지시문 처리
Red Hat Enterprise Linux 8에서 실행 가능한 Python 스크립트는 최소한 주요 Python 버전을 명시적으로 지정하는 인터프리터 지시문( hashbangs 또는 herbangs)을 사용할 것으로 예상됩니다. 예를 들면 다음과 같습니다.
#!/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
RPM 패키지를 빌드할 때 /usr/lib/rpm/redhat/brp-mangle-shebangs
BRP(Buildroot 정책) 스크립트가 자동으로 실행되고 모든 실행 파일에서 인터프리터 지시문을 수정하려고 합니다.
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 …
여러 개의
PATHs
를 지정할 수 있습니다.PATH
가 디렉터리인 경우pathfix.py
는 모호한 인터프리터 지시문이 있는 뿐만 아니라^[a-zA-Z0-9_]+\.py$
패턴과 일치하는 Python 스크립트를 반복적으로 스캔합니다.%prep
섹션 또는%install
섹션의 끝에 이 명령을 추가합니다.-
패키지된 Python 스크립트가 예상 형식을 준수하도록 수정합니다. 이를 위해
pathfix.py
는 RPM 빌드 프로세스 외부에서도 사용할 수 있습니다. RPM 빌드 외부에서pathfix.py
를 실행하는 경우 위의 예에서%{__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-macrosspec
파일의 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
에서는 기본적으로 FPM(FastCGI Process Manager)을 사용합니다(스레드된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 풀 구성(/etc/php-fpm.d/www.conf
파일)으로 구성되어 있습니다.apache
사용자는 기본값입니다. -
설정 변경 후 또는 새로운 확장 기능을 설치한 후
php-fpm
서비스를 다시 시작해야 합니다. -
zip
확장은php-common
패키지에서 별도의 패키지php-pecl-zip
으로 이동
다음의 확장 기능이 제거되었습니다.
-
aspell
-
mysql
(php-mysqlnd
패키지에서 제공하는mysqli
및pdo_mysql
확장 기능을 계속 사용 가능). -
memcache
15.1.3. Perl
에서 주요 변경 사항
RHEL 8을 통해 배포된 Perl 5.26
에서는 RHEL 7에서 제공되었던 버전에 다음과 같은 변경 사항이 추가되었습니다.
-
이제
유니코드 9.0
이 지원됩니다. -
새로운
op-entry
,loading-file
및loaded-file
SystemTap
프로브가 제공됩니다. - 성능 향상을 위해 스칼라를 할당할 때 COW 메커니즘이 사용됩니다.
-
IPv4 및 IPv6 소켓을 투명하게 처리하는
IO::Socket::IP
모듈이 추가되었습니다. -
구조화된 방식으로
perl -V
데이터에 액세스하는Config::Perl::V
모듈이 추가되었습니다. -
CPAN(Comprehensive Perl Archive Network) 리포지토리에서 모듈을 검색, 추출, 빌드 및 설치하는
cpanm
유틸리티가 포함된 새로운perl-App-cpanminus
패키지가 추가되었습니다. -
보안상의 이유로 현재 디렉터리
.
이@INC
모듈 검색 경로에서 제거되었습니다. -
위에 설명된 동작 변경을 사용하여 파일을 로드하는 데 실패했을 때
do
문에서는 사용 중단 경고를 표시합니다. -
do subroutine(LIST)
호출은 더 이상 지원되지 않으므로 구문 오류가 발생합니다. -
현재 해시는 기본적으로 무작위로 지정됩니다. 해시에서 반환되는 키와 값의 순서는
perl
을 실행할 때마다 변경됩니다. 무작위 지정을 비활성화하려면PERL_PERTURB_KEYS
환경 변수를0
으로 설정합니다. -
정규 표현식 패턴에서 이스케이프되지 않은 리터럴
{
문자는 더 이상 사용되지 않습니다. -
$_
변수의 어휘 범위 지원은 제거되었습니다. -
배열이나 해시에서
defined
연산자를 사용하면 치명적인 오류가 발생합니다. -
UNIVERSAL
모듈에서 함수를 가져올 때 치명적인 오류가 발생합니다. -
find2perl
,s2p
,a2p
,c2ph
및pstruct
툴이 제거되었습니다. -
${^ENCODING}
기능이 제거되었습니다. encoding pragma의 기본 모드는 더 이상 지원되지 않습니다.encoding
pragma의 기본 모드는 더 이상 지원되지 않습니다.UTF-8
이외의 다른 인코딩으로 소스 코드를 작성하려면 인코딩의Filter
옵션을 사용합니다. -
이제
perl
패키지가 업스트림에 맞게 변경되었습니다. perl 패키지에서는 코어 모듈을 설치하고 /usr/bin/perl 인터프리터는 perl-interpreter 패키지로 제공됩니다.perl
패키지는 코어 모듈도 설치하고/usr/bin/perl
인터프리터는perl-interpreter
패키지에서 제공합니다. 이전 릴리스에서perl
패키지에는 최소한의 인터프리터만 포함했지만perl-core
패키지에는 인터프리터와 코어 모듈이 모두 포함되어 있었습니다. -
IO::Socket::SSL
Perl 모듈이./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.0.0
의 새로운 기능과 개선사항이 추가된 Ruby 2.5
를 제공합니다. 주요 변경 사항은 다음과 같습니다.
- 증분식 가비지 컬렉터 (Garbage Collector)가 추가되었습니다.
-
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에는 RHEL 7에서 배포된 버전 2.0에 비해 많은 새로운 기능, 향상된 기능 및 버그 수정사항이 추가된 SWIG(Simplified Wrapper and Interface Generator) 버전 3.0이 포함되어 있습니다. 특히 C ++ 11 표준에 대한 지원이 구현되었습니다. SWIG
는 이제 Go 1.6
,PHP 7
,Octave 4.2
, Python 3.5
에서도 지원됩니다.
15.1.6. RHEL에서 새로 추가된 Node.js
JavaScript 프로그래밍 언어로 빠르고 확장 가능한 네트워크 애플리케이션을 구축하기 위한 소프트웨어 개발 플랫폼인 Node.js
가 RHEL에서 처음으로 제공됩니다. 이전에는 소프트웨어 컬렉션으로만 제공되었습니다. RHEL 8에서는 Node.js 10
이 제공됩니다.