아마존 웹 서비스(AWS)에서 nginx와 mysql, 그리고 php를 구동하기 위한 php-fpm 설치 방법을 소개합니다.
yum update
$ sudo yum -y update
Nginx + PHP FPM 설치
$ sudo yum install -y nginx php-fpm
PHP 확장 모듈 설치
$ sudo yum install -y php-devel php-mysql php-pdo php-pear php-mbstring php-cli php-odbc php-imap php-gd php-xml php-soap
PHP APC 설치
$ sudo yum install -y php-pecl-apc $ sudo yum install -y pcre-devel
문제 : 위 PHP APC를 설치하면 php-fpm 프로세스의 iowait (입출력 대기 부하)가 50~99% 발생하는 문제가 있습니다. 이 과정에서 PHP APC 설치는 권장하지 않습니다. 자료를 찾아보는 중에는 memcached도 비슷한 문제가 있다고 합니다.
Mcrypt 설치 (Codeigniter framework 사용 시 필요)
$ sudo yum install php-mcrypt
MySQL 설치
$ sudo yum -y install mysql-server mysql
Nginx 기본 설정 파일 작성
$ sudo vim /etc/nginx/conf.d/default.conf
default.conf 기본 내용
server { location / { root /var/www/html; index index.php index.html index.htm; } location ~ \.php$ { fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name; include fastcgi_params; } }
php-fpm 설정
$ sudo vim /etc/php-fpm.d/www.conf
www.conf 설정 (각 항목을 찾아 아래 내용과 같이 수정)
listen = /var/run/php-fpm/php-fpm.sock listen.owner = nginx listen.group = nginx listen.mode = 0664 user = nginx group = nginx
EC2 인스턴스 재 시작 시 nginx + mysql + php fpm 자동 실행 되도록 설정
$ sudo chkconfig nginx on $ sudo chkconfig mysqld on $ sudo chkconfig php-fpm on
Nginx + MySQL + php-fpm 서비스 시작
(MySQL은 최초 시작시 root 계정 설정과 패스워드 설정에 대한 멘트가 나오니 참고하셔서 설정해줍니다.)
$ sudo service php-fpm start $ sudo service nginx start $ sudo service mysqld start
웹페이지 확인
Welcome to nginx on the Amazon Linux AMI! 화면 출력되면 nginx 설치는 정상
세팅 과정은 여기까지 입니다. 아래부터는 세팅하는 과정에서 발생한 문제나 이슈에 대해서 정리한 내용이니 참고하세요.
– 추가 정보 –
1. nginx reload (Nginx는 서비스를 재시작하지 않고 reload로 무중단 재시작이 가능, 단 모듈이나 설정이 변경된 경우에는 restart 필요)
$ sudo /usr/sbin/nginx -s reload 또는 $ sudo service nginx reload
2. Nginx의 Error / Access log 기본 경로
error log : /var/log/nginx/error.log
access log : /var/log/nginx/access.log
3. 서버 타임존 설정
$ sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
현재 타임존은 $ date 명령으로 확인 가능
4. FastCGI sent in stderr: “Primary script unknown” while reading response header from upstream,.. 에러 발생 문제
이 에러는 여러 원인이 있겠지만 저의 경우
/etc/nginx/conf.d/default.conf (호스트 설정 파일)의 location / 블럭에서 index.php가 빠져있어서 에러가 발생.
5. CodeIgnighter 사용 시 mod rewrite 설정 (호스트 설정 파일 location / 블럭 안에 추가)
if (!-e $request_filename) { rewrite ^(.*)$ /index.php last; }
6. EC2 인스턴스에서는 CORS(Cross-Origin Resource Sharing) 설정 불가. 이를 해결하려면 S3를 사용하거나 외부 CDN 서비스를 사용해야함.