서버 운영/APM 서버 구축

우분투 20.04 APM 서버 기본 환경 파일 설정 - php.ini 기본 설정

씨실과 날실 2020. 9. 28. 09:00

 

[관련 게시물]

Ubuntu 20.04 LTS에서 APM 설치

2020/09/14 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - 아파치(Apache2 설치

2020/09/16 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - 마리아DB(MariaDB) 10.3 설치

2020/09/18 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - 마리아DB(MariaDB) 10.5 설치

2020/09/20 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - PHP 7.4 설치

2020/09/22 - [서버 운영/APM 서버 구축] - 우분투(Ubuntu) 20.04에서 APM 설치 - APM 설치 후 방화벽 설정

2020/09/24 - [서버 운영/APM 서버 구축] - MariaDB 10.4 이후의 계정 인증 관련 변화(unix_socket, mysql_native_password 인증 / 계정, 암호 및 전역 권한 정보 저장 테이블 변경 등)

2020/09/26 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 기본 환경 파일 설정 - apache2.conf 기본 설정

2020/09/28 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 기본 환경 파일 설정 - php.ini 기본 설정

 

Ubuntu 20.04에서 설치한 Apache2 서버 주요 설정 파일 원문

2020/09/30 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 목록

2020/10/05 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 원문 - Apache2

2020/10/07 - [서버 운영/APM 서버 구축] - 우분투 20.04 APM 서버 주요 환경 파일 원문 - PHP 7.4 - php.ini

 

Ubuntu 20.04에서 설치한 Apache2 서버 주요 설정 파일 내 지시어 설명

2020/10/09 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] apache2.conf의 기본값에 사용된 지시어 설명

2020/10/11 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] ports.conf 의 기본값에 사용된 지시어 설명

2020/10/13 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] envvars의 기본값에 사용된 지시어 설명

2020/10/15 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] security.conf의 기본값에 사용된 지시어 설명

2020/10/17 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] 000-default.conf의 기본값에 사용된 지시어 설명

2020/10/19 - [서버 운영/APM 서버 구축] - [Ubuntu 20.04 - Apache2 서버] default-ssl.conf의 기본값에 사용된 지시어 설명


Ubuntu 20.04에서 phpMyAdmin 설치 및 설정

2021.02.20 - [서버 운영/APM 서버 구축] - 우분투 20.04에서 phpMyAdmin 설치 01 - 저장소 설치

2021.03.15 - [서버 운영/APM 서버 구축] - 우분투 20.04에서 phpMyAdmin 설치 02 - Apache 서버 관리자를 위한수동 설치(버전 5.1.0 기준)

2021.03.17 - [서버 운영/APM 서버 구축] - 우분투 20.04에서 phpMyAdmin 설치 03 - 보안강화 작업

2021.03.19 - [서버 운영/APM 서버 구축] - phpMyAdmin 설치 04 - 웹호스팅 사용자를 위한 수동 설치(버전 5.1.0 기준)

2021.03.21 - [서버 운영/APM 서버 구축] - phpMyAdmin 설치 05 - setup 페이지를 통한 구성 파일 생성

Ubuntu 18.04 LTS에서 APM 설치

2018/11/09 - [서버 운영/APM 서버 구축] - Apache 서버 설치

2018/11/14 - [서버 운영/APM 서버 구축] - MariaDB 설치

2018/11/16 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 1

2018/11/16 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 2 - ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded

2018/11/16 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 3

2018/11/19 - [서버 운영/APM 서버 구축] - PHP7 설치

2018/11/21 - [서버 운영/APM 서버 구축] - 서버 환경 파일 수정 - php.ini, apache2.conf

 

Ubuntu 18.04 LTS에서 MariaDB 백업 및 업그레이드

2019/01/15 - [서버 운영/APM 서버 구축] - MariaDB & MySQL 백업과 복원 - Nextcloud 14

2019/06/27 - [서버 운영/APM 서버 구축] - MariaDB 업그레이드 (Upgrading from MariaDB 10.3 to MariaDB 10.4)

 

Ubuntu 18.04 LTS에서 PHP 버전 전환

2019/07/05 - [서버 운영/APM 서버 구축] - Apache와 Shell에서 PHP 버전 전환하기(How to Switch between Multiple PHP Version)

 

Ubuntu 18.04 LTS에서 phpmyadmin 설치 및 운용

2018/11/23 - [서버 운영/APM 서버 구축] - phpmyadmin 설치 - APT 패키지 관리자를 통한 설치

2019/06/18 - [서버 운영/APM 서버 구축] - APT 패키지 관리자를 통해 설치한 phpMyAdmin 업그레이드 방법(업그레이드 버전 4.9.0.1)

2019/07/01 - [서버 운영/APM 서버 구축] - phpMyAdmin 수동 설치 01 - 일반 설치

2019/07/03 - [서버 운영/APM 서버 구축] - phpMyAdmin 수동 설치 02 - 심볼릭 링크를 이용한 보안 접속

2019/06/16 - [서버 운영/APM 서버 구축] - phpMyAdmin 4.6.6deb5와 PHP 7.2 간 호환성 문제 해결 - Warning in ./libraries/sql.lib.php#613

 

XAMPP 설치 및 운용

2019/04/20 - [서버 운영/서버 구축 꾸러미] - XAMPP에 대하여(버전 7.1.28 / 7.2.17 / 7.3.4)

2019/04/22 - [서버 운영/서버 구축 꾸러미] - XAMPP for Windows 7.3.4 인스톨러 설치

2019/04/25 - [서버 운영/서버 구축 꾸러미] - XAMPP for Windows 설정

2019/06/03 - [서버 운영/서버 구축 꾸러미] - XAMPP 포터블(portable) 사용법

2019/06/05 - [서버 운영/서버 구축 꾸러미] - XAMPP for Linux 4.3.5 설치 및 사용법

 

서버 운영을 위한 관련 연재글

2018/11/07 - [리눅스/Ubuntu] - 방화벽 설정 - ufw

2018/11/12 - [서버 운영/버추얼박스(VirtualBox)] - 가상머신(Virtualbox) 내 서버 외부접속

2019/01/05 - [미디어위키/미디어위키 설치 및 관리] - 호스트 컴퓨터에서 가상머신 내 미디어위키 접속 및 작업을 위한 버추얼박스 포트포워딩 설정

2019/03/15 - [서버 운영/APM 서버 구축] - PHP 7.3으로의 업그레이드 및 사용 연기 권장 안내 - PHP Notice: compact(): Undefined variable:

 

[관련 웹문서]

https://mariadb.com/kb/en/authentication-plugin-unix-socket/#unix_socket

 

 

 

APM(Apache2, PHP 7, MariaDB) 서버를 구축하고자 할 때 단순히 설치한다고 끝이 아닙니다. APM 서버가 정상적으로 작동하기 위해서는 적절한 설정 작업이 필요합니다.

 

2020/09/26 - [서버 운영/APM 서버 구축] - 우분투 APM 서버 기본 환경 파일 설정 - apache2.conf 기본 설정

지난 번에는 위 링크의 글을 보듯 우분투 20.04에 설치된 Apache2의 환경설정 파일 apache2.conf를 설정하는 가장 기본적인 방법에 대해 적었습니다.

이번에는 우분투 20.04에 설치된 PHP 7.4의 환경 설정 파일 php.ini을 설정하는 가장 기본적인 방법에 대해 적도록 하겠습니다.

이하의 내용은 아래 링크의 글을 Ubuntu 20.04에 구축한 APM 서버에 맞춰 수정, 증보한 개정판입니다.

2018/11/21 - [서버 운영/APM 서버 구축] - 서버 환경 파일 수정 - php.ini, apache2.conf

본 글은 위 링크의 글과 달리 환경 설정 파일의 모든 수정 작업을 gedit와 같은 GUI 에디터가 아닌 터미널에서 수행하는 과정을 온전히 담았습니다.

이는 리눅스 초심자들이 터미널을 이용한  CLI(명령어 입력 인터페이스)에 익숙해지도록 도와드리기 위해서입니다. 여기서 배운 명령들은 다른 텍스트 파일 편집 작업에서도 손쉽게 응용하여 작업 효율성을 증대할 수 있을 것입니다.

아직 터미널 작업에 두려움이 있으신 분들은 이전 글을 참고하셔서 본 글대로 수정하셔도 됩니다.

 


 

php.ini

/etc/php/7.4/apache2/php.ini

/etc/php/7.4/cli/php.ini

위 상자를 보듯 php 7.4의 환경설정 파일인 php.ini 파일이 두 개가 있습니다. 환경 파일이 두개로 나뉘어 있는 이유는 PHP를 실행하는 위치에 따라 각기 다른 설정값을 적용하기 위함입니다.

 

 

study@study-VirtualBox:~$ php -i | grep php.ini
Configuration File (php.ini) Path => /etc/php/7.4/cli
Loaded Configuration File => /etc/php/7.4/cli/php.ini
study@study-VirtualBox:~$ 
예를 들어 시스템에 설치된 php를 터미널에서 실행한다면 위에서 보듯 로드되는 환경설정 파일은 /etc/php/7.4/cli/php.ini 입니다.

 

그러나 브라우저를 통해 php.ini 파일을 읽어들이는 경우 적용되는 환경설정 파일이 아래와 같습니다.

Server API                                   - Apache 2.0 Handler

Configuration File (php.ini) Path       -  /etc/php/7.4/apache2

Loaded Configuration File               - /etc/php/7.4/apache2/php.ini

Scan this dir for additional .ini files    - /etc/php/7.4/apache2/conf.d

 

두 php.ini 파일 간 내용 비교

study@study-VirtualBox:~$ diff -q /etc/php/7.4/apache2/php.ini /etc/php/7.4/cli/php.ini
Files /etc/php/7.4/apache2/php.ini and /etc/php/7.4/cli/php.ini differ
study@study-VirtualBox:~$

두 파일간 파일 비교는 diff 명령을 통해 확인할 수 있습니다.

diff -q /etc/php/7.4/apache2/php.ini /etc/php/7.4/cli/php.ini

-q 옵션

-q옵션은 비교/대조 대상인 두 파일의 내용이 같은지 다른지 여부만 알려줍니다. 여기서는 내용에 차이가 있어 differ가 출력되었습니다.

 

differ 명령어 기본 구문과 출력형힉

$ differ [옵션] [대조 대상 파일 1] [대조 대상 파일 2]

 

대조 대상 파일 1의 행 번호c대조 대상 파일 2의 행 번호
< 대조 대상 파일 1의 내용
---
> 대조 대상 파일 2의 내용

 

study@study-VirtualBox:~$ diff /etc/php/7.4/apache2/php.ini /etc/php/7.4/cli/php.ini
312c312
< disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
---
> disable_functions =
379c379
< expose_php = Off
---
> expose_php = On
409c409
< memory_limit = 128M
---
> memory_limit = -1
study@study-VirtualBox:~$ 

아무런 옵션도 붙이지 않고 기본 명령어만 실행하면 위와 같은 형식으로 차이점을 출력해줍니다.

 

study@study-VirtualBox:~$ diff -y --suppress-common-lines  /etc/php/7.4/apache2/php.ini /etc/php/7.4/cli/php.ini
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcnt |	disable_functions =
expose_php = Off					      |	expose_php = On
memory_limit = 128M					      |	memory_limit = -1
study@study-VirtualBox:~$

위처럼 가독성 높게 좌우 대조 형식을 사용하려면 -y와 --suppress-common-lines 옵션을 같이 사용하시면 됩니다.

-y 옵션

두 열료 출력

--suppress-common-lines 옵션

공통 내용은 미출력

 

study@study-VirtualBox:~$ diff -c /etc/php/7.4/apache2/php.ini /etc/php/7.4/cli/php.ini
*** /etc/php/7.4/apache2/php.ini	2020-05-26 21:24:22.000000000 +0900
--- /etc/php/7.4/cli/php.ini	2020-05-26 21:24:22.000000000 +0900
***************
*** 309,315 ****
  ; This directive allows you to disable certain functions for security reasons.
  ; It receives a comma-delimited list of function names.
  ; http://php.net/disable-functions
! disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
  
  ; This directive allows you to disable certain classes for security reasons.
  ; It receives a comma-delimited list of class names.
--- 309,315 ----
  ; This directive allows you to disable certain functions for security reasons.
  ; It receives a comma-delimited list of function names.
  ; http://php.net/disable-functions
! disable_functions =
  
  ; This directive allows you to disable certain classes for security reasons.
  ; It receives a comma-delimited list of class names.
***************
*** 376,382 ****
  ; threat in any way, but it makes it possible to determine whether you use PHP
  ; on your server or not.
  ; http://php.net/expose-php
! expose_php = Off
  
  ;;;;;;;;;;;;;;;;;;;
  ; Resource Limits ;
--- 376,382 ----
  ; threat in any way, but it makes it possible to determine whether you use PHP
  ; on your server or not.
  ; http://php.net/expose-php
! expose_php = On
  
  ;;;;;;;;;;;;;;;;;;;
  ; Resource Limits ;
***************
*** 406,412 ****
  
  ; Maximum amount of memory a script may consume (128MB)
  ; http://php.net/memory-limit
! memory_limit = 128M
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ; Error handling and logging ;
--- 406,412 ----
  
  ; Maximum amount of memory a script may consume (128MB)
  ; http://php.net/memory-limit
! memory_limit = -1
  
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ; Error handling and logging ;
study@study-VirtualBox:~$ 

 

-c 옵션 - ex : -c N

양 파일간 내용이 다른 행 앞에 !(느낌표) 표시가 붙고 위와 아래로 각각 설정한 숫자만큼 행이 표시됩니다.

위 아래로 표시할 행의 수를 따로 설정하지 않는 경우 위처럼 기본값인 3이 적용됩니다.

 


 

원본 php.ini 파일 백업

study@study-VirtualBox:~$ cd /etc/php/7.4/apache2
study@study-VirtualBox:/etc/php/7.4/apache2$ ls -F
conf.d/  php.ini
study@study-VirtualBox:/etc/php/7.4/apache2$ sudo cp php.ini php_original.ini
[sudo] study의 암호: 
study@study-VirtualBox:/etc/php/7.4/apache2$ ls -F
conf.d/  php.ini  php_original.ini
study@study-VirtualBox:/etc/php/7.4/apache2$ 

추후 php.ini 파일 수정 작업 이후 생길 문제를 대비하기 위해 cp 명령을 이용해 원본 php.ini 파일을 복사해 이름이 다른 백업본을 생성해둡니다.

 

 

study@study-VirtualBox:/etc/php/7.4/apache2$ diff php.ini php_original.ini
study@study-VirtualBox:/etc/php/7.4/apache2$

diff 기본 명령을 실행해 위와 같이 아무런 응답 없이 단지 리눅스 프롬프트만 나온다면 두 파일은 내용에 차용이 없는 것입니다.

 

 

타임존(Timezone) 설정 및 활성화

php.ini 파일 내 타임존 기본값 확인

cat -n 파일명 | grep 문자열

위 명령을 이용해찾고자 하는 문자열을 찾아봅시다.

 

study@study-VirtualBox:/etc/php/7.4/apache2$ cat -n php.ini | grep date.timezone
   961	; http://php.net/date.timezone
   962	;date.timezone =
study@study-VirtualBox:/etc/php/7.4/apache2$
타임존은 date.timezone 변수로 설정합니다. 현재는 설정값이 공란으로 아예 비어져 있을 뿐만 아니라 ;(세미콜론) 이 행 앞에 붙어 있어 주석처리되어 있습니다.

 

 

아마 웹브라우저에서 phpinfo.php 파일을 불러오면 Default timezone 값이 Asia/Pyongyang으로 설정되어 있을 것입니다.(이 값은 php 설치 환경에 따라 얼마든지 달라질 수 있습니다.)

sed로 php.ini의 Timezone 설정

study@study-VirtualBox:~$ cd /etc/php/7.4/apache2
study@study-VirtualBox:/etc/php/7.4/apache2$ sudo sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/' php.ini
study@study-VirtualBox:/etc/php/7.4/apache2$ 

위 명령으로 주석처리된 date.timezone = 값을 활성화하고 기본값 대신 Asia/Seoul로 설정합니다.

 

sudo sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/' php.ini

sudo

관리자 권한으로 실행합니다.

sed

스트림 편집기 sed를 실행합니다.

-i

버퍼 영역에서 편집한 내용을 원본 파일에 저장합니다.

's/;date.timezone =/date.timezone = Asia\/Seoul/'

's/기존 문자열/치환될 문자열/'

괄호 안의 문자열 중 문자 s는 치환을 의미합니다.

문자열 안의 /은 특별한 처리를 해주지 않으면 특별한 기능을 가지는 특수 문자로 인식되어 그대로 사용하면 오류를 발생시킵니다. 특수문자가 아닌 일반 문자로서 /로 입력하기 위해서는 이스케이프 문자 \를 앞에 넣어주어야 합니다.

php.ini

버퍼 영역에 읽어들일 파일입니다.

 

study@study-VirtualBox:/etc/php/7.4/apache2$ sudo sed -i 's/;date.timezone =/date.timezone = Asia/Seoul/' php.ini
[sudo] study의 암호: 
sed: -e expression #1, char 41: `s' 에 관한 알수 없는 옵션
study@study-VirtualBox:/etc/php/7.4/apache2$

만약 문자열 안에 있는 / 앞에 \을 붙이지 않으면 위와 같은 오류를 출력합니다.

 

study@study-VirtualBox:/etc/php/7.4/apache2$ cat -n php.ini | grep date.timezone
   961	; http://php.net/date.timezone
   962	date.timezone = Asia/Seoul
study@study-VirtualBox:/etc/php/7.4/apache2$ 

위 명령을 실행하면 위 처럼 변경된 내용을 확인할 수 있습니다.

 

파일 업로드 관련 설정

php.ini 에서 파일 업로드와 관련하여 다음과 같은 주요 변숫값들이 존재합니다.

php.ini 내 Resource Limits

; Maximum execution time of each script, in seconds
; http://php.net/max-execution-time
; Note: This directive is hardcoded to 0 for the CLI SAPI
max_execution_time = 30

파서(구문 분석)에 의해 종료되기 전까지 PHP 스크립트가 실행 가능한 최대 시간을 설정하는 옵션입니다.

잘못된 구문로 작성된(예를 들어 무한 루프) 스크립트가 원활한 서버 구동을 막는 것을 막기 위해 이 옵션을 설정합니다. 최대 실행 시간을 넘기게 되면 자동으로 중지되도록 제한을 걸어놓는 것입니다.

기본값은 30초입니다.

웹서버를 구축하여 사용하는 경우 PHP 실행을 제한하는 외부의 또다른 제한 시간 구성이 있을 수 있습니다. 예를 들어 Apache에는 Timeout 지시문이 있고 IIS에는 CGI 시간 제한 기능이 있습니다. 둘 다 기본값은 300 초입니다.

 

; Maximum amount of time each script may spend parsing request data. It's a good
; idea to limit this time on productions servers in order to eliminate unexpectedly
; long running scripts.
; Note: This directive is hardcoded to -1 for the CLI SAPI
; Default Value: -1 (Unlimited)
; Development Value: 60 (60 seconds)
; Production Value: 60 (60 seconds)
; http://php.net/max-input-time
max_input_time = 60

PHP 스크립트가 POST 또는 GET과 같은 입력 데이터를 구문분석(파싱)할 수 있는 최대 시간 (초)을 설정하는 옵션입니다.

기본값은 60입니다.

 

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M

PHP 스크립트가 사용할 수 있는 최대 메모리 용량을 설정하는 옵션입니다.

기본값은 128M입니다.

 

php.ini 내 Data Handling

; Maximum size of POST data that PHP will accept.
; Its value may be 0 to disable the limit. It is ignored if POST data reading
; is disabled through enable_post_data_reading.
; http://php.net/post-max-size
post_max_size = 8M

POST 방식으로 데이터를 전송(서버에 업로드)할 때 가능한 최대 용량을 설정하는 옵션입니다.

기본값은 8M입니다.

 

php.ini 내 File Uploads

; Whether to allow HTTP file uploads.
; http://php.net/file-uploads
file_uploads = On

PHP 스크립트를 통한 파일 업로드 여부를 설정하는 옵션입니다.

이미 On으로 활성화되어 있습니다.

 

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M

PHP 스크립트를 통한 단일 파일 최대 업로드 용량 설정 옵션입니다.

기본값은 2M입니다.

 

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

PHP 스크립트를 통한 최대 파일 업로드 개수를 설정하는 옵션입니다.

기본값은 20입니다.

 

study@study-VirtualBox:/etc/php/7.4/apache2$ cat -n php.ini | egrep '(file_uploads|upload_max_filesize|post_max_size|max_execution_time|max_input_time|memory_limit)'
   116	; max_input_time
   388	max_execution_time = 30
   398	max_input_time = 60
   409	memory_limit = 128M
   694	post_max_size = 8M
   837	file_uploads = On
   846	upload_max_filesize = 2M
   849	max_file_uploads = 20
study@study-VirtualBox:/etc/php/7.4/apache2$ 

위 명령을 실행하면 다수의 문자열이 포함된 행을 모두 검색할 수 있습니다. 위에 게시된 변숫값이 기본값입니다.

이전까지 우리는 특정 문자열을 포함하는 결과만을 검색할 때  grep 명령을 사용했습니다. 그러나 여기서는 egrep을 사용했습니다.

grep, egrep, fgrep 간의 차이

grep

grep은 패턴 검색 시 기본 정규표현식만을 지원하고,

egrep(= grep -E)

egrep은 기본 정규표현식을 포함하여 확장 정규표현식을 지원하며,

fgrep (= grep -F)

fgrep은 정규표현식을 지원하지 않고 메타문자도 패턴 검색에 포함되는 일반 문자로 취급합니다.

 

필수 설정

study@study-VirtualBox:/etc/php/7.4/apache2$ sudo sed -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 2048M/; s/post_max_size = 8M/post_max_size = 2048M/' php.ini
[sudo] study의 암호: 
study@study-VirtualBox:/etc/php/7.4/apache2$

위 명령을 이용해 다수의 문자열 패턴을 동시에 편집합니다. 여기서는 upload_max_filesize와 post_max_size 설정값을 한줄 명령으로 편집하는 방법입니다.

sudo sed -i -e 's/upload_max_filesize = 2M/upload_max_filesize = 2048M/; s/post_max_size = 8M/post_max_size = 2048M/' php.ini

-e 옵션

다수의 sed 명령을 한꺼번에 처리할 때 사용하는 옵션입니다.

'   '(홑따옴표)

sed는 치환, 삽입, 첨부, 삭제 등 하나 이상의 편집 명령을 이 따옴표 안에 넣어주어야 합니다.

;(세미콜론)

각각 sed 명령을 구분해주는 문자입니다. 각 명령을 구분할 때 명령의 끝과 ;(세미콜론) 사이에 공백이 있어서는 안되며 세미콜론과 다음 명령 사이에 공백이 있어야 합니다.

 

옵션 설정

study@study-VirtualBox:/etc/php/7.4/apache2$ sudo sed -i -e'
> s/max_execution_time = 30/max_execution_time = 0/
> s/max_input_time = 60/max_input_time = -1/
> s/memory_limit = 128M/memory_limit = 2048M/
> ' php.ini
study@study-VirtualBox:/etc/php/7.4/apache2$ 

이번에는 max_execution_time, max_input_time, memory_limit 설정값을 바꾸었습니다.

앞서서는 한줄에 여러 명령을 입력하는 방법을 알아보았다면 이번에는 가독성을 높여 각 명령을 분리하여 입력하는 방법을 사용했습니다.

홑따옴표 하나(여는 홑따옴표)를 입력하고 엔터키를 누르면 아래에 각 명령을 입력받을 수 있는 프롬프트가 나타납니다. 이때 한 줄씩 각 명령을 한줄씩 입력하고 명령 입력 완료 후 다음 줄에 다시 한번 홑따옴표(닫는 홑따옴표)와 파일명 인수를 적어주고 엔터를 눌러주면 다수의 편집 명령이 동시에 수행됩니다.

 

study@study-VirtualBox:/etc/php/7.4/apache2$ cat -n php.ini | egrep '(file_uploads|upload_max_filesize|post_max_size|max_execution_time|max_input_time|memory_limit)'
   116	; max_input_time
   388	max_execution_time = 0
   398	max_input_time = -1
   409	memory_limit = 2048M
   694	post_max_size = 2048M
   837	file_uploads = On
   846	upload_max_filesize = 2048M
   849	max_file_uploads = 20
study@study-VirtualBox:/etc/php/7.4/apache2$ 
올바르게 변경되었는지 값을 다시 한번 확인해봅시다.

참고로 file_uploads와 max_file_uploads은 수정에서 제외했는데 이유는 file_uploads 변숫값은 이미 기본값이 On으로 설정되어 있어 수정할 필요가 없었고, max_file_uploads는 변숫값이 20 정도면 일반 서버에서 충분하기 때문입니다. 만약 제한을 걸 필요가 있거나 반대로 늘릴 필요가 있다면 앞에서 알려드린 sed의 문자열 치환 명령을 이용해 수정하거나 아니면 Vi(m), nano, gedit 등의 텍스트 편집기를 이용해 편집하시면 됩니다.

주의

예시 수정값은 사용하지 말것

위에서 수정한 값들은 각 변수의 최댓값 또는 무제한 값을 적용한 것입니다. 따라서 실제 서비스 중이거나 예정인 서버에는 절대 이 값을 사용하지 마시기 바랍니다.

 

2048M

2048M은 일반적인 서버가 지원하는 최대 파일 용량인 2GB을 의미합니다. 즉, 최댓값이라 보면 됩니다.

 

설정값 크기 순

설정 시 설정값  크기를 memory_limit > post_max_size > upload_max_filesize 순으로 설정해주어야 정상적으로 작동합니다.

 

필수 설정과 옵션 설정

업로드 용량을 수십MB 수준으로 작게 설정할 거라면 필수 설정만 수정해주면 됩니다. 그러나 예를들어 웹하드(클라우드 스토리지) 서비스 등을 구축하는 등 대용량 업로드가 가능하게 해주려면 옵션 설정도 크게 설정해주어야 합니다.

저는 서버를 실제 서비스용이 아니라 튜토리얼용/내부 로컬호스트 전용으로 세팅하여 이 연재를 이어가고 있으므로 서버가 지원하는 최대 용량을 설정하였습니다. 만약 실제로 서버를 서비스하려면 서버와 회선의 성능 및 접속에 따른 트래픽 부하 등을 종합적으로 고려하여  이 업로드 가능 용량 그리고 그와 관련된 몇몇 설정값들도 적절히 제한해주어야 합니다.

그리고 대용량 업로드가 가능하려고 하려면 PHP 뿐만 아니라 Apache2 수준에서도 설정을 해주어야 합니다.

 

2020/09/26 - [서버 운영/APM 서버 구축] - 우분투 APM 서버 기본 환경 파일 설정 - apache2.conf 기본 설정

위 링크의 글을 참고하여 apache2.conf 파일을 수정해줍니다.

 

short_open_tag 설정

study@study-VirtualBox:/etc/php/7.4/apache2$ cat -n php.ini | grep short_open_tag
   146	; short_open_tag
   187	short_open_tag = Off
study@study-VirtualBox:/etc/php/7.4/apache2$ 

정규 php 구문은 <?php ~ ?>로 이루어집니다. 그런데 short_open_tag 설정값이 On으로 활성화하면 시작부분을 <? 로 단축시켜, php 구문을 <?php ~ ?>으로 작성할 수 있습니다.

과거 공ㅇ수님이 개발, 유지보수했던 제로보드로 웹사이트를 구축한 경험이 있었던 분들은 <? ~ ?> 코드를 보셨을 겁니다. 사실 위 설정값이 아니라면 <?php ~ ?>가 되어야 했던 것이지요.

 

study@study-VirtualBox:/etc/php/7.4/apache2$ sudo sed -i 's/short_open_tag = Off/short_open_tag = On/' php.ini
study@study-VirtualBox:/etc/php/7.4/apache2$ 
위 명령을 실행하여 Off를 On으로 수정해줍니다.
 
study@study-VirtualBox:/etc/php/7.4/apache2$ cat -n php.ini | grep short_open_tag
   146	; short_open_tag
   187	short_open_tag = On
study@study-VirtualBox:/etc/php/7.4/apache2$

cat 명령으로 올바르게 바뀌었는지 확인해봅니다.

 


위에서 알아본 내용은 Apache2에서 돌아가는 PHP의 전역 설정 파일인 /etc/php/7.4/apache2/php.ini 파일의 수정 방법입니다.

CLI에서 돌아가는 PHP의 전역 설정 파일인 /etc/php/7.4/cli/php.ini의 파일도 동일한 방법을 사용하시면 됩니다.

여기서는 예를 들어 CLI 차원에서 구동되는 PHP의 타임존 설정값을 변경해보도록 하겠습니다.

 

셸에서 PHP의 타임존 설정값을 변경

셸에서 타임존 기본값 확인

 

study@study-VirtualBox:~$ php -r "echo date('Y-m-d H:i:s').PHP_EOL;"
2020-09-27 11:19:57
study@study-VirtualBox:~$

확인해보면 타임존 기본값이 평양으로 설정되어 있고 date.timezone 변숫값은 비어 있습니다.

 

셸에서 PHP 타임존 기본값 확인

 

study@study-VirtualBox:~$ cd /etc/php/7.4/cli
study@study-VirtualBox:/etc/php/7.4/cli$ php -i | grep timezone
Default timezone => Asia/Pyongyang
date.timezone => no value => no value
study@study-VirtualBox:/etc/php/7.4/cli$

 

셸에서 PHP 타임존 설정값 변경

 

study@study-VirtualBox:/etc/php/7.4/cli$ sudo sed -i 's/;date.timezone =/date.timezone = Asia\/Seoul/' php.ini
[sudo] study의 암호: 
study@study-VirtualBox:/etc/php/7.4/cli$

 

 

셸에서 PHP 타임존 설정값 변경 내용 확인

 

study@study-VirtualBox:/etc/php/7.4/cli$ cat -n php.ini | grep date.timezone
   961	; http://php.net/date.timezone
   962	date.timezone = Asia/Seoul
study@study-VirtualBox:/etc/php/7.4/cli$

 

셸에서 PHP 타임존 기본값 재확인

 

study@study-VirtualBox:/etc/php/7.4/cli$ php -r "echo date('Y-m-d H:i:s').PHP_EOL;"
2020-09-27 11:24:21
study@study-VirtualBox:/etc/php/7.4/cli$

 

셸에서 PHP 타임존 다른 나라 도시로 설정

 

study@study-VirtualBox:/etc/php/7.4/cli$ sudo sed -i 's/date.timezone = Asia\/Seoul/date.timezone = Europe\/London/' php.ini
study@study-VirtualBox:/etc/php/7.4/cli$

 

셸에서 PHP 타임존 기본값 재확인

 

study@study-VirtualBox:/etc/php/7.4/cli$ php -i | grep timezone
Default timezone => Europe/London
date.timezone => Europe/London => Europe/London
study@study-VirtualBox:/etc/php/7.4/cli$

 

셸에서 타임존 기본값 재확인

 

 

study@study-VirtualBox:/etc/php/7.4/cli$ php -r "echo date('Y-m-d H:i:s').PHP_EOL;"
2020-09-27 03:28:01
study@study-VirtualBox:/etc/php/7.4/cli$ 

 

PHP 소스코드 문서로 서버 일시 확인

서버 시간대 확인용 php 소스코드 문서 작성

study@study-VirtualBox:~$ which php
/usr/bin/php
study@study-VirtualBox:~$

 

study@study-VirtualBox:~$ cat > php-date.php
#!/usr/bin/php
<?php echo "현재 일시 : ". date("Y-m-d H:i:s")."\n"; ?>
study@study-VirtualBox:~$ 

 

셸에서 php 코드 문서로 서버 일시 확인

study@study-VirtualBox:~$ ./date.php
bash: ./date.php: 허가 거부
study@study-VirtualBox:~$

 

 

study@study-VirtualBox:~$ ls -l | grep date.php
-rw-rw-r-- 1 study study   75  9월 27 11:50 date.php
study@study-VirtualBox:~$

 

 

study@study-VirtualBox:~$ chmod u+x date.php
study@study-VirtualBox:~$ ls -l | grep date.php
-rwxrw-r-- 1 study study   75  9월 27 11:50 date.php
study@study-VirtualBox:~$ 

 

 

study@study-VirtualBox:~$ ./date.php
현재 일시 : 2020-09-27 03:53:23
study@study-VirtualBox:~$