Red Hat Training

A Red Hat training course is available for RHEL 8

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.7python2 패키지에서 사용할 수 있습니다. 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 또는 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 2로 구성하려면 다음을 사용하십시오.

    # alternatives --set python /usr/bin/python2
15.1.1.3.2. 필수 Python 버전에 버전이 없는 python 명령을 대화형으로 구성

버전이 없는 python 명령을 대화식으로 필수 Python 버전으로 구성할 수 있습니다.

사전 요구 사항

  • 필요한 Python 버전이 설치되어 있는지 확인합니다.

절차

  1. 버전이 없는 python 명령을 대화식으로 구성하려면 다음을 사용합니다.

    # alternatives --config python
  2. 제공된 목록에서 필요한 버전을 선택합니다.
  3. 이 구성을 재설정하고 버전이 없는 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/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-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에서는 기본적으로 FPM(FastCGI Process Manager)을 사용합니다(스레드된 httpd로 안전하게 사용 가능).
  • php_valuephp-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 패키지에서 제공하는 mysqlipdo_mysql 확장 기능을 계속 사용 가능).
  • memcache

15.1.3. Perl에서 주요 변경 사항

RHEL 8을 통해 배포된 Perl 5.26에서는 RHEL 7에서 제공되었던 버전에 다음과 같은 변경 사항이 추가되었습니다.

  • 이제 유니코드 9.0이 지원됩니다.
  • 새로운 op-entry, loading-fileloaded-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, c2phpstruct 툴이 제거되었습니다.
  • ${^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 안전 레벨은 이제 폐지됩니다.
  • FixnumBignum 클래스는 Integer 클래스로 통합되었습니다.
  • Hash 클래스를 최적화하고 인스턴스 변수에 대한 액세스를 향상시키고 Mutex 클래스를 더 작고 빠르게 최적화하여 성능을 향상시킬 수 있습니다.
  • 이전 API 중 일부는 더 이상 사용되지 않습니다.
  • RubyGems, Rake, RDoc, Psych, Minitesttest-unit과 같이 번들된 라이브러리가 업데이트되었습니다.
  • Ruby를 통해 이전에 배포된 mathn, DL, ext/tkXMLRPC 등의 라이브러리는 더 이상 사용되지 않거나 포함되지 않습니다.
  • 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이 제공됩니다.