Переходим с apache на nginx

Документация о программных продуктах, тематические статьи.
Правила форума
Убедительная просьба быть вежливыми и терпимыми.
Если вы нашли ошибку или какую-то неточность в статье, сообщите нам об этом любым удобным для вас способом.

Переходим с apache на nginx

Сообщение kaba » 09 июл 2009, 03:44

Рано или поздно Ваш сайт наберет обороты и виртуального хостинга Вам станем мало. Вы можете переместить свой сайт на другого хостинг провайдера, который пообещает Вам золотые горы и будет уверять Вас, что его сервера справятся с таким количеством запросов на веб сервер и ресурсы потребляемые Вашим сайтом не такие уж и большие. Не верьте этому. Вы просто потратите время, деньги и нервы, когда в один момент уведите, что Ваш сайт опять заблокирован. С возросшим количество посетителей на Вас сайт возрастает и количество потребляемых ресурсов сервера. За ресурсы нужно платить и тут уже никуда не денешься. Задумайтесь о аренде vps (virtual private server – с англ. виртуальный сервер) или выделенного сервера. Если Ваш бюджет пока не может себе позволить цену за аренду выделенного сервера, то тогда начните с vps. На сегодняшний день цены на vps сервера значительно снижены. Поэтому аренду в 15-30$ в месяц Вы вполне сможете себе позволить.

Вы скажете «на vps сервере намного меньше ресурсов чем на хостинговом сервере и как же он справится с моим сайтом?» Вы полностью правы, ресурсов меньше, но у Вас есть возможность полностью управлять программным обеспечением вашего vps. Вы можете оптимизировать его работу под нужды своего сайта. Для примера, можно начать с замены стандартного веб сервера apache на менее ресурсоемкий и быстрый веб сервер nginx.
Nginx - это HTTP-сервер и почтовый прокси-сервер, разработанный Игорем Сисоевым. Официальная веб страница nginx. Nginx очень хорошо зарекомендовал себя при больших нагрузках. Спросите как мне его установить? Все очень просто, используйте инструкции приведенные ниже для установки и конфигурации.

Инструкция по установке и конфигурации Nginx
Мы рекомендуем устанавливать и обновлять nginx из исходных кодов, так как Вы будет уверены, что используете саму последнюю стабильную версию. Исходный код можно скачать с сайта разработчика по URL

Итак, скачиваем архив nginx-0.7.61.tar.gz (самая последняя версия на момент написания статьи). Так же нам понадобятся библиотеки ZLIB и PCRE, которые можно взять с сайта производителя (zlib и pcre).
Распаковываем архивы:
Код: Выделить всё
#tar -xvzf zlib-1.2.3.tar.gz
#tar -xvzf pcre-7.9.tar.gz
#tar –xvzf nginx-0.7.61.tar.gz


Приступаем к конфигурации и установке nginx:
Код: Выделить всё
#cd nginx-0.7.61
#./configure --prefix=/usr/local/nginx --with-http_ssl_module
--with-pcre=../pcre-7.9 --with-zlib=../zlib-1.2.3


Весь список конфигурационных опций можно посмотреть вызвав команду:
Код: Выделить всё
#./configure --help


Итак, если конфигурация прошла без ошибок, то приступаем к компиляции и установке:
Код: Выделить всё
#make
#make install


Настройка
Приступим к настройке nginx в качестве веб сервера. Итак, все файлы nginx находятся в директории которую Вы задали при компилировании в параметре –-prefix. Переходим в эту директорию и ищем файл nginx.conf. Этот и есть конфигурационный файл веб сервера. Начнем с простого, настроим nginx для Вашего сайта на обслуживание html файлов.

Конфигурационный файл будет выглядеть следующим образом:
Код: Выделить всё
user  apache;
worker_processes  2;

events {
    worker_connections  2048;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    access_log      off;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  15;

    limit_zone one $binary_remote_addr 10m;
    limit_rate 500k;
    limit_conn one 15;
    client_max_body_size 12m;
    client_body_buffer_size 128k;

    server {
        listen 80;
        server_name domain.com www.domain.com;

        access_log  /var/log/nginx/domain-access.log;

        location / {
            root /home/username/domains/domain.com;
            index index.html index.htm;
        }
}


Доменное имя domain.com меняете на Ваше, а также вместо «/home/username/domains/domain.com» указываете полный путь к директории Вашего сайта.

Запуск
В директории /etc/init.d/ создаете файл nginx со следующим содержанием:
Код: Выделить всё
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig:   - 85 15
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac


Выставляете права для файла на запуск и чтение и активируете стартовый скрипт с помощью команды:
Код: Выделить всё
chkconfig nginx on


Теперь стартуем nginx с помощью команды:
Код: Выделить всё
service nginx start


Если nginx стартовал без ошибок, то вы сможете посмотреть содержимое своего сайта в браузере.
Итак, сайт работает, html страницы отображаются. Теперь заставим работать php файлы.

Настройка php для работы с nginx

Nginx включает в себя поддержку технологии fastcgi для работы с внешними серверами и утилитами. Php тоже поддерживает fastcgi и может быть использован для обработки fastcgi-запросов от nginx.
Итак, для начала нам необходимо установить php с поддержкой fastcgi и запустить его на tcp-порту, на который потом будут переправляться запросы из nginx. Процесс инсталляции может отличаться на разных системах, потому мы опишем процесс сборки php из исходного кода как один из самых распространенных методов.
Последнюю версию php Вы можете взять на официальном сайте. На момент написания статьи последняя стабильная версия php 5.2.10.

Скачиваем и распаковываем архив командой:
Код: Выделить всё
#tar -xzf php-5.2.10.tar.gz
#cd php-5.2.10


Приступаем к конфигурированию, весь список конфигурационных опций можно посмотреть командой:
Код: Выделить всё
#./configure –help


Пример конфирурационных параметров:
Код: Выделить всё
#./configure –prefix=/usr/local/php5 --enable-fastcgi


Компилируем и устанавливаем php, если конфигурация прошла без ошибок:
Код: Выделить всё
#make
#make install


Когда процесс установки завершится без ошибок, то приступаем к запуску fastcgi php. Если Вы решили не использовать никакого стороннего ПО, то можете запустить php с использованием его встроенного менеджера fastcgi-запросов при помощи следующего скрипта:
Код: Выделить всё
#!/bin/bash

## ABSOLUTE path to the PHP binary
PHPFCGI="/usr/local/php5/bin/php-cgi "

## tcp-port to bind on
FCGIPORT="8888"

## IP to bind on
FCGIADDR="127.0.0.1"

## number of PHP children to spawn
PHP_FCGI_CHILDREN=5

## number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=1000

# allowed environment variables sperated by spaces
ALLOWED_ENV="ORACLE_HOME PATH USER"

## if this script is run as root switch to the following user
USERID=apache

################## no config below this line

if test x$PHP_FCGI_CHILDREN = x; then
  PHP_FCGI_CHILDREN=5
fi

ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN"
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS"
ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"

if test x$UID = x0; then
  EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID"
else
  EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT"
fi

echo $EX

# copy the allowed environment variables
E=

for i in $ALLOWED_ENV; do
  E="$E $i=${!i}"
done

# clean environment and set up a new one
nohup env - $E sh -c "$EX" &> /dev/null &


Cохраняем этот файл и запускаем его. Результатом запуска должны быть несколько процессов php-cgi запущенные на Вашем сервере.
Итак, Ваше сервер php запущен в режиме fastcgi и последнее, что Вам осталось сделать, это изменить конфигурацию nginx таким образом, чтобы он переправлял все запросы к файлам php на определенный tcp-порт, на котором слушает PHP. Для этого может быть использован следующий пример секции location из конфигурационного файла nginx:
Код: Выделить всё
location ~ .php$ {
  fastcgi_pass   127.0.0.1:8888;
  fastcgi_index  index.php;

  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param  QUERY_STRING     $query_string;
  fastcgi_param  REQUEST_METHOD   $request_method;
  fastcgi_param  CONTENT_TYPE     $content_type;
  fastcgi_param  CONTENT_LENGTH   $content_length;
}


Переменную $document_root замените на полный путь к директории Вашего сайта, например:
Код: Выделить всё
fastcgi_param  SCRIPT_FILENAME /home/username/domains/domain.com$fastcgi_script_name;


После изменений в конфигурационном файле nginx, не забудьте его перезапустить. После этого проверьте как работают php файлы на вашем сервере через браузер.
Аватара пользователя
kaba
Site Admin
 
Сообщения: 121
Зарегистрирован: 08 июл 2009, 07:27
Откуда: GoodNet Ukraine

Вернуться в Статьи

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 0

cron