리눅스 Nginx PHP MySQL 설치 - Arm Oracle Linux8 - CentOS8 - AArch64 - Arm

Share

Last Updated on 3월 11, 2023 by Jade(정현호)

안녕하세요 
이번 포스팅에서는 오라클 클라우드에서 새로 추가 되면서 프리티어에서도 제공이 된 Arm아키텍처 컴퓨트 인스턴스인 Ampere A1 Compute 에 Nginx PHP-FPM MySQL 을 구성하는 글을 작성해보도록 하겠습니다.

오라클 클라우드 Arm A1 컴퓨트 인스턴스에 대한 내용은 아래 포스팅을 참조하시면 됩니다. 


구성과 몇가지 작업을 완료 후에 해당 블로그 와 페도라 한국 사용자 모임 사이트를 새롭게 생성한 Arm 아키텍처인 Ampere A1 Compute 인스턴스로 이전할 예정 입니다.


• 구성 환경

Cloud : 오라클 클라우드 프리티어
OS : Oracle Linux 8.3 AArch64(Arm 아키텍처)
Nginx : SRPM Package - v1.21.0
PHP : Source Compile  - v8.0.7
  (참고) 21년 11월 25일 PHP 8.1 버전이 출시된 관계로 8.1 을 사용해도 됩니다
MySQL : RPM Package - v8.0.21
      

1. OS 환경 구성

1-1 외부 Repository 추가 구성

먼저 외부 Repository 를 구성하도록 하겠습니다. 포스팅에서 진행은 root 유저로 진행 하였습니다. 일반 유저로 사용할 경우 명령어 앞에 sudo 를 사용하여서 진행하시면 됩니다.

[root]# dnf -y install dnf-plugins-core
[root]# dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm


-- 아래는 사용중인 OS에 따라서 선택해서 설치를 진행
-- CentOS 8 Repoid (8.2.2004 and before)
[root]# dnf config-manager --set-enabled PowerTools

-- CentOS 8 Repoid (8.3.2011 and later)
[root]# dnf config-manager --set-enabled powertools

-- Oracle Linux 8
[root]# dnf config-manager --set-enabled ol8_codeready_builder

-- RHEL 8
[root]# subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms

*   포스팅에서는 Oracle Linux 8 로 사용하여서 --set-enabled ol8_codeready_builder  으로 진행 하였습니다.


1-2 패키지 설치

PHP 컴파일이나 ModSecurity 등과 같이 연계된 애플리케이션의 컴파일 설치시 그리고 필요한 별도의 유틸리티 설치를 위해 한번에 설치 하도록 하겠습니다.

dnf -y install ncurses ncurses-devel \
ncurses-libs openssl openssl-devel glibc \
bison make cmake readline gcc gcc-c++ wget \
autoconf automake libtool* libmcrypt* git \
patchelf libtirpc* numactl numactl-devel \
ncurses-compat-libs libaio libaio-devel \
telnet glances htop nano vi vim coreutils \
pcre pcre-devel curl curl-devel mailx postfix \
GeoIP GeoIP-data GeoIP-devel geoipupdate rsync \
lmdb lmdb-libs lmdb-devel  yajl-devel yajl \
ssdeep-devel ssdeep ssdeep-libs doxygen \
compat-lua-devel lua compat-lua bash-completion \
policycoreutils-python-utils sqlite-devel \
oniguruma-devel libzip libzip-devel \
glibc-langpack-ko glibc-langpack-en \
libxml2 libxml2-devel bzip2-devel bzip2 gd-devel



1-3 Timezone 변경

클라우드를 통해 생성된 컴퓨트 인스턴스는 보통 Timezone 이 GMT 로 되어있는 경우가 대부분(또는 많은) 입니다. 그래서 클라우드 에서 컴퓨트 인스턴스를 생성 하였을 경우 시스템의 Timezone 을 확인 및 변경 해야 합니다.

1-3-1 현재 Timezone 확인

-- date 로 현재 시간 확인
[root]# date
Fri Jun 18 19:04:27 GMT 2021

-- timedatectl 명령으로 현재 TimeZone을 확인
[root]# timedatectl
               Local time: Fri 2021-06-18 19:04:33 GMT
           Universal time: Fri 2021-06-18 19:04:33 UTC
                 RTC time: Fri 2021-06-18 19:04:33
                Time zone: GMT (GMT, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no



1-3-2 Asia/Seoul 로 변경

-- Asia/Seoul 로 변경
[root]# timedatectl set-timezone Asia/Seoul

-- 변경 확인 
[root]# timedatectl

      Local time: Mon 2021-06-18 19:05:03 KST
  Universal time: Sun 2021-06-18 10:05:03 UTC
        RTC time: Sun 2021-06-18 10:05:03
       Time zone: Asia/Seoul (KST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a


-- 변경 확인 : date
Fri Jun 18 19:05:15 KST 2021


타임 존이 변경되었다면, sshd 와 crontab 데몬의 재시작을 한번 실행 합니다.

[root]# systemctl restart crond

[root]# systemctl restart sshd



1-4 rc.local 활성화 사용하기

/etc/rc.local 에 스크립트나 명령어 등을 기록해 두면 부팅시 실행해주는 rc.local 스크립트는 기본적으로 비활성화 되어 있습니다. 사용하기 위해서는 일부 간단한 작업이 필요 합니다. 포스팅 환경에서는 활성화 하였으며 필요하신 경우 아래 이전 포스팅에서 내용을 참조하시면 됩니다.



1-5 Transparent Huge Pages 비활성화

Transparent Huge Pages 기능 비활성화를 진행하였으며 관련 된 내용은 아래 포스팅을 참조하시면 됩니다.



1-6 Fail2ban 설치 구성

SSH 접속 공격에 대한 보안 사항으로 Public Cloud 나 VPS 서비스와 같이 외부에서 SSH 를 접속 할 수 있는 환경에서는 Fail2ban 이 필수적으로 필요하며 상황에 따라서 Denyhosts 를 설치하여 보안을 강화 할 수 있습니다. 포스팅 환경에서는 Fail2ban 으로 진행 하였으며 관련 내용은 아래 포스팅에서 확인 하시면 됩니다.



1-7 커널 파라미터 변경

여러 커널 파라미터 값을 늘려주거나 swap 사용조건을 낮춰 주는 등의 몇가지 설정을 진행하겠습니다.

-- 커널파라미터 입력
[root]# vi /etc/sysctl.conf


vm.swappiness=1

net.core.rmem_default = 16777216
net.core.rmem_max = 56777216
net.core.wmem_default = 16777216
net.core.wmem_max = 56777216
net.ipv4.tcp_rmem = 4096 131072 5809920
net.ipv4.tcp_wmem = 4096 16384  4194304
net.nf_conntrack_max = 131072
net.core.netdev_max_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
kernel.msgmnb = 1048576
kernel.msgmax = 2097152
net.ipv4.tcp_window_scaling = 1
net.ipv4.ip_local_port_range = 9000 65000

fs.aio-max-nr = 1048576
fs.file-max = 6815744


-- 입력 내용 적용
[root]# sysctl -p



1-8 User Limit 값 변경

유저 별 ulimit 값을 변경 하도록 하겠습니다.

-- limits.conf 파일 수정
[root]# vi /etc/security/limits.conf

nginx    hard   nofile    65536
nginx    soft   nofile    65536
nginx    soft   nproc     16384
nginx    hard   nproc     16384

mysql    soft   memlock  unlimited
mysql    hard   memlock  unlimited
mysql    hard   nofile    65536
mysql    soft   nofile    65536
mysql    soft   nproc     16384
mysql    hard   nproc     16384

 
 

2. Nginx

OS 환경이 완료 되었다면 그 다음은 Nginx 설치를 진행 합니다.

2-1 Nginx 설치


Nginx 에서 HTTP/2 적용 과 HTTPS TLS v1.3 를 사용하기 위해서는 일정 이상의 버전이 필요합니다.

HTTP/2 : nginx 1.9.5 이상 , OpenSSL 1.0.2

HTTPS TLS v1.3 : nginx 1.13.0 이상, OpenSSL 1.1.1


2-1-1 기본 Repository 에서 설치

포스팅에서 진행할 Oracle Linux 8.3(CentOS 8.3) 에서의 기본 레파지토리에서 설치 가능한 버전은 아래와 같아서 필요 버전이 모두 충족하여 기본 레파지토리에 있는 Nginx 를 사용하여도 될 것 같습니다.

[root]# nginx -V
nginx version: nginx/1.14.1 <---
built by gcc 8.2.1 20180905 (Red Hat 8.2.1-3.0.1) (GCC)
built with OpenSSL 1.1.1 FIPS 11 Sep 2018 <---
(running with OpenSSL 1.1.1g FIPS 21 Apr 2020)
TLS SNI support enabled


2-1-2 Nginx Repository 에서 설치

또는 Nginx Repository 를 추가하여 최신 버전으로 빌드 된 패키지를 설치는 방법도 있습니다. Nginx Repository 를 추가 하여 설치시 설치되는 버전은 포스팅 시점에서 아래와 같습니다.

[root]# nginx -V
nginx version: nginx/1.21.0  <---
built by gcc 8.4.1 20200928 (Red Hat 8.4.1-1) (GCC)
built with OpenSSL 1.1.1c FIPS 28 May 2019 <---
(running with OpenSSL 1.1.1g FIPS 21 Apr 2020)
TLS SNI support enabled


Nginx Repository 를 추가 하여 설치 할 경우 아래와 같이 진행하시면 됩니다.

-- Nginx Repository 추가

[root]# vi /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true


-- makecache 수행
[root]# dnf makecache


-- Nginx 설치
[root]# dnf -y install nginx



2-1-3 SRPM 또는 Source 컴파일로 설치

더 최신 버전이나 특정 버전이 필요할 경우 SRPM 이나 Source Code 컴파일 하여 사용할 수 있습니다. SRPM 을 이용하여 설치에 관해서는 아래 포스팅을 참조하시면 됩니다.



포스팅 환경에서는 아래 openssl 1.1.1 취약점 관련하여 설치시 최신의 1.1.1k 를 이용하여 SRPM 으로 진행하였습니다.


# nginx -V
nginx version: nginx/1.21.0
built by gcc 8.4.1 20200928 (Red Hat 8.4.1-1.0.1) (GCC)
built with OpenSSL 1.1.1k 25 Mar 2021
TLS SNI support enabled


2-2 LimitNOFILE 수정

설치방법과 무관하게 Nginx 의 NOFILE의 수치를 변경을 하기 위해서 서비스 파일을 수정하도록 하겠습니다

[root]# vi /usr/lib/systemd/system/nginx.service

[Service]
Type=forking
LimitNOFILE=65535
<-- [Service] 항목에서 추가 


-- 서비스 reload, service 파일 수정시 수행 필요
[root]# systemctl daemon-reload



2-3 ModSecurity 설치

Nginx 에서 웹방화벽 WAF 인 ModSecurity 의 설치는 아래 포스팅을 참조하시면 됩니다.



2-4 SELinux 정책

Nginx 그리고 PHP 사용 과정에서 SELinux 에 의해서 제한 이나 차단되는 경우가 발생될 수 있습니다.

사용하는 환경과 데몬이 사용하는 Function 또는 접근 파일, 디바이스 등에 따라서 차단 사유와 부여해야 하는 권한이 다르게 됩니다. 그래서 최대한 여러가지 부분에서 SELinux 정책 허용 설정한 TE(Type Enforcement) 파일을 통해 여러 정책을 한번에 적용하는 것도 사용해보시면 좋을것 같습니다.

파일 다운로드 : 링크 클릭
* wget 대신 링크를 클릭하여 파일을 다운로드 받아주시기 바랍니다.


• 적용 방법

-- 적책 적용
[root]# checkmodule -M -m -o nginx-passenger.mod nginx-passenger.te
[root]# semodule_package -o nginx-passenger.pp -m nginx-passenger.mod
[root]# semodule -i nginx-passenger.pp


-- 정책 허용 확인
[root]# audit2allow -a


#============= httpd_t ==============

#!!!! This avc is allowed in the current policy  <-- Allowed 된것을 확인 할 수 있습니다
allow httpd_t root_t:file map;

 
 

3. MySQL

3-1 MySQL 설치 

[root]# dnf -y install mysql-server mysql mysql-devel

[root]# mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.21 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>



패키지로 설치 되는 버전에 따라서 아래와 같이 root 의 localhost 에서 기본 비밀번호가 지정되지 않아서 비밀번호 없이 접속이 가능 합니다.

mysql> select user,host,authentication_string 
    -> from mysql.user;
+------------------+-----------+-----------------------------+
| user             | host      | authentication_string       |
+------------------+-----------+-----------------------------+
| mysql.infoschema | localhost | xxxxxxxxxxxxxxxxxxxxxxxxxxx |
| mysql.session    | localhost | xxxxxxxxxxxxxxxxxxxxxxxxxxx |
| mysql.sys        | localhost | xxxxxxxxxxxxxxxxxxxxxxxxxxx |
| root             | localhost |                             |
+------------------+-----------+-----------------------------+



3-2 SELinux 정책 설정

SELinux 가 활성화 되어있는 RHEL , CentOS , Oracle Linux 환경에서는 아래와 같이 일부 SELinux 정책 허용이 필요 합니다.

-- mysql_selinux_allow.te 파일을 생성
[root]# vi mysql_selinux_allow.te

module mysql_selinux_allow 1.0;

require {
        type mysqld_t;
        type mysqld_tmp_t;
        type tmp_t;
        type init_t;
        class sock_file create;
        class file unlink;
}

#============= init_t ==============
allow init_t mysqld_tmp_t:file unlink;

#============= mysqld_t ==============
allow mysqld_t tmp_t:sock_file create;



-- 아래 순서대로 SELinux 정책 적용
[root]# checkmodule -M -m -o mysql_selinux_allow.mod mysql_selinux_allow.te
[root]# semodule_package -o mysql_selinux_allow.pp -m mysql_selinux_allow.mod
[root]# semodule -i mysql_selinux_allow.pp


-- MySQL 접속 관련 정책 변경
[root]# setsebool -P httpd_can_network_connect 1
[root]# setsebool -P httpd_can_network_connect_db 1



3-3 LimitNOFILE 설정

MySQL의 서비스 등록 스크립트에서 LimitNOFILE 변경하도록 하겠습니다.

[root]# vi /usr/lib/systemd/system/mysqld.service

-- 기본 20000 만으로 되어있음, 65535 로 변경
-- 내용이 없다면 [Service] 아래 작성을 하면 됨
LimitNOFILE = 20000

to

LimitNOFILE = 65535

 
서비스 파일을 수정하였다면 reload 를 합니다.

-- 서비스 reload, service 파일 수정시 수행 필요
[root]# systemctl daemon-reload


 

4. PHP

4-1 PHP 설치

8버전 OS 의 Arm 아키텍처용 빌드 패키지가 버전이 높지 않은 관계로 PHP8 을 사용하기 위해서 PHP 는 컴파일로 설치를 진행 하려고 합니다.

-- 디렉토리는 포스트에서 예시 입니다.
[root]# mkdir -p /root/pkg
[root]# cd pkg


[root]# wget --no-check-certificate https://www.php.net/distributions/php-8.0.7.tar.gz
[root]# tar zxvf php-8.0.7.tar.gz
[root]# cd /root/pkg/php-8.0.7


-- configure 설정
[root]# ./configure --prefix=/usr/local/php-8.0.7 \
--with-config-file-path=/etc \
 --enable-soap --with-zlib-dir --with-iconv \
--enable-mbstring --with-zip --enable-exif \
--enable-gd --with-external-gd --with-zlib \
--with-webp --with-jpeg --with-bz2 \
--with-libxml --enable-gd-jis-conv  \
--with-freetype --with-xpm \
--enable-sockets --with-openssl  \
--with-gettext --enable-sigchild \
--enable-opcache --enable-fpm \
--with-fpm-user=nginx --with-fpm-group=nginx \
--with-pdo_mysql --with-curl --enable-exif \
--enable-bcmath --enable-mbstring=all \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd


-- Build 및 설치
[root]# make;make install

 

Note

PHP 8.1 이 2021년 11월 25일에 릴리즈 되었으며 8.1 에서는 ARM 아키텍처 환경에서 Jit compiler 기능을 사용할 수 있게 되었습니다.

설치 방식은 위의 8.0 과 동일 하며 같이 설치되는 imagick 버전도 포스팅에서의 버전보다 상위 버전으로 설치해서 사용할 수도 있습니다



4-2 imagick Extension 설치

imagick은 PHP의 이미지 처리 라이브러리로 이미지 처리 라이브러리 입니다.

[root]# dnf install ImageMagick-devel


[root]# cd /root/pkg/
[root]# wget --no-check-certificate https://pecl.php.net/get/imagick-3.5.1.tgz
[root]# tar zxvf imagick-3.5.1.tgz

[root]# LANG=C
[root]# cd imagick-3.5.1
[root]# /usr/local/php-8.0.7/bin/phpize

[root]# ./configure --with-php-config=/usr/local/php-8.0.7/bin/php-config
[root]# make && make install

Installing shared extensions:     /usr/local/php-8.0.7/lib/php/extensions/no-debug-non-zts-20200930/
Installing header files:          /usr/local/php-8.0.7/include/php/


[root]# ls -al /usr/local/php-8.0.7/lib/php/extensions/no-debug-non-zts-20200930/


포스팅에서 설치한 이후 버전을 사용해도 되며, 버전에 대한 정보는 아래 사이트에서 확인 하시면 됩니다.



4-3 php.ini 설정

php.ini 파일을 설정을 진행 합니다.

-- php.ini 파일 복사
[root]# cd /root/pkg/php-8.0.7
[root]# cp php.ini-production /etc/php.ini


-- php.ini 내용 수정
[root]# vi /etc/php.ini


extension_dir = "/usr/local/php-8.0.7/lib/php/extensions/no-debug-non-zts-20200930/"

date.timezone = Asia/Seoul
expose_php = Off
post_max_size = 500M
upload_max_filesize = 200M
memory_limit = 512M


[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=192
    ; 단위는 MB 이며 default는 7.0 부터 128MB 입니다(이전은 64MB)
    ; 192 는 예시임으로 꼭 같게 하지 않아도 됩니다
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.revalidate_path=1
opcache.dups_fix=1
opcache.fast_shutdown=1
opcache.enable_file_override=1
opcache.enable_cli=0


[imagick]
extension=imagick.so

아래에서 디렉토리의 심볼릭 링크를 설정한다면 extension_dir 를 해당 경로로 변경해도 됩니다.
예시 -> extension_dir=/usr/local/php/lib/php/extensions/no-debug-non-zts-20200930


사용 편의성을 위해서 디렉토리에 심볼릭 링크를 설정 하도록 하겠습니다(선택사항)

-- 심볼릭 링크
[root]# cd /usr/local/
[root]# ln -s php-8.0.7 php


-- 버전 정보 확인
[root]# cd /usr/local/php/bin
[root]# ./php -v
PHP 8.0.7 (cli) (built: Jun 19 2021 09:46:40) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.7, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.7, Copyright (c), by Zend Technologies



4-4 php-fpm 설정

php-fpm 파일을 설정을 아래와 같이 설정 합니다.

-- 로그가 생성될 디렉토리를 생성 합니다.
[root]# mkdir -p /var/log/php-fpm/


-- php-fpm.conf 복사
[root]# cd /usr/local/php/etc
[root]# cp php-fpm.conf.default php-fpm.conf


-- php-fpm.conf 파일 수정
[root]# vi php-fpm.conf

-- 주석제거
pid = run/php-fpm.pid

-- 주석제거, 수정
error_log = /var/log/php-fpm/php-fpm.log


-- 설정시 접속 관련 debug 을 위해 설정한 것으로 default로 하여도 됩니다.
; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = debug


-- 주석제거
daemonize = yes


-- 주석제거, 수정
include=/usr/local/php-8.0.7/etc/php-fpm.d/*.conf



4-4 php-fpm Pool 설정

pool 별로 pool 이름, 최대 프로세스, 로그 등을 설정 할 수 있습니다.

• 설정-1

-- default 파일을 통해 파일 생성
[root]# cd /usr/local/php/etc/php-fpm.d
[root]# cp www.conf.default www.conf

-- 파일 수정
[root]# vi www.conf

-- 주석제거, pool 이름은 사용할 이름으로 변경
[www]


-- 주석제거, php-fpm 을 기동할 유저 및 그룹 지정
-- 포스팅에서는 nginx 임 
user = nginx
group = nginx


-- 주석제거, php-fpm.sock 파일에 대한 ownership 및 permission 설정
listen.owner = nginx
listen.group = nginx
listen.mode = 0660



[참고] IP 접속 방식과 UDS

php-fpm 을 사용시 접속 방법은 크게 2가지 방법으로 사용 할 수 있습니다.

IP 방식과 UDS 라는 Unix Domain Socket 으로 .sock 파일을 이용 하는 것입니다.

1) Apache 혹은 Nginx 와 PHP-FPM을 서버 한곳에서 같이 사용하는 환경이라면 UDS 로 사용하는 부분이 조금더 편하게 프로세스 간의 통신으로 사용 할 수 있습니다

물론 같은 서버내에서 사용하는 환경이라도 IP 방식으로 사용 할 수 있습니다.
UDS 혹은 IP 방식으로 사용 할지를 선택하여 사용 하시면 됩니다.

2) Apache 혹은 Nginx 와 PHP-FPM 을 서버를 분리 하여 각각 사용 하는 환경이라면 IP접속 방식을 사용 해야 합니다.



• 설정-2 : Listen 방식 설정

사용하는 방식에 따라서 Pool 파일(www.conf)에 설정 합니다.

1) UDS를 사용 할 경우 
listen = /var/run/php-fpm/php-fpm.sock
--> 같은 서버내에서 사용하는 보통의 환경에서는 UDS 로 사용하시면 됩니다.

# Socket Directory 생성 및 tmpdir 관련 설정
[root]# mkdir -p /run/php-fpm/
==> socket 이 생성될 위치를 먼저 생성 해줍니다.
==> 참고로 /run 은 /var/run 과 같습니다.


재부팅 후에 디렉토리가 생성될 수 있도록 파일 작성
[root]# cd /usr/lib/tmpfiles.d
[root]# vi php-fpm.conf

d /run/php-fpm 0755 root root -


2) IP 를 사용 할 경우
listen = 9000
--> 같은 서버내에서 사용하는 보통의 환경에서는 127.0.0.1:9000 으로 사용하여 됩니다
--> 다른 서버에서 접속하는 환경으로 이라면 포트만 기재하여 모든곳에서 다 접속이 가능하도록 설정 하면 됩니다.


• 설정-3 : 
php-fpm 프로세스 조정

다시 이어서 수정하던 www.conf 파일을 계속 수정 합니다.
~# vi /usr/local/php/etc/php-fpm.d/www.conf

pm 으로 시작하는 파라미터5개와 연관되어 있습니다.

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 40
pm.max_requests = 500


- pm.max_children 는 설정된 PHP Pool(여기서는 www) 내에서 가동할 수 있는 최대 자식 프로세스 수를 의미 합니다

- pm.start_servers 는 php-fpm 을 실행할 때 초기에 생성하는 자식 프로세스의 개수입니다

- pm.min_spare_servers 는 idle 상태의 자식 프로세스 개수가 이 개수보다 작으면 자식 프로세스를 생성합니다

- pm.max_spare_servers 는 idle 상태의 자식 프로세스의 최대 개수를 의미 합니다.

- pm.max_requests 는 각 프로세스가 최대 request를 처리하면 수 입니다. 500 으로 설정되어 있다면 500번 request 후 프로세스를 다시 생성 합니다 프로세스가 점진적인 메모리 증가에 대한부분을 방지 할 수 있습니다. apache 에서 유사한 설정으로는 MaxRequestsPerChild 있습니다.


[참고] PHP-FPM 메모리 사용현황 및 세션 계산

아래 명령어를 이용하면 현재 fork된 php-fpm 프로세스 당 메모리 사용량을 확인 할 수 있습니다.

[root]# ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

시스템에 가용한 메모리나 사용 할 정도에서 프로세스당 사용메모리를 나누어서 최대 자식프로세스 개수를 산정 해도 되겠습니다

ex) PHP에 6GB 를 사용 하려고 함 , PHP-FPM이 현재 사용중인 메모리량이 대략 60MB 임
6000MB / 60MB = 자식 프로세스 개수 100개 로 설정

이와 같이 각 시스템 마다 메모리 상황을 고려하여 적절한 pm.max_children 값을 선정하여 설정하면 되겠습니다.


• 설정4 : 로그 관련 설정

-- 주석제거, 경로 변경
access.log = /var/log/php-fpm/$pool.access.log

-- 주석제거
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

-- 주석제거
slowlog = /var/log/php-fpm/$pool.log.slow

-- 주석제거, 내용변경
-- 값은 변경 하여 사용해도 됩니다.
request_slowlog_timeout = 1

-- 주석 해제
catch_workers_output = yes

-- 주석제거, 경로 변경
php_admin_value[error_log] = /var/log/fpm-php/$pool.error.log

-- 주석제거,
php_admin_flag[log_errors] = on



4-5 서비스 등록 및 기동

컴파일한 PHP Source 에서 파일을 복사 하고 수정 후 서비스를 등록 합니다.

-- php-fpm.service 파일을 복사
[root]# cd /root/pkg/php-8.0.7/sapi/fpm
[root]# cp php-fpm.service /etc/systemd/system/php-fpm.service

-- 파일수정
vi /etc/systemd/system/php-fpm.service

-- PHP 경로를 변경하였을 경우 아래와 같이 경로를 수정 합니다.
PIDFile=/usr/local/php-8.0.7/var/run/php-fpm.pid
ExecStart=/usr/local/php-8.0.7/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-8.0.7/etc/php-fpm.conf

to

PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf


-- ProtectSystem 내역 주석 처리
#ProtectSystem=full



서비스를 등록 하고 기동 합니다.

[root]# systemctl daemon-reload

[root]# systemctl enable php-fpm

[root]# systemctl restart php-fpm

  
  

5. 접속 테스트

5-1 nginx 설정 변경

테스트를 위한 default.conf 파일을 수정을 진행 하도록 하겠습니다.

######  default.conf 파일 수정 ######
vi /etc/nginx/conf.d/default.conf

###### 아래 내용 수정 및 추가 #####
## 상단에 upstream 구문 추가
## backend 로 연결되는 ip 정보와 접속 실패 관련된 옵션
## 그리고 backend 와의 keep alive 이 설정되어 있습니다.

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

upstream backend {
ip_hash;
server unix:/run/php-fpm/php-fpm.sock max_fails=10 fail_timeout=1s;
keepalive 100;
}

### root 구문 위치 변경
 root   /usr/share/nginx/html;
 location / {
  ### location / 에서는 주석처리  
  #root   /usr/share/nginx/html;
  #index  index.html index.htm;
}

-- php location 구문 추가
location ~ \.php$ {
fastcgi_pass backend; # upstream 
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
proxy_redirect off;
fastcgi_intercept_errors on;
fastcgi_read_timeout 260;
fastcgi_send_timeout 260;
proxy_send_timeout 260;
proxy_read_timeout 260;
proxy_connect_timeout 260;
}



5-2 phpinfo 파일 생성

php 접속 여부 확인을 위한 phpinfo.php 파일을 생성 합니다.

-- 디렉토리 이동
[root]# cd /usr/share/nginx/html

-- 파일에 아래 내용을 입력 합니다.
[root]# vi phpinfo.php

<?php
phpinfo();
?>



5-3 Nginx 재시작

Nginx 를 재시작 합니다.

[root]# systemctl restart nginx



5-4 접속 확인

5-4-1 일반 접속




5-4-2 phpinfo 확인




5-4-3 ModSecurity 동작 확인




5-4-4 PHP 8.0 과 8.1 JIT 관련

마지막으로 PHP 8.0 에서 에 추가된 새로운 기능은 JIT 관련 내용 입니다.

이 부분은 사전에 확인 한것과 마찬가지로 실제로 적용 하였을 때 PHP 8.0 Arm 아키텍처 환경에서는 포스팅 시점 작성 시점 에서도 아직 미지원인 것으로 확인 되었습니다.

관련 Ref link
github.com/Dockerfile_of_PHP8-JIT [L]
aws.amazon.com/php-for-arm64 [L]
reddit.com/php_80_arm_missing_jit [L]




2021년 1월 25일 릴리즈된 PHP 8.1 버전에서는 ARM 환경에서도 JIT 기능이 지원 되기 시작하였습니다.


그래서 ARM 환경에서 컴파일&빌드 하여 사용해보니 아래와 같이 JIT 컴파일러가 활성화 되는 것을 확인 할 수 있었습니다.




여기 까지 Arm아키텍처 컴퓨터 인스턴스로 이전하기 위해서 Nginx+PHP+MySQL 과 OS 설정과 보안(OS,WAF) 관련 설정을 살펴보았습니다. 이관이 완료 되면 업데이트 하겠습니다.



관련된 다른글 

 

 

 

 

 

 

 

 

 

 

      

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x