Установка и настройка: Nginx + php5

Материал из support.qbpro.ru

В данной заметке, будет показано как поставить связку Nginx + php5-fpm (php5.3) на Debian Lenny и настроить безопасную конфигурацию. Установка и настройка Важно: все команды от root'а.

Добавляем репозитарии и генерируем ключи:

   echo "deb http://backports.debian.org/debian-backports lenny-backports main" >> /etc/apt/sources.list
   echo "deb http://php53.dotdeb.org stable all" >>   /etc/apt/sources.list
   gpg --keyserver keys.gnupg.net --recv-key 89DF5277 && gpg -a --export 89DF5277 | apt-key add -

Обновляем:

   aptitude update

Устанавливаем nginx и php5-fpm:

   aptitude install -t lenny-backports "nginx"
   apt-get install php5-cli php5-common php5-suhosin 
   apt-get install php5-fpm php5-cgi

Приводим конфиг /etc/nginx/nginx.conf к виду:

   user www-data;
   worker_processes  1; # Ставим число по количеству ядер

   timer_resolution 100ms;
   worker_rlimit_nofile 8192;
   worker_priority -5; #Увеличитвваем приоритет

   error_log  /var/log/nginx/error.log;
   pid        /var/run/nginx.pid;
   events {
       worker_connections  1024;
   }
   http {
       include       /etc/nginx/mime.types;
       access_log	/var/log/nginx/access.log;

       sendfile        on;
       keepalive_timeout  65;
       tcp_nodelay        on;

       gzip	on;
       gzip_min_length	1100;
       #gzip_disable	"msie6";  #Быстрее, но работает только на новых версиях nginx
       gzip_disable "MSIE [1-6]\.(?!.*SV1)";
       gzip_proxied	any;
       gzip_comp_level	4;
       gzip_types 		text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;
       gzip_vary		on;

       include /etc/nginx/conf.d/*.conf;
       include /etc/nginx/sites-enabled/*;
   }


Удаляем /etc/nginx/sites-available/default Пример конфига Конфиг для использования с CMS WordPress, с учетом использования chroot/etc/nginx/sites-enabled/example.ru:

   server {
   	listen  80;
   	server_name  www.example.ru;
   	rewrite ^ http://example.ru$request_uri? permanent; #301 redirect
   }
   server {
       listen  80;
   	server_name  example.ru; 
   	root   /var/www/example.ru;
   	index  index.php;

   	location / {
   		try_files $uri $uri/ /index.php?q=$uri&$args;
   	}
   	location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico)$ {
   		access_log        off;
   		expires           max;
   	}
   	location ~ .php$ {
   		# fastcgi_split_path_info ^(.+\.php)(.*)$;
   		fastcgi_pass   127.0.0.1:9000;
   		fastcgi_index  index.php;

   		fastcgi_param  DOCUMENT_ROOT    /example.ru;
   		fastcgi_param  SCRIPT_FILENAME  /example.ru$fastcgi_script_name;
   		fastcgi_param  PATH_TRANSLATED  /example.ru$fastcgi_script_name;

   		include fastcgi_params;
   		fastcgi_param  QUERY_STRING     $query_string;
   		fastcgi_param  REQUEST_METHOD   $request_method;
   		fastcgi_param  CONTENT_TYPE     $content_type;
   		fastcgi_param  CONTENT_LENGTH   $content_length;
   		fastcgi_intercept_errors        on;
   		fastcgi_ignore_client_abort     off;
   		fastcgi_connect_timeout 60;
   		fastcgi_send_timeout 180;
   		fastcgi_read_timeout 180;
   		fastcgi_buffer_size 128k;
   		fastcgi_buffers 4 256k;
   		fastcgi_busy_buffers_size 256k;
   		fastcgi_temp_file_write_size 256k;
   	}
    	
   	location = /favicon.ico {
   		log_not_found off;
   		access_log off;
   	}
   	location = /robots.txt {
   		allow all;
   		log_not_found off;
   		access_log off;
   	}
   	## Disable viewing .htaccess & .htpassword 
   	location ~ /\.ht {
   		deny  all;
   	}
   }

Устанавливаем mysql:

   apt-get install mysql-server mysql-client php5-mysql
   mkdir -p /var/www/var/run/mysqld
   mount --bind /var/run/mysqld/ /var/www/var/run/mysqld/

Создадим каталог и файл index.php:

   mkdir -p /var/www/example.ru
   echo "<?php phpinfo(); ?>" >/var/www/example.ru/index.php

Перезапускаем nginx и php5-fpm:

   /etc/init.d/nginx restart
   /etc/init.d/php5-fpm restart

Безопасность Проставим правильные права каталогам:

   chown -R www-data /var/www/example.ru && chmod -R 750 /var/www/example.ru

Исправляем уязвимость связанную с

location ~ .php$ {

, для этого прописываем в /etc/php5/fpm/php.ini

   cgi.fix_pathinfo=0

Включим использование chroot, для ограничения доступа PHP к системе. Для этого редактируем файл /etc/php5/fpm/php5-fpm.conf, прописываем:

   chroot = /var/www
   chdir = /

Далее мы столкнемся с проблемой что PHP не сможет отрезолвить адрес, исправляем:

   mkdir /var/www/{etc,lib};
   cp /etc/hosts /var/www/etc/hosts;
   cp /etc/resolv.conf /var/www/etc/resolv.conf;
   cp /lib/libnss_dns.so.2 /var/www/lib/libnss_dns.so.2 //ваша система 32 битная
   cp /lib64/libnss_dns.so.2  /var/www/lib64/libnss_dns.so.2 //ваша система 64 битная

Перезапускаем php5-fpm:

   /etc/init.d/php5-fpm restart


Заходим на страницу нашего сайта example.ru и любуемся на вовод phpinfo() нашего сайта. P.S. C настройками мне помог разобраться inkvizitor68sl автор блога Debian.pro. NEW: Установка Nginx 0.8.54

   apt-get update
   apt-get install libxml2-dev libbz2-dev libcurl4-openssl-dev libmcrypt-dev libmhash2 libmhash-dev libpcre3 libpcre3-dev make
   wget http://sysoev.ru/nginx/nginx-0.8.54.tar.gz
   tar zxf nginx-0.8.54.tar.gz
   cd nginx-0.8.54
    
   ./configure \
   --conf-path=/etc/nginx/nginx.conf \
   --error-log-path=/var/log/nginx/error.log \
   --http-client-body-temp-path=/var/lib/nginx/body \
   --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
   --http-log-path=/var/log/nginx/access.log \
   --http-proxy-temp-path=/var/lib/nginx/proxy \
   --lock-path=/var/lock/nginx.lock \
   --pid-path=/var/run/nginx.pid \
   --with-debug --with-http_dav_module \
   --with-http_gzip_static_module \
   --with-http_realip_module \
   --with-http_stub_status_module \
   --with-http_sub_module
   make && make install 


Debian «Squeeze» Для установки пакета php-fpm понадобится:

   echo "deb http://packages.dotdeb.org squeeze all" >>   /etc/apt/sources.list
   wget http://www.dotdeb.org/dotdeb.gpg && cat dotdeb.gpg | apt-key add - && aptitude update

статья тут:[1]http://habrahabr.ru/post/113101/

Дополнительное инфо: [2]http://wiki.nginx.org/PHPFcgiExample

[3]http://nginx.org/ru/docs/http/ngx_http_fastcgi_module.html#fastcgi_index

[4]http://nginx.org/ru/docs/http/request_processing.html