четверг, 3 февраля 2011 г.

Установка и настройка: Nginx + php-fpm на Debian

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




Добавляем репозитарии и генерируем ключи:
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;
 }
}
Создадим каталог и файл 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() нашего сайта.


Отсюда

Комментариев нет:

Отправить комментарий