среда, 24 июля 2013 г.

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

В данной статье, будет показано как поставить Nginx + php5-fpm на Debian Wheezy и настроить безопасную конфигурацию.

Установка NGINX.

Скачиваем и распаковываем исходные файлы:
cd /usr/src/
wget http://nginx.org/download/nginx-1.4.2.tar.gz
tar zxf nginx-1.4.2.tar.gz
rm -f nginx-1.4.2.tar.gz
cd nginx-1.4.2

Устанавливаем библиотеки необходимые для сборки:
aptitude install libpcre3-dev make libssl-dev libgeoip-dev checkinstall

Создаем конфигурацию:
./configure \
  --prefix=/usr \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --error-log-path=/var/log/nginx/error.log \
  --pid-path=/var/run/nginx.pid  \
  --lock-path=/var/lock/nginx.lock \
  --user=www-data \
  --group=www-data \
  --with-http_ssl_module \
  --with-http_gzip_static_module \
  --with-http_geoip_module \
  --http-log-path=/var/log/nginx/access.log \
  --http-client-body-temp-path=/var/tmp/nginx/client/ \
  --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  --without-http_ssi_module \
  --without-http_userid_module \
  --without-http_uwsgi_module \
  --without-http_scgi_module \
  --without-http_memcached_module \
  --without-http_limit_conn_module \
  --without-http_limit_req_module \
  --without-http_empty_gif_module \
  --without-http_browser_module \
  --without-http-cache \
  --without-mail_pop3_module \
  --without-mail_imap_module \
  --without-mail_smtp_module \
  --without-http_geo_module \
  --with-pcre

В конфигурации указывается какие модули использовать. Подробнее об опциях включения отключения модулей можно посмотреть в wiki.

Теперь собираем и устанавливаем:
make
checkinstall

Создаем необходимые для работы каталоги:
mkdir -p /var/tmp/nginx/client
mkdir -p /etc/nginx/sites-available
mkdir -p /etc/nginx/sites-enabled
mkdir -p /var/log/nginx

Скачиваем дополнительные скрипты:
wget https://dl.dropboxusercontent.com/u/98786051/nginx/nginx -O /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults

wget https://dl.dropboxusercontent.com/u/98786051/nginx/ngxdissite -O /usr/sbin/ngxdissite
wget https://dl.dropboxusercontent.com/u/98786051/nginx/ngxensite -O /usr/sbin/ngxensite
chmod +x /usr/sbin/ngx*

Установка php-fpm

Добавляем репозитарий dotdeb.org:
echo "" >> /etc/apt/sources.list
echo "#php-fpm" >> /etc/apt/sources.list
echo "deb http://packages.dotdeb.org wheezy all" >> /etc/apt/sources.list
echo "deb-src http://packages.dotdeb.org wheezy all" >> /etc/apt/sources.list
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | apt-key add -

Устанавливаем:
aptitude update
aptitude install php5-fpm
mkdir -p /var/log/php5-fpm

Настройка php-fpm

Редактируем файл /etc/php5/fpm/php-fpm.conf
;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;
[global]
pid = /var/run/php5-fpm.pid
error_log = /var/log/php5-fpm/error.log
log_level = warning
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 5s
daemonize = yes
;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;
include=/etc/php5/fpm/pool.d/*.conf

Создаем файл /etc/php5/fpm/pool.d/domain.ru.conf:
[domain.ru]

listen = /tmp/domain.ru.sock
listen.backlog = -1
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
user = www-data
group = www-data

pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
request_slowlog_timeout = 20
slowlog = /var/log/php5-fpm/www-slow.log
chdir = /

php_admin_value[open_basedir] = /usr/share/php5:/tmp:/home/domains/domain.ru/www
php_admin_value[disable_functions] = dl,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

Стартуем сервис:
service php5-fpm start

Настройка nginx

Редактируем файл /etc/nginx/nginx.conf
user  www-data;
worker_processes  8; # Ставим число по количеству ядер

timer_resolution 100ms;
worker_rlimit_nofile 8192;
worker_priority -5;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '"$status" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    server_tokens off; #Отключаем вывод версии сервера

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 1100;
    gzip_disable "msie6";
    gzip_buffers 64 8k;
    gzip_comp_level 4;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_types text/plain application/xml application/x-javascript text/css text/xml text/javascript;
    gzip_vary on;

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

Создаем файл /etc/nginx/sites-available/domain.ru
server {
    listen 200.200.200.200:80;
    server_name domain.ru;
    set $host_path "/home/domains/domain.ru";
    root   $host_path/www;
    set $yii_bootstrap "index.php";
    charset utf-8;
    client_max_body_size 20m;
    error_log /var/log/nginx/domain.ru/error.log;
    access_log /var/log/nginx/domain.ru/access.log main;

    #На ститческий контент устанавливаем кеширование и отключаем запись в лог
    location /static{
        expires           max;
        access_log        off;
    }

    location /assets{
        expires           max;
        access_log        off;
    }

    #Перенаправление всех запросов в Yii
    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    #Защищаем папки
    location ~ ^/(protected|framework|themes/\w+/views) {
        deny  all;
    }

    #отключаем обработку запросов фреймворком к несуществующим статичным файлам
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        access_log        off;
        expires           max;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    #Блокируем прямой доступ к следующим типам файлов
    location ~* ^.+\.(inc|sql|dat|ini|conf|cfg|log)$ {
        deny  all;
    }

    location ~ .php$ {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #позволяем yii перехватывать запросы к несуществующим PHP-файлам
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
                set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   unix:/tmp/domain.ru.sock;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;
        #PATH_INFO и PATH_TRANSLATED могут быть опущены, но стандарт RFC 3875 определяет для CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
        fastcgi_intercept_errors        on;
        fastcgi_ignore_client_abort     on;
        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;
    }

 #Блокируем доступ к папкам SVN
    location ~ /.svn/ {
        deny all;
    }

    location ~ /.cvs/ {
        deny all;
    }
}

В данном примере показана настройка сайта, работающего на фреймворке YII.

Включаем сайт
ngxensite domain.ru
service nginx reload

Проверяем

Создаем файл /home/domains/domain.ru/www/test.php с содержимым
<?php
phpinfo();
?>

Открываем в браузере http://domain.ru/test.php
Если все нормально настроено, то увидим

2 комментария :