В данной статье, будет показано как поставить 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
Если все нормально настроено, то увидим