Posts tagged: Nginx

Окт 19 2008

Логирование в nginx

Перечитывая документацию к nginx нашел такие интересные переменные у модуля ngx_http_upstream:
$upstream_addr — в ней хранится ip адрес бекэнда на который nginx направит запрос
$upstream_response_time — в ней хранится время ответа бекэнда
Логирование этих переменных позволит нам оценить работоспособность бекэндов и значительно упростить поиск «тормозящей» ноды

Окт 17 2008

Nginx + php.

Сегодняшний интернет без php представить невозможно. Nginx предоставляет возможность выполнять php скрипты, используя FastCGI.

То есть для того, что бы включить поддержку CGI в php.

Для этого, в FreeBSD делаем:

cd /usr/ports/lang/php5, и выбираем Build CGI version

После того как собран php, нам необходимо собрать расширения php,

идем в

cd /usr/ports/lang/php5-extensions

Тут следует заметить, что более правильным вариантом, является php c патчем php-fpm, взять его можно по адресу php-fpm, вариант этот как я смог заметить более стабильно работает и в одной и следующих статей я обязательно на нем остановлюсь.

После того как все необходимое собрано, php-cgi нужно запустить. Запустить его можно двумя вариантами:

  1. Используя spawn-cgi из комплекта lighthttpd
  2. С помощью скрипта. Скрипт запуска php:

#!/bin/sh
 
# PROVIDE: phpFcgid
# REQUIRE: LOGIN
# KEYWORD: shutdown
 
. /etc/rc.subr
 
name="phpFcgid"
rcvar=`set_rcvar`
 
load_rc_config $name
: ${phpFcgid_enable="NO"}
: ${phpFcgid_users="www"}
: ${phpFcgid_children="5"}
 
start_cmd=phpFcgid_start
stop_cmd=phpFcgid_stop
 
phpFcgid_start() {
echo "Starting $name."
export PHP_FCGI_CHILDREN=${phpFcgid_chidlren}
for user in ${phpFcgid_users}; do
su -m ${user} -c "/usr/local/bin/php-cgi -b 127.0.0.1:9000 -q &"
echo "Test ${user}"
done
}
 
phpFcgid_stop() {
echo "Stopping $name."
pids=`pgrep php-cgi`
pkill php-cgi
wait_for_pids $pids
}
 
run_rc_command "$1"

Скрипт надо разместить в /usr/local/etc/rc.d/ под именем, допустим phpFcgid.sh

Делаем chmod +x  /usr/local/etc/rc.d/phpFcgid.sh

потом

echo «phpFcgid_enable=YES» >> /etc/rc.conf

Теперь php можно запустить

/usr/local/etc/rc.d/phpFcgid.sh start

Проверяем ps afx|grep php-cgi

И если мы все сделали правильно, то должны увидеть примерно такое:

68147  qc  I      0:00,03 /usr/local/bin/php-cgi -b 127.0.0.1:9000 -q

Теперь можно приступать к этапу конфигурирования nginx.

По сравнению с конфигурацией, приведенной в предыдущем посте,

необходимо добавить еще один локайшен, такого типа:

location ~ \.php$ { # Описываем, что локейшн будет обрабатывать
                           #все файлы с расширением php
  fastcgi_pass   127.0.0.1:9000; #Указываем адрес на котором
                                     #отвечает php FastCGI сервер
   fastcgi_index  index.php; #Индекс для модуля FastCGI
   fastcgi_param  SCRIPT_FILENAME  /home/www/htdocs/hilik.org.ua/$fastcgi_script_name;
                                                   #Путь к файлам к файлам которые будет
                                                   #обрабатывать FastCGI сервер
   include        fastcgi_params; #Подключение файла со стандартными
                                                   #параметрами для модуля FastCGI
}

На этом можно поставить точку. Поддержка php в nginx включена.

Окт 16 2008

Nginx, просто и быстро.

Nginx, простой и быстрый HTTP сервер и почтовый прокси сервер.

Его автор, Игорь Сысоев, ведет очень активную разработку.

Cоздать простой HTTP сервер для отдачи статики очень просто.

Пример простого конфига:

user  www; #Пользователь от которого будет работать nginx
worker_processes  1; #количество процессов которые будут обслуживать запросы клиентов
error_log  /var/log/nginx/nginx-error.log; #Лог файл в которые будут выводится записи об ошибках
pid        /var/run/nginx.pid; #Место где сохраится PID
events {

use kqueue; #Это метод обслуживания соединений,

#под современными FreeBSD

#kqueue самый быстрый метод

worker_connections  1024; #Количество оденовременных соединений,

#которые будет обслуживать 1

# рабочий процесс(worker)

}
http { #Тут начинается описание части непосредственно

#отвечающей за HTTP

include       mime.types; #Файл в котором описаны все возможные MIME

#types(типы документов),

#возвращаемые в заголовке

default_type  application/octet-stream; #Mime type,

#который возвращается по умолчанию(в случае,

#если описание в файле не найдено

log_format  main  ‘$remote_addr — $remote_user [$time_local] $request ‘
‘»$status» $body_bytes_sent «$http_referer» ‘
‘»$http_user_agent» «$http_x_forwarded_for»‘; #Определяем формат

#log файла

server { #Тут начинается конфигурация

#виртуального сервера

listen       89.252.34.107:80 default; #Тут определяется на каком

#ip и порту слушает наш сервер

server_name  hilik.org.ua www.hilik.org.ua; # Имена на которые

#откликается наш сервер

access_log  /var/log/nginx/hilik.org.ua-access.log main; #путь к файлу

#и формат

# в котором логируются все запросы к серверу

location / { #Мощный механизм

#в nginx, устанавливает конфигурацию

#сервера в соответствии с URI

#запроса, что очень удобно

#location можно описывать

#регекспом

root   /home/www/htdocs/hilik.org.ua; #Описывает корневой

#каталог сервера

autoindex on; #Директива разрешает выводить

#список файлов в случае отсутствия

#индекса

index index.html; #Индексный файл сервера

}

}

}

Приведенная конфигурация, позволяет запустить в работу простой вебсервер. На сегодняшний день, не смотря на то, что не вышла версия 1.0 nginx, он все больше и больше набирает популярность. Релиз 1.0 Игорь Сысоев обещает выпустить к тому моменту, когда полностью определится с API сервера.

Самые сильные стороны nginx проявляются в роли проксирующего сервера, обеспечивающего отказоустойчивость и балансировку нагрузки.

Мое личное мнение — не в версиях счастье. Главное, что nginx позволяет решать задачи, которые с помощью других инструментов(apache, lighthttpd) решить намного сложнее.