[우분투 18.04 데스크톱] LEMP : 엔진엑스(Nginx) 설치 과정 정리에 이어...
PHP 설치를 진행했습니다(다음 글에서는 MariaDB를 설치 과정을 정리할 거예요. MySQL 새 버전이 마음에 안 들어서.).
https://www.manualfactory.net/10903
https://blog.lael.be/post/2600
https://blog.lael.be/post/8319
위 문서들을 참고했고, 이번에도 라엘 님의 글이 중심이 되었습니다. 라엘님의 글은 실제 서버를 운영하는 데에 큰 도움이 되니까 나중에라도 반드시 한번쯤은 읽어보세요. 제 글로 개념을 잡으면서 따라한 다음 라엘님의 글을 보면서 깊이 있게!
1. 운영체제 구성요소(패키지)를 최신 상태로 업그레이드
터미널 창을 열어서
sudo apt-get update
sudo apt-get upgrade
등의 명령어를 입력하여 패키지를 최신 것으로 유지합니다.
(경우에 따라서는 sudo apt-get dist-upgrade 도 동원.)
2. PHP 7.2 설치
▲ sudo apt-get install php-fpm
이라고 입력하여 apt 저장소의 php-fpm과 PHP를 설치합니다. PHP-FPM(PHP FastCGI Process Manager)은 Nginx로부터 PHP파일을 전달받아 실행시키고 그 결과물을 Nginx에게 반환하는 독립 실행 프로그램인데, 엔진엑스가 PHP 실행 능력이 없어서 설치하는 거고요,
PHP는 현재 우분투 18.04 기준으로 PHP 7.2 버전이 설치되는군요.
▼ 참고로 (청개구리 정신으로) php-fpm 설치 안하고 php 설치를 시도하면 아파치를 함께 깔겠다고 훅~ 들어옵니다. 이 때 Y 누르면 Nginx 지워지고 Apache 깔려서 고생하니까, 시도하지 마세요.
3. PHP 추가 모듈 설치
▼ 아래 스샷처럼 명령어를 넣어서 “라엘”님의 추천 모듈들을 설치합니다.
( sudo apt-get install php-mbstring php-gd php-curl php-xml php-bcmath composer php-mysql )
※ 참고
php-mbstring : 다국어 처리 모듈
php-gd : 이미지 처리 모듈
php-curl php-xml : 뭔지 잘 모르겠음. php-curl은 워드프레스 플러그인들이 쓰는 듯합니다. 없으면 문제 생기는 경우가 있음. php-curl은 php로 curl 명령을 내릴 수 있게 하는 모듈인 것 같습니다. cURL은 커맨드라인으로 URL 기반 데이터를 송수신하는 툴이고요.
php-bcmath : 수학 연산을 확장해주는 모듈. 라엘님 가이드에서 설치 권장.
composer : PHP 패키지 의존성 관리 프로그램. 라엘님 가이드에서 설치 권장.
php-mysql : PHP-MySQL 연동 모듈. MariaDB에서도 작동함. 반드시 필요.
( php-mcrypt 모듈은 보안상의 이유로 PHP 7.2에서 삭제되었다고 합니다. )
이외에 추가로 설치하고 싶은 모듈이 있다면 터미널 창에서
apt-cache search php- | less
이라고 입력해서 패키지 목록을 검색 후 설치하면 됩니다.
(목록이 한 화면 단위로 끊어져서 보일텐데 상/하 화살표, PgUP/PgDN, Home/End 키 등을 적절히 활용하여 넘겨 보다가 Q를 누르면 빠져나올 수 있습니다.)
4. (옵션) php.ini 설정값 변경
php.ini 파일에는 PHP 설정값이 저장되어 있습니다.
▼ sudo find / -name php.ini 명령어로 php.ini의 경로를 파악해보면 cli 디렉토리와 fpm 디렉토리 두 곳이 나오는데,
php -v 명령어로 php 버전을 확인했을 때 cli 라고 나오더라도 당황하지 말고 fpm 경로의 php.ini 파일을 수정 시도하세요(nano 또는 gedit 같은 에디터 이용).
참고로 PHP CLI 는 command-line interface for PHP의 약자로 단독프로그램을 만드는 데 쓰이고, PHP CGI는 the common gateway interface for PHP의 약자로 웹 어플리케이션에서 쓰입니다. 우리는 워드프레스/그누보드 같은 웹 기반 프로그램을 돌리는 게 목적이니까 fpm 경로의 php.ini 파일만 고쳐도 크게 무리는 없을 겁니다(굳이 cli 경로의 php.ini도 고치고 싶다면 그렇게 하세요.).
▲ php 설치 후 웹브라우저로 PHP 정보를 보면 fpm 경로에서 설정을 끌어오는 것을 확인할 수 있습니다.
/etc/php/7.2/fpm/php.ini에서 원하는 값을 적당히 추가/변경하면 됩니다.
date.timezone = Asia/Seoul
memory_limit = 128M (기본값 : 128M. php가 사용할 최대 메모리 용량. 사이트 운영 중 “Fatal Error: Allowed Memory Size of XXXXX Bytes Exhausted” 오류가 나타나면 이 값을 적절히 늘려야 한다.)
post_max_size = 20M (기본값 : 8M. 최대 2GB. php로 생성되는 게시물 하나의 최대 용량. 게시물의 첨부파일 용량까지 포함하므로 upload_max_filesize 보다 큰 값을 지정해야 한다. 일반적으로 upload_max_filesize 보다 20% 크게 지정함.)
upload_max_filesize = 10M (기본값 : 2M. 최대 2GB. 업로드 파일의 최대 용량. 워드프레스 내부의 버튼을 클릭해서 업로드하는 테마, 플러그인, 미디어 파일 등의 모든 파일이 이 설정값의 제한을 받는다.)
max_file_uploads = 20 (기본값 : 20. 한 번에 업로드할 수 있는 파일 수.)
max_execution_time = 60 (기본값 : 30. input 받은 php가 실행되는 최대 시간. 이 값을 넘겨서 작동되는 php는 강제 종료된다. post_max_size와 upload_max_filesize의 값을 늘렸다면 이 값도 늘려야 함.)
max_input_time = 120 (기본값 : 60. PHP 엔진이 데이터를 입력받는 최대 시간. max_execution_time과 max_input_time를 늘릴 때는 네트워크 속도를 고려해야 함.)
▲ 저는 이정도만 바꿔줬는데,
(사실 기본값으로도 워드프레스 돌아갑니다. 2MB 이상 파일만 업로드 안 하면. => upload_max_filesize = 2M)
https://varins.com/home-server-09-php-mariadb-wordpress
http://php.net/manual/en/mbstring.configuration.php#ini.mbstring.internal-encoding
https://www.thewordcracker.com/intermediate/how-to-increase-maximum-file-upload-size/
위의 문서들을 참조했고, deprecated 된 부분들은 제외시켰습니다.
워드프레스 돌리는 데에는 문제가 없을 거고, phpmyadmin으로 DB파일 올려서 복구할 때는 업로드 용량 조절을 하셔야 할 듯합니다.
설정 끝냈으면 저장하고 나온 다음 터미널 창에서
▲ sudo systemctl restart php7.2-fpm.service
라고 입력하여 바꾼 php.ini 설정을 반영해 주세요.
(참고로 php7.2-fpm.service 이름은 systemctl status *php* 라고 쳐서 알아냈습니다. 만약 실행 중인 모든 서비스 목록을 확인하고 싶다면 systemctl list-units --type=service 라고 쳐보면 됩니다.)
5. server { } 블록 설정 변경 : php 파일 연결(연동)
Nginx 서버블록 설정파일을 열고, php 파일을 Nginx에 연결하는 과정이 필요합니다. 서버블록에 도메인이 할당되지 않았다면 /etc/nginx/sites-enabled/default 파일을 에디터로 열고, 도메인을 할당하고 설정파일을 분리했다면 /etc/nginx/sites-enabled/ 에 있는 해당 설정파일을 에디터로 엽니다.
▲ server { } 블럭에서 index 구문을 찾고, index.php 문구를 추가합니다. 스샷처럼 index.html 앞에 index.php를 넣으면 http://localhost 또는 http://도메인 으로 접근했을 때 index.html보다 index.php 파일이 먼저 불러집니다. 워드프레스/XE/그누보드 같은 PHP 기반 CMS를 이용할 때 유용하겠죠?
▲ /etc/nginx/sites-enabled/default 파일을 열어보면 php 연동 설정이 주석처리되어 있습니다(비활성화). 이 부분을 본인의 서버 블록에 복붙하고 적당히 주석을 풀면서 경로를 바로잡습니다.
▲ 이런 식으로 구성하게 되더군요.
이 location 블록에 대한 설명은 https://opentutorials.org/module/384/4332 에 잘 되어있으니 참고하시고, 서버블록 안쪽에 client_max_body_size 는 접속자가 패킷 용량을 정해서 요청할 때, 이 값 이상의 요청이면 거절할 수 있는 옵션입니다. Nginx 공식 문서에 따르면 기본값이 1M라고 하는데 php.ini 설정 시 post_max_size 값을 늘린 적이 있다면 post_max_size보다 같거나 크게 설정하는 것이 좋다고 합니다. php.ini와 nginx에서 중복 체크하는 것이 무의미하다고 생각한다면 client_max_body_size 값을 0으로 정해서 체크하지 않도록 하는 것도 방법이 될 수 있을 것입니다.
(이 location 블록은 라엘님의 가이드를 참조해서 교체해도 될 것 같습니다.)
▲ 라엘님의 우분투 18.04 LEMP 설치 가이드에서 Nginx Wiki 가이드를 반영하여 /etc/nginx/fastcgi_params 파일을 수정하라고 권하셨는데, grep 명령어로 찾아보니 대부분 fastcgi.conf에 있어서 따르지 않았습니다. 관심 있으신 분은 라엘님 글을 따라하세요.
설정 파일을 저장하고 빠져나옵니다.
▲ sudo systemctl restart nginx.service 라고 입력하여 Nginx 서비스를 재시작합니다.
6. 작동 테스트
▲ 웹루트 경로(/var/www/html/블라블라~)에 phpinfo.php 파일을 만들고, 위 스크린 샷처럼 코드를 작성 후 저장+빠져나옵니다.
웹브라우저 주소창에 http://localhost/phpinfo.php 라고 입력해 봅니다(또는 http://도메인주소/phpinfo.php).
▲ 이런 화면이 나오면 테스트 성공입니다. fastcgi 라는 글귀가 보이고, fpm이라는 글귀도 보이죠? 그러면 잘 설정된 겁니다.
※ PPA 주소 추가에 대한 생각
저는 PPA 주소 추가를 통한 최신 버전의 PHP 설치를 권장하지 않습니다. PHP는 버전업 시 Deprecated 되는 코드들이 있으면 그 부분에 발빠르게 대응하지 못했던 사이트/CMS들이 먹통이 되는 경우가 있기 때문입니다.
그리고 PPA 주소가 우분투 버전별로 갈라지는 경우가 있는데, 이 경우 우분투 버전업 시(예 : 16.04 → 18.04) APT저장소의 패키지와 PPA에서 받은 패키지가 꼬여서 애를 먹었던 경험이 있습니다. PPA 주소를 일일이 수정하고, 기존 PPA 패키지를 새로운 PPA 패키지로 교체하고, 패키지 설정파일까지 손보면 시간이 많이 걸리더군요.
추가되는 PPA가 늘어날수록 이 과정은 번거로워지고, 결국 우분투 업그레이드에 부담을 느끼는 요소로 작용합니다. 그래서 (저같은) 초보자가 포맷 없이 2년마다 우분투 버전업 해가면서 쓰기에는 PPA를 추가하지 않는 게 좋다고 생각합니다. 포맷 후 재설치하는 식으로 운영한다면 PPA 추가가 나쁘지 않은 선택지인 것 같은데, 저는 포맷이 부담스럽네요.
긴 글 읽어주셔서 감사합니다.
----------------------------------------------------
[윈도우10 64bit] APM PHP 7.0 설치과정 정리
[우분투 18.04 데스크톱] LAMP : PHP 7.2 설치과정 정리
▲ 수퍼마리오 아카펠라(1인 8채널)
'도움이 되는 Tip > 리눅스&워드프레스' 카테고리의 다른 글
[우분투 18.04 데스크톱] LEMP : MariaDB 설치과정 정리(MySQL 대신) (0) | 2019.02.12 |
---|---|
[우분투 18.04 데스크톱] LEMP : 엔진엑스(Nginx)로 파일을 공유해보자(WebDAV 추가) (0) | 2019.02.06 |
[우분투 18.04 데스크톱] LEMP : Let's Encrypt SSL 인증서 수동 발급과 엔진엑스(Nginx)에 적용하기 (0) | 2019.02.01 |