CentOS 7, PHP7 설치 방법 (nginx 기준)


2~3년에 한번 가량으로 CentOS를 새로 설치하는데…
매번 새로 설치해할때마다 어떻게 설정/세팅했는지 기억이 안나 고생하네요.

그래서 이번만큼은 새로 설치하면서 흔적을 남겨봅니다.

centos 7.0 설치 후 PHP7 설치/설정 방법입니다.

※ 참고로 필자도 리눅스 잘 모릅니다. 구글링의 해택을 누릴뿐…


PHP 7 설치를 위한 사전 작업
yum을 이용한 PHP7 설치를 위해 yum에 대해 사전 작업을 합니다.

epel-release 인스톨 및 yum 저장소를 업데이트 해줍니다.
# yum install -y epel-release
# rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# yum –enablerepo=remi update remi-release

yum 인스톨/업데이트가 끝나면 php7를 설치할 준비가 끝납니다.


PHP7 설치 시작!
# yum –enablerepo=remi-php70 install
해당 명령어를 이용해 바로 php7를 설치 할 수 있으나, 모듈과 함께 설치를 위해서는 아래와 같이 명령이 필요합니다.

# yum –enablerepo=remi-php70 install -y php php-fpm php-mysql php-gd php-common php-cli php-json php-opcache php-devel php-imagick php-mbstring php-mcrypt php-mysqlnd php-pear php-xml php-xmlrpc php-soap php-dba php-bcmath php-pdo php-ldap

※ 해당 방법은 Apache 대신 nginx 을 사용 시 방법이고, 모듈은 최대한 많이 설치했습니다.
( Apache 사용시에는 php-fpm 모듈은 제거하고 설치할 것! )


PHP7 버전 확인
PHP 설치가 끝났다고 ‘Complete!’이 뜨면 php 버전을 확인합니다.

#php -v

아래와 비슷한 문구가 뜬다면 문제가 없이 설치된 거입니다.

PHP 7.0.11 (cli) (built: Sep 14 2016 08:28:52) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.11, Copyright (c) 1999-2016, by Zend Technologies

※ 해당 내용으로 보면 php는 7.0.11 버전이 설치된 겁니다.


nginx – php 연동을 위한 php.ini 설정
# vi /etc/php.ini

여러군대를 수정해야되니, 찾기 기능으로 잘 찾아 바꿔야합니다.
(esc키 입력 후 ‘/검색어’를 입력 후 엔터, 다음 위치로는 ‘n’키!)

;cgi.fix_pathinfo = 0 → cgi.fix_pathinfo = 0

allow_url_fopen = On → Off

expose_php = On → Off

display_errors = Off

※ 저장은 :wq 혹은 :w 후 :q 할 것~


nginx – php 연동을 위한 php-fpm 설정
vi /etc/phpfpm.d/www.conf

※ 가끔씩 한번에 vi가 오픈 안될때가 있음, 그런 경우에는  수동으로 해당 파일 경로까지 이동 후 vi들어가서 수정하면 됩니다.
 
# cd /etc/phpfpm.d
# vi www.conf
 

여러군대를 수정해야되니, 찾기 기능으로 잘 찾아 바꿔야합니다.
(esc키 입력 후 ‘/검색어’를 입력 후 엔터, 다음 위치로는 ‘n’키!)

user = apache → nginx 
group = apache → nginx

;listen.owner = nobody → listen.owner = nobody (주석제거)
;listen.group = nobody → listen.group = nobody (주석제거)

보류 : listen = 127.0.0.1:9000 → /var/run/php-fpm/php-fpm.sock

※ 저장은 :wq 혹은 :w 후 :q 할 것~

nginx – php 연동을 위한 default. conf 설정

# vi /etc/nginx/conf.d/default.conf
 
※ 가끔씩 한번에 vi가 오픈 안될때가 있음, 그런 경우에는  수동으로 해당 파일 경로까지 이동 후 vi들어가서 수정하면 됩니다.
 
# cd /etc/nginx/conf.d
# vi default.conf 
 
 

server {
listen 80;
server_name localhost (사용 IP or 도메인, 없어도 동작은함);

#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
root /usr/share/nginx/html;
index index.php index.html index.htm;

location / {
    # root /usr/share/nginx/html;
    # index index.html index.htm;
   try_files $uri $uri/ =404;
}

#error_page 404 /404.html;
error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}

# 특정 디렉토리에 PHP 파싱을 차단하기 위한 부분
# 예제 :  upload, upload/image) 
location ~ /(upload|upload/image)/.*\.(php\d?|p?html?|pl|cgi) {

    return 403;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
  # root html;

  # with php7-fpm 설정
  try_files $uri =404;
  fastcgi_split_path_info ^(.+\.php)(/.+)$;

  fastcgi_pass 127.0.0.1:9000; //php-fpm의 listen 과 같은 주소여야함.
  fastcgi_index index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include fastcgi_params;
  # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

  # fastcgi 버퍼 사이즈 조절~
  # 502 에러를 없애기 위한 proxy 버퍼 관련 설정입니다.        proxy_buffer_size               128k;
  proxy_buffers                   4 256k;
   proxy_busy_buffers_size         256k; 

   # 502 에러를 없애기 위한 fastcgi 버퍼 관련 설정입니다.
    fastcgi_buffering               on;
    fastcgi_buffer_size             16k;
    fastcgi_buffers                 16 16k;
 
    # 최대 timeout 설정입니다.
    fastcgi_connect_timeout         600s;
    fastcgi_send_timeout            600s;
    fastcgi_read_timeout            600s;
 
   # 아래 설정은 PHP 성능 향상을 위한 옵션입니다. 추가해 주시면 좋답니다.
    sendfile                        on;
     tcp_nopush                      off;
     keepalive_requests              0;
}

# deny access to .htaccess files, if Apache’s document root
# concurs with nginx’s one
#
#location ~ /\.ht { //이건 켜도 되고 꺼도 되고 하는듯???
# deny all;
#}
}

 위에 내용처럼 수정이 끝내고 나면 저장합니다.

 
※ 저장은  :wq 혹은 :w 이후 :q
※  보안 부분은 >와이즈번님 블로그<를 참고했습니다. (참고 부분 : gif파일로 위장한 php파일을 업로드하여 동작시키는 거 방지!)
※ nginx 설정 부분은 >곰곰이오님 블로그<를 참고했습니다.

자동 실행 등록 및 reload~

# systemctl start phpfpm
# systemctl enable phpfpm

# systemctl reload nginx


이제 제대로 되는지 <?php phpinfo(); ?> 시험해 봅니다.
다 되면 끝!


php 설정을 위한  php.ini 설정
# vi /etc/php.ini

여러군대를 수정 할때는 역시 찾기 기능 활용!
(esc키 입력 후 ‘/검색어’를 입력 후 엔터, 다음 위치로는 ‘n’키!)

register_globals = Off
글로벌 별수에 대한 사용 여부, 보안상 무조건 끌것!

display_errors = Off
php 오류 시 화면상 오류 표시 여부, 보안상 무조건 끌 것
필요하면 코드 상단에 에러 표기 기능을 넣을것
<?php error_reporting(E_ALL); ini_set(“display_errors”, 1); ?>

memory_limit = 8M // 스크립트 최대 메모리 설정

post_max_size = 8M POST 최대 사이즈
upload_max_filesize = 2M 업로드 파일 최대 크기

max_execution_time = 30 // 최대 실행 가능 시간
max_input_time = 30 // 입력 가능 시간

date.timezone = 빈칸
이걸 date.timezone=Asia/Seoul 로 바꿔주면 타임존 처리됨!

재실행은~
# systemctl reload nginx php-fpm