2016. 4. 6. 14:48

Centos6에 Nginx+PHP7-FPM+MySQL Yum으로 설치

요 근래 Nginx + PHP-FPM 글을 몇개 번역한걸 올렸더니 갑자기 궁금해져서 설치를 해보고 메모해둠


1. MySQL 설치

별로 신경을 안쓰고 있었는데 MySQL쪽에도 Yum Repo를 제공하고 있었다...


http://dev.mysql.com/downloads/repo/yum/


이 링크에서 버전에 맞게 설치하면 된다. Centos6은 Red Hat Enterprise Linux 6을 다운 받으면 됨.


2.PHP7 설치

아래 링크를 참고해서 설치

https://webtatic.com/packages/php70/


또는

http://wyseburn.tistory.com/entry/Remi-Repo-%EC%84%A4%EC%B9%98PHP7


다만 이걸로 설치를 하면 경로가 좀 요상해진다.

환경관련파일은 /etc/opt/remi/php70/ 에 있고 로그는 /var/opt/remi/php70/ 에 있으니 주의.

그리고 실행파일을 /usr/bin/php70 이런식인데 실제로는 /opt/remi/php70/root/usr/bin 에 php, php-config, phpize 등이 있으니 주의, 소프트링크를 하면 좀 나을꺼다.


그리고 php70.x86_64 와 php70-php.x86_64 같이 똑같을꺼 같은 패키지가 있는데 버전을 보면 다르니

php70-php 로 시작하는 것들(현재 버전 7.0.5)로 깔면 된다. 물론 FPM으로 돌릴꺼니 php70-php-fpm.x86_64은 꼭 받아야겠지. 아래는 설치패키지.


php70-php-bcmath.x86_64

php70-php-cli.x86_64

php70-php-common.x86_64

php70-php-devel.x86_64

php70-php-fpm.x86_64

php70-php-gd.x86_64

php70-php-json.x86_64

php70-php-mbstring.x86_64

php70-php-mcrypt.x86_64

php70-php-mysqlnd.x86_64

php70-php-opcache.x86_64

php70-php-pdo.x86_64

php70-php-suhosin.x86_64

php70-runtime.x86_64


/etc/opt/remi/php70/php-fpm.d/www.conf 파일을 열어 수정하자.

user = apache                       #사용자는 일반계정을 만들어 사용할 것. apache는 이미 있어서 사용

group = apache

listen = /var/run/php7-fpm.sock   #처음에는 127.0.0.1:9000 인데 서버가 하나면 unix socket로 바꾸는게 났다.

listen.owner = apache              #권한도 맞춰줘야함, 계정은 nginx의 user와 같아야 한다.

listen.group = apache

listen.mode = 0660


service php70-php-fpm start        #fpm 데몬이름도 거시기 하다.



php를 fpm으로 실행할 경우 php.ini 파일에 cgi.fix_pathinfo = 1 인 경우 http://localhost/bad.hack/aa.php 와 같이 bad.hack 을 실행 가능하게 하므로 cgi.fix_pathinfo = 0 으로 하자.


3. Nginx 최신버전 설치


[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/6/$basearch/ 

gpgcheck=0

enabled=1


이 내용을 /etc/yum.repos.d/nginx.repo 파일로 만들어주면 최신버전을 yum으로 관리할 수 있게된다.

baseurl에 /6/ 은 리눅스 버전을 의미하니 다른 버전이라면 바꿔도 된다.

어떤게 있는지 궁금하면 브라우저로 http://nginx.org/packages 로 들어가보면 리눅스 배포판별로 확인할 수 있으니 들어가보는것도 나쁘지 않다.

주의 : epel Repo에도 Nginx 가 있는데 버전이 낮으니 사용하지 말것.


/etc/nginx/nginx.conf 수정

수정할꺼는 많겠지만 간단하게 몇가지만 수정하거나 추가한다.


user apache;           #php-fpm 에 user와 동일해야 한다.

worker_processes 1;  #cpu core 갯수

http {

    access_log off;     #로그는 끄자

    server_tokens off;  #서버정보를 표시하는거도 끄자

    fastcgi_hide_header X-Powered-By; #불필요한 정보표시 끄기
    fastcgi_hide_header X-Pingback;
    fastcgi_hide_header Link;
    proxy_hide_header X-Powered-By;
    proxy_hide_header X-Pingback;
    proxy_hide_header X-Link;

    add_header X-Frame-Options SAMEORIGIN; #아이프래임 사용 SAMEORIGIN 같은도메인 가능, DENY 불가, ALLOW 모두가능
    add_header X-Content-Type-Options nosniff; #잘못된 MIME에는 응답거부
    add_header X-XSS-Protection "1; mode=block"; #XSS 세션 하이재킹 방지

    include /etc/nginx/sites-enabled/*.conf   #vhost 를 sites-enabled 디렉토리에서 관리

}


vhost설정은 대충 conf.d/default.conf 를 새로만든 sites-enabled 디렉토리에 다른이름으로 복사해서 관리한다.

수정할 부분은 밑에 몇개정도.

server_name  domain.com *.domain.com;

root   /home/sms/public_html; #root는 location /와 location ~\.php 블럭안에 각각정의되 있는데 밖으로 뺀다.

location ~ \.php$ {

    fastcgi_pass   unix:/var/run/php7-fpm.sock;   #/etc/opt/remi/php70/php-fpm.d/www.conf listen 부분과 일치해야된다.

    fastcgi_index  index.php;

    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    include        fastcgi_params;

}


특정 디렉토리에 PHP 파싱을 차단하려면(예 data, upload, files/my) 아래 내용을 반드시!! location ~ \.php$ {} 블럭 앞에 정의해야 한다.

location ~ /(data|upload|files/my)/.*\.(php\d?|p?html?|pl|cgi) {
    return 403;
}


/etc/nginx/fastcgi_params 파일 맨위에 추가


set $fastcgi_script_realname $fastcgi_script_name;

if ( $fastcgi_script_name ~ ^(.*\.php)(/.*)$ ) {

    set $fastcgi_script_realname $1;

    set $path_info $2;

}

if (!-f $document_root$fastcgi_script_realname) {

    return 404;

}


이부분은 http://도메인/aaa.gif/aaa.php 와 같이 호출될때 aaa.gif에 php코드가 있으면 실행되는데 그걸 방지


service nginx start


이걸로 끝. 보안설정이나 튜닝관련은 다른 문서를 찾아봐야할듯.


4. 아래와 같은 오류가 발생할 경우(/var/lib/nginx/tmp/fastcgi 퍼미션오류)


2016/04/08 08:26:48 [crit] 1967#0: *1 open() "/var/lib/nginx/tmp/fastcgi/1/00/0000000001" failed (13: 

Permission denied) while reading upstream, client: 1.2.3.4, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "domain.com"


아마존 ec2 에서는 최신버전을 yum으로 설치가능하길래 그냥 설치를 했다.

설치하다 nginx.conf 에 user가 nginx로 되있는 걸 무심결에 apache로 고쳤는데 이게 원인이 되었다. 

문제는 /var/lib/nginx 소유자가 nginx.nginx 여서 발생하는 문제.... apache 로 수정하면 오류가 발생하지 않는다.

안된다면 /var/lib/nginx/tmp/fastcgi 의 권한을 777 로도 해볼것.


또 /etc/php-fpm.d/www.conf 에 보면 세션 저장 디렉토리가 별도로 설정되있다.

기본경로 : /var/lib/php/session

사용자를 변경할 경우 반드시 위 디렉토리의 소유 그룹도 변경해야 세션에 문제가 없다.

추가로 /var/lib/php/wsdlcache 의 소유 그룹도 변경하자.

/var/lib/php는 remi repo를 사용할 경우 /var/opt/remi/php70/lib/php 이니 주의.



.... an upstream response is buffered to a temporary file ....

오류가 발생한다면

fastcgi_max_temp_file_size 0; 을 추가


POST 메소드로 정적페이지(아무 값도 없이) 호출하는 경우 405 오류가 발생한다.

당연히 POST 는 값을 전송할떄 쓰는건데 잘못된 사용이니 오류나는게 맞지만 대부분 대충 쓰기때문에..

아래 내용을 추가하면 405 오류를 200(OK)로 바꿔준다.

error_page  405     =200 $uri;


5. /home/계정 디렉토리 퍼미션은 701로 해야한다. 자꾸 까먹네.

..