검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Installing Nginx With PHP5 (And PHP-FPM) And MySQL Support (LEMP) On Ubuntu 13.04

1. 선결조건
  호스트명은 server1.example.com, IP 주소는 192.168.0.100인 것으로 가정합니다. 거의 모든 명령어는 root 권한을 필요로 하므로 명령어를 사용할 때마다 sudo를 사용하거나 sudo su 명령어를 통해 root로 로그인해야 합니다.

2. MySQL5 설치
apt-get install mysql-server mysql-client
  설치 중 MySQL root 계정의 패스워드를 설정하게 됩니다.

3. Nginx 설치
apt-get install nginx
/etc/init.d/nginx start
  웹 브라우저로 접속 가능 여부를 확인합니다. 우분투 13.04에서 Nginx의 디폴트 document root는 /usr/share/nginx/html 입니다.

4. PHP5 설치
  PHP-FPM(FastCGI Process Manager. PHP FastCGI 구현물로 특히 방문자가 많은 사이트에 유용한 기능을 가지고 있음)로 Nginx에서 PHP5를 사용할 수 있습니다.
apt-get install php5-fpm
  PHP-FPM은 /var/run/php5-fpm.sock 소켓에서 FastCGI 서버를 실행하는 데몬 프로세스입니다. init 스크립트의 위치는 /etc/init.d/php5-fpm 입니다.

5. Nginx 설정
  Nginx의 설정 파일은 /etc/nginx/nginx.conf 입니다. 설정 파일은 이해하기 쉬운 구조로 되어 있습니다.(이곳이곳에서 배울 수 있습니다.)

  (선택사항으로)먼저 워커 프로세스의 개수를 조정하고 keepalive_timeout 값을 적절히 설정합니다.
[...]
worker_processes  4;
[...]
    keepalive_timeout   2;
[...]
  가상 호스트는 server {} 컨테이너에서 정의합니다. 디폴트 vhost는 /etc/nginx/sites-available/default 파일에 정의되어 있습니다. 파일의 내용을 아래처럼 바꾸겠습니다.
[...]
server {
        listen 80;
        listen [::]:80 default_server ipv6only=on;

        root /usr/share/nginx/html;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.html;
                # Uncomment to enable naxsi on this location
                # include /etc/nginx/naxsi.rules
        }

        location /doc/ {
                alias /usr/share/doc/;
                autoindex on;
                allow 127.0.0.1;
                allow ::1;
                deny all;
        }

        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
        #location /RequestDenied {
        #       proxy_pass http://127.0.0.1:8080;
        #}

        #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;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}
[...]
  IPv4와 IPv6의 80번 포트를 모두 열기 위해 두 listen 줄의 주석을 모두 제거합니다.

  server_name _; 는 모든 vhost의 server_name을 포괄한다는 의미입니다.(물론 www.example.com처럼 호스트명을 지정할 수도 있습니다.)

  index 줄에는 index.php를 추가했습니다. root /usr/share/nginx/html;은 document root 디렉토리를 지정하는 항목입니다.

  PHP에 있어서 중요한 부분은 location ~ \.php$ {} 로서 이 부분의 주석을 제거해야 합니다.

  Nginx를 리로드합니다.
/etc/init.d/nginx reload
  /etc/php5/fpm/php.ini 파일을 열어 cgi.fix_pathinfo=0; 으로 설정합니다.
[...]
; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...]
  PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Document root 디렉토리인 /usr/share/nginx/html 안에 연동확인용 PHP 파일을 만듭니다.
# vi /usr/share/nginx/html/info.php
<?php
phpinfo();
?>
  웹 브라우저에서 위 파일을 열어 PHP가 작동하는지와 Server API 항목이 FPM/FastCGI인지를 확인합니다. MySQL과 연동하지 않았으므로 MySQL과 관련된 항목은 아직 나오지 않습니다.

6. MySQL과 PHP5 연동
  MySQL과 PHP5를 연동하기 위해 php5-mysql 패키지를 설치합니다. 또한 자주 사용하는 PHP5 모듈도 함께 설치합니다. 설치할 수 있는 PHP5 모듈은 아래 명령어로 검색할 수 있습니다.
apt-cache search php5
  아래처럼 php5-mysql과 함께 원하는 모듈들을 설치합니다.
apt-get install php5-mysql php5-curl php5-gd php5-intl php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl
  APC는 eAccelerator나 Xcache처럼 PHP의 중간 코드를 캐싱하고 최적화하는 opcode 캐셔로서 PHP 페이지의 속도를 높이는데 큰 도움이 됩니다.
apt-get install php-apc
  이제 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload

7. PHP-FPM이 TCP 연결을 사용하도록 설정
  PHP-FPM은 기본적으로 /var/run/php5-fpm.sock 소켓을 열고 있지만 TCP 연결을 사용하도록 만드는 것도 가능합니다. /etc/php5/fpm/pool.d/www.conf 파일을 열어서 listen 줄을 아래처럼 수정합니다.
[...]
;listen = /var/run/php5-fpm.sock
listen = 127.0.0.1:9000
[...]
  이것으로 PHP-FPM은 127.0.0.1(localhost)의 9000번 포트를 열게 됩니다. 해당 포트가 미사용 포트인지 확인 후 PHP-FPM을 리로드합니다.
/etc/init.d/php5-fpm reload
  Nginx의 설정 파일인 /etc/nginx/sites-available/default를 열어서 fastcgi_pass unix:/var/run/php5-fpm.sock; 줄을 fastcgi_pass 127.0.0.1:9000;로 바꿉니다.
[...]
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                #fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
[...]
  마지막으로 Nginx를 리로드합니다.
/etc/init.d/nginx reload

8. CGI/Perl 스크립트
  Nginx로 CGI/Perl 스크립트를 사용해야 한다면 이 글을 참고하시기 바랍니다. fcgiwrap 사용을 추천합니다.(챕터4)

2013/07/17 11:37 2013/07/17 11:37