Установка NGINX сервера на Debian 7
Импорт необходимых PGP ключей:
wget -O - http://nginx.org/keys/nginx_signing.key|apt-key add -
Для добавления репозиториев nginx необходимо вписать в конец файла /etc/apt/sources.list
deb http://nginx.org/packages/debian/ wheezy nginx deb-src http://nginx.org/packages/debian/ wheezy nginx
>или выполнить в командной строке
echo "#Rep NGINX">> /etc/apt/sources.list echo deb http://nginx.org/packages/debian/ wheezy nginx>> /etc/apt/sources.list echo deb-src http://nginx.org/packages/debian/ wheezy nginx>> /etc/apt/sources.list
Обновляем репозитарии
apt-get update
Приступаем к установке
apt-get install nginx php5 php5-curl php5-cgi php5-fpm fcgiwrap php5-gd memcached php5-memcached siege php5-cli php5-common mysql-server php5-mysql php5-suhosin
- nginx — сам веб сервер.
- php5-cli php5-common php5-sqlite php5-cgi php5-fpm php5-gd — некоторые нужные для работы движков модули php.
- mysql-server php5-mysql — база данных mysql и связь ее с php.
- fcgiwrap — обработка perl скриптов.
- php5-apc memcached php5-memcached — ускорители работы веб сервера.
- siege — утилита для тестирования скорости работы сайта, понадобится при подборе количества обработчиков.
- php5-suhosin — патч для PHP предназначенный для повышения защиты сервера от действий злоумышленника.
Проверим версию установленного NGINX
nginx -v nginx version: nginx/1.6.2
Создаем каталог для сайтов и логов, также устанавливаем права
mkdir -p /usr/local/hosting/www && chmod -R a-rwx,u+rwX,g+rX /usr/local/hosting/www && chown www-data:www-data -R /usr/local/hosting/www #Дирректория для кеша mkdir /tmp/fcgi-cache/ && chown www-data:www-data -R /tmp/fcgi-cache/
2. Настройка Nginx
Несмотря на то, что конфигурация Nginx состоит из нескольких файлов, сам nginx начинает читать единственный файл: /etc/nginx/nginx.conf, все остальные подключаются директивой include.
Редактируем /etc/nginx/nginx.conf
# Пользователь с правами которого работает nginx user www-data; # Рекомендуется устанавливать по числу ядер worker_processes 4; pid /var/run/nginx.pid; #worker_rlimit_nofile 8192; events { # Максимальное число подключений к серверу на один worker-процесс worker_connections 1024; # Эффективный метод обработки соединений, используемый в Linux 2.6+ use epoll; } http { ## # Базовые настройки #Организовываем кеш для FastCGI сервера, я использую раздел в ram fastcgi_cache_path /tmp/fcgi-cache/ levels=1:2 keys_zone=one:10m; #Используем sendfile, но осторожно, если надо отдавать большие файлы, #то sendfile случается вредит sendfile on; #Расширяем буфера отдачи #output_buffers 32 512k; #Ограничиваем размер сегмента отправляемой за одну #блокируемую отдачу sendfile_max_chunk 128k; #Буфер отдачи которы используется для обрабатываемых данных postpone_output 1460; #Размер хеша для доменных имен. server_names_hash_bucket_size 64; #Размер данных принемаемых post запросом client_max_body_size 15m; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; # При ошибках не говорим врагу версию nginx server_tokens off; 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; error_log /var/log/nginx/error.log; ## # Настройки сжатия gzip on; gzip_disable "msie6"; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; ssi on; ## # Настройка виртуальных доменов include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Настройка виртуального домена
Создаем директории для доменов и шаблонов
mkdir /etc/nginx/sites-enabled mkdir /etc/nginx/sites-available mkdir /etc/nginx/templates mkdir /var/www/htdocs
Настройка шаблонов.
Общий шаблон
mcedit /etc/nginx/templates/default
# Типовые настройки общие для всех доменов (если не захочется экзотики) ## index index.html index.php; # Реализуем "красивые" ссылки для Drupal (и для ряда других CMS) location / { try_files $uri $uri/ /index.php?q=$uri&$args; } # Закрываем доступ к файлами .htaccess и .htpassword location ~ /.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; }
Шаблон подключения обработки php
mcedit /etc/nginx/templates/php
# Передаём обработку PHP-скриптов PHP-FPM location ~ .php$ { try_files $uri =404; #PHP-FPM слушает на Unix сокете #fastcgi_pass unix:/tmp/wwwpool.sock; fastcgi_pass unix:/var/run/php5-fpm.sock; #Использовать cache зона one fastcgi_cache one; #Помещать страницу в кеш, после 3-х использований. Меньшее число вызвало у меня труднообъяснимые глюки # на формах регистрации fastcgi_cache_min_uses 3; #Кешировать перечисленные ответы fastcgi_cache_valid 200 301 302 304 5m; #Формат ключа кеша - по этому ключу nginx находит правильную страничку fastcgi_cache_key "$request_method|$host|$request_uri"; #Если не использовать эту опцию - то в форумах все будут сидеть под именем первого вошедшего на форум # fastcgi_hide_header "Set-Cookie"; #Этот запрос заставит nginx кешировать все что проходит через него # fastcgi_ignore_headers "Cache-Control" "Expires"; fastcgi_index index.php; # fastcgi_intercept_errors on; # только на период тестирования # Включаем параметры из /etc/nginx/fastcgi_param include fastcgi_params; # Путь к скрипту, который будет передан в php-fpm fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_ignore_client_abort off; }
Шаблон подключения обработки Perl
mcedit /etc/nginx/templates/perlcgi
#Все скрипты заканчивающиеся на pl и cgi location ~ .(pl|cgi)$ { #Не сжимаем скрипты gzip off; try_files $uri =404; #Передаем скрипты на обработку fcgiwrap fastcgi_pass unix:/var/run/fcgiwrap.socket; # Используем стандартные параметры include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_ignore_client_abort off; } #Замена апачевской ScriptAlias location /cgi-bin/ { gzip off; try_files $uri =404; root /var/www/; fastcgi_pass unix:/var/run/fcgiwrap.socket; include /etc/nginx/fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_ignore_client_abort off; }
Шаблон подключения phpmyadmin
mcedit /etc/nginx/templates/phpmyadmin
location /phpmyadmin { root /var/www/; index index.php index.html index.htm; location ~ ^/phpmyadmin/(.+.php)$ { try_files $uri =404; root /var/www/; fastcgi_pass unix:/tmp/wwwpool.sock; #fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; } location ~* ^/phpmyadmin/(.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ { root /var/www/; } }
Отключаем уязвимость forum.antichat.ru/thread222063-php-fpm.html
прописываем в /etc/php5/fpm/php.ini
cgi.fix_pathinfo=0
Создаем шаблон по умолчанию для своего домена:
mcedit /etc/nginx/sites-available/default
server { # Папка с контентом сайта (удобно, когда совпадает с именем домена) root /var/www/htdocs/; # Настройка логов, каждому виртуальному домену - свой лог access_log /var/log/nginx/default-access.log; error_log /var/log/nginx/default-error.log; # Подключаем все шаблоны для проверки, на реальных хостах будем использовать только нужные. include /etc/nginx/templates/default; include /etc/nginx/templates/php; include /etc/nginx/templates/phpmyadmin; include /etc/nginx/templates/perlcgi; }
Создаем симлинк
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/000-default
Удаляем стандартный default, если есть
rm /etc/nginx/conf.d/default.conf
Проверяем правильность конфига
service nginx configtest
Testing nginx configuration: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
nginx.
Готово! перезапускаем Nginx
service nginx reload
Если все верно, то nginx начинает работать с новой конфигурацией, если нет — работа продолжается со старой, рабочей конфигурацией.
Проверка работоспособности php.
Создадим файл test.php в корневом каталоге сайта (в нашем случае это /var/www/htdocs/) следующего содержания:
<?php phpinfo(); ?>
chmod 755 /usr/local/hosting/www/test.php && chown www-data:www-data /usr/local/hosting//www/htdocs/test.php
После чего переходим в браузере IP/test.php, если все верно — получаем параметры php на сервере, после чего удаляем этот фаил для безопасности.
Проверка работоспособности Perl.
Создадим файл test.cgi в корневом каталоге сайта (в нашем случае это /var/www/htdocs/) следующего содержания:
#!/usr/bin/perl -w print "Content-type: text/htmlnn"; print "<html><head><title>Hello World!! </title></head>n"; print "<body><h1>Hello world</h1></body></html>n";
chmod 755 /var/www/htdocs/test.cgi && chown www-data:www-data /var/www/htdocs/test.cgi
После чего переходим в браузере IP/test.cgi, если все верно — получаем «Hello world».
Если все работает, то на этом этапе мы имеем рабочий веб сервер с поддержкой php и perl скриптов, дальше опишу некоторые нюансы донастройки отдельных его частей.
.htaccess !
В Nginx нет никакого аналога апачевского .htaccess, поэтому если работа сайта требует его наличия, то придётся переписывать его содержание в соответствии с синтаксисом nginx в основную конфигурацию домена. В нашем конфиге .htaccess был заменён следующим блоком:
location / { try_files $uri $uri/ /index.php?q=$uri&$args; }
Для преобразования .htaccess в синтаксис nginx можно воспользоваться [urlspan]онлайн-конвертором[/urlspan]
3. Настройка PHP-FPM
В Debian конфигурация PHP-FPM состоит из 2х частей: глобальной (/etc/php5/fpm/php-fpm.conf) и настройки пулов (/etc/php5/fpm/pool.d/*.conf). В данном примере глобальные настройки мы трогать не будем, а вот на настройке пулов остановимся чуть подробнее.
Пулы
Для начала разберёмся зачем нужны пулы. В случае разных требований сайтов к PHP-окружению (различные параметры php.ini, разное число обработчиков и т.д.) может потребоваться создание дополнительных пулов. Данная операция в PHP-FPM весьма тривиально:
Настройка каждого пула в Debian представлена своим файлом в каталоге /etc/php5/fpm/pool.d/. По умолчанию системе есть единственный пул «www» (файл: /etc/php5/fpm/pool.d/www.conf) именно его настройкой мы и займёмся.
Workers (обработчики)
Самая спорная часть в настройке пула, это количество обработчиков php-скриптов. На первый взгляд, кажется, что чем больше обработчиков, тем эффективней обрабатываются php-скрипты. Но это не так! Во-первых: большое число обработчиков расходует больше памяти (а для нашего сервера память весьма критичный ресурс), во-вторых: если обработчиков очень много и, так случилось, что все они реально заняты работой, то у сервера может просто не хватить ресурсов на другие задачи (даже есть вероятность, что подключение по SSH станет практически не возможным).
В идеале число обработчиков должно быть таким, что даже при стрессовой нагрузке LoadAvarage системы оставался в разумных пределах. Т.е. пусть лучше при высокой нагрузке пользователи периодически получают сообщения о недоступности сервиса (ошибка 502: Gateway timeout), чем полная недоступность сервера даже для администратора.
И так немного подредактируем стандартный пул mcedit /etc/php5/fpm/pool.d/www.conf
#Где будем слушать подключения, я предпочитаю сокеты, но если сервера разнесены, то прийдется использовать порт. ;listen = 127.0.0.1:9000 listen = /tmp/wwwpool.sock # Выбираем динамический режим создания процессов, т.е. # число запущенных процессов PHP-FPM будет зависеть от текущей нагрузки pm = dynamic # Максимальное количество дочерних процессов. pm.max_children = 7 # Количество дочерних процессов, стартующих сразу при загрузке сервера. Т.к. время запуска каждого # нового процесса отлично от нулевого, то выбираем значение больше 1, не смотря на экономию ресурсов pm.start_servers = 3 # Минимальное чисто простаивающих процессов. Должен согласовываться по логике с предыдущими # при экономии ресурсов будет удобно pm.start_servers = pm.min_spare_servers. pm.min_spare_servers = 3 # Максимальное чисто простаивающих процессов. Естественно, что не более чем pm.max_children # и не менее pm.min_spare_servers. Остальные будут выгружены. pm.max_spare_servers = 4 # Если скрипт будет выполняться больше указанного времени, то отладочная информация по нему будет записана в файл "медленных" запросов request_slowlog_timeout = 3s # Определяет путь к файлу "медленных" запросов (обязательный параметр, в случае определения request_slowlog_timeout) slowlog = /var/log/php-slow.log
Оптимальное число обработчиков зависит от ресурсов сервера, сложности php-скриптов, нагрузки, создаваемой на mysql-сервер и т.д. В любом случае оптимальное число обработчиков нужно подбирать на основе тестирования работы сайта. Методика тестирования неплохо описана тут, повторяться не буду.
Добавление пула
При увеличении числа обслуживаемых сайтов может понадобиться создание дополнительных пулов, для настройки различных параметров каждому сайту — своё. Данная операция в php-fpm, на наш взгляд, весьма тривиальна:
Нужно скопировать файл /etc/php5/fpm/pool.d/www.conf под новым именем (для примера назовём его newpool.conf)
Дать новому пулу имя: находим вверху нового файла строку [www] (имя первого пула) и меняем на [newpool]
Меняем адрес подключения к php-fpm (директива «listen»). Т.к. каждый адрес должен быть уникален, то нужно изменить:
listen = 127.0.0.1:9000
на
listen = 127.0.0.1:9001
Или, в случае использования unix-сокетов,
listen = /tmp/newpool.sock
Номера портов и путей к unix-сокетам во всех пулах должны быть разными!
Для применения параметров после изменения php.ini (для PHP-FPM полный путь к файлу выглядит так: /etc/php5/fpm/php.ini) или собственных настроек PHP-FPM требуется перезапуск сервиса
service php5-fpm restart
4. Установка phpmyadmin
Загрузим стабильную версию phpmyadmin с сайта [urlspan]www.phpmyadmin.net/home_page/downloads.php[/urlspan]
wget http://optimate.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.2.7/phpMyAdmin-4.2.7-all-languages.tar.gz
Распакуем сразу в нужную дирректорию и дадим нужные права.
tar -xzf phpMyAdmin-4.2.7-all-languages.tar.gz -C /var/www/ mv /var/www/phpMyAdmin-master-версия /var/www/phpmyadmin chown www-data: /var/www/phpmyadmin -R
Скопируем файл с примером конфигурации и приведем его к следующему виду (сгенерировать blowfish_secret можно [urlspan]здесь[/urlspan]):
cp /var/www/phpmyadmin/config.sample.inc.php /var/www/phpmyadmin/config.inc.php mcedit /var/www/phpmyadmin/config.inc.php
$cfg['blowfish_secret'] = ‘e%o$fd3}tC9[GxY$zY_+ddfTdss[i*JG]#GHt]alv’ $cfg['Servers'][$i]['auth_type'] = ‘http’; $cfg['Servers'][$i]['controluser'] = ‘pma’; $cfg['Servers'][$i]['controlpass'] = ‘fHUsMkId57NM’; // Сгенерируйте свой пароль $cfg['Servers'][$i]['pmadb'] = ‘phpmyadmin’; $cfg['Servers'][$i]['bookmarktable'] = ‘pma_bookmark’; $cfg['Servers'][$i]['relation'] = ‘pma_relation’; $cfg['Servers'][$i]['table_info'] = ‘pma_table_info’; $cfg['Servers'][$i]['table_coords'] = ‘pma_table_coords’; $cfg['Servers'][$i]['pdf_pages'] = ‘pma_pdf_pages’; $cfg['Servers'][$i]['column_info'] = ‘pma_column_info’; $cfg['Servers'][$i]['history'] = ‘pma_history’; $cfg['Servers'][$i]['tracking'] = ‘pma_tracking’; $cfg['Servers'][$i]['designer_coords'] = ‘pma_designer_coords’; $cfg['Servers'][$i]['userconfig'] = ‘pma_userconfig’; $cfg['SuhosinDisableWarning'] = ‘true’;
Затем создаем базу данных и пользователя необходимые для работы phpMyAdmin:
mysqladmin -p create phpmyadmin mysql -p CREATE USER 'pma'@'localhost' IDENTIFIED BY 'fHUsMkId57NM'; GRANT ALL ON phpmyadmin.* TO 'pma'@'localhost'; exit;
и необходимые для работы таблицы при помощи скрипта create_tables.sql:
mysql -p phpmyadmin < /var/www/phpmyadmin/examples/create_tables.sql
Теперь при обращении к любому хосту, в конфигурацию которого включен шаблон /etc/nginx/templates/phpmyadmin мы имеем возможность запустить phpMyAdmin, перейдя по адресу _http://имя_хоста/phpmyadmin