Оптимизируемся по полной. Установка nginx

Главные вкладки

Аватар пользователя cwer cwer 4 октября 2007 в 13:07

Если у вас есть посещаемый сайт и свой сервер или vps, возможно вам стоит заменить apache на более легкий сервак.
Я выбрал nginx. Есть 2 варианта его использования:
1) В качестве прокси на пути к апачу. В этом случае он отдает всю статику самостоятельно, а пхп запросы отсылает апачу. Апач их обрабатывает и отдает назад результат.
2) В качестве полноценного сервера, без апача
Рассмотрим 2й вариант.

  • Итак, для работы nginx необходимо собрать пхп в режиме fastcgi.
    Скачиваем пхп (я качал 4.4.7, потому что я этой версии доверяю больше). Распаковываем, заходим в папку (через консоль)
    ./configure --prefix=/opt/php --enable-fastcgi --with-mysql=/usr --enable-mbstring
    ...
    make
    ..
    make install

    --prefix=/opt/php --enable-fastcgi --with-mysql=/usr --enable-mbstring
    Самая простая нужная нам сборка пхп. По пунктам:
    --prefix= - отвечает за то в какую папку будет установлен пхп. Нужно (если нужно), чтобы не устанавливать поверх старого.
    --enable-fastcgi - включаем режим fastcgi
    --with-mysql=/usr - необходимо для нормального подключения к бд (версий 4.x)
    --enable-mbstring - чтобы друпал не ругался на отсутствие поддержки юникода.
    Возможно вам придется добавить еще что-нибудь. Пересобрать несложно Smile

  • Для запуска пхп можно использовать утилиту spawn-fcgi из пакета lighttpd.
    Для этого необходимо скачать lighttpd, аналогично распаковать, зайти в папку.
    ./configure
    ..
    make
    ..

    В этом случае make install мы не делаем, ибо незачем Smile
    Потом копируем собранный spawn-fcgi собранных программ (ну путь у себя смотрите)

    cp src/spawn-fcgi /usr/bin/spawn-fcgi

    После этого запускаем пхп

    /usr/bin/spawn-fcgi -f /opt/php/bin/php -a 127.0.0.1 -p 8888

    -f - пишем путь до собранного пхп (до бинарника)
    -a - по какому айпи слушать (127.0.0.1 менять не надо)
    -p - по какому порту

  • Скачиваем nginx, распаковываем, заходим в папку.
    ./configure
    ..
    make
    ..
    make install

    При ./configure может выдать ошибку "the HTTP rewrite module requires the PCRE library". Что с этим делать читаем в мануалах к nginx.
    При конфигурировании сборки без параметров nginx будет установлен в каталог /usr/local/nginx/.
    Настраиваем nginx (файл nginx.conf, находится в папке nginx/conf/)
    См. прикрепленный файл.
    В приведенной конфигурации есть любопытных моментов
    1) /OUR_WWW_FILES - необходимо заменить на полный путь файлам друпала на сервере
    2) тут слушается порт 81 (использовал для тестов)
    После успешной установки запускаем nginx с правами пользователя root:
    /usr/local/nginx/sbin/nginx
    Команда
    ps ax -o pid,ppid,user,%cpu,vsz,wchan,command|egrep '(nginx|PID)'
    покажет запущен у нас nginx или нет.
    ну и соответственно example.ru:81 покажет нормально он у нас работает или нет Smile

Вообще, желательно вдумчиво прочитать мануалы по nginx. Удачной установки Smile

ВложениеРазмер
Иконка простого текстового файла nginx.txt1.61 КБ

Комментарии

Аватар пользователя Stalker-g2 Stalker-g2 4 октября 2007 в 19:50

Есть 2 варианта его использования:
а мне больше нравится вариант 3.
все пути к картинкам, видео и другой статике задаются в виде http://media.домен.ру/ и их отдаёт nginx без участия апача.
домен.ру работает на апаче без nginx - кэшированием занимается цмс(это правильно)

этот вариант проще в настроке и более расширяем - остаётся возможность использовать любые модули апача, не мучаясь с nginx.

Аватар пользователя cwer cwer 4 октября 2007 в 20:40

можно и так, однако вы не совсем правы насчет кеширования. Nginx не кеширует
Когда пользователь запрашивает что-то апач держит процесс с начала скачки юзером, до конца. А если у юзера слабый канал, то скачка может идти долго. И все это время будет висеть процесс апача (довольно тяжелый кстати). А если, nginx в роли прокси, то апач работает ровно столько, сколько надо для обработки пхп. В это время висит процесс nginx

Аватар пользователя Stalker-g2 Stalker-g2 4 октября 2007 в 21:02

канал слабый? ну и что. проблем-то. я ж и говорю - весомую статику отдавать с отдельного субдомена через nginx

а какой бы слабый ни был канал у пользователя - текст отдастся быстро(к тому же сначала прогружается текст, а потом картинки с флэшами). а если апач будет отдавать nginx-у, а он юзеру-это ж сколько ресурсов просто на переключение процессов уйдёт? хрен редьки не слаще, как говорится

Аватар пользователя cwer cwer 5 октября 2007 в 0:24

Каждому свое Smile
Я например не собираюсь использовать апач вообще. Пока не придумал, чего я не могу сделать с помощью nginx Smile

Аватар пользователя VLAD_X VLAD_X 5 октября 2007 в 15:50

mod_security под Apache.
Под Nginx'ом ничего подобного нет и не предвидится.
И это единственное, что меня держит от полного отказа от Apache Sad

Аватар пользователя Syndicut Syndicut (не проверено) 5 октября 2007 в 2:06

А конфиг вы сами составляли или позаимствовали где? Просто столько вариантов этих конфигов, а подробного описания что и какая директива дает и надо ли ее ставить не найдешь особо

Аватар пользователя axel axel 5 октября 2007 в 3:41

cwer, спасибо за статью! Ты меня опередил Smile - я только собирался описать опыт установки друпала на nginx с поддержкой clean url. Вообще мне понравилось как работает этот вебсервер, видел как работает на хостах с очень высокой нагрузкой (правда не под друпалом).

Аватар пользователя cwer cwer 5 октября 2007 в 16:59

axel, было бы за что Smile
я пока только для тестов ставил. Возможно что-то упустил или что-то неправильно. Вроде работает Smile

Аватар пользователя marazmus marazmus 5 октября 2007 в 9:07

Я уже вижу эту статью в подшивке Smile

Персонаж ползает на коленях, бьется головой об пол. Пол издает глухие звуки, череп звонко звенит. До ушей Axel доносятся завывания - "Book! Подшивка! Дай!" и еще бормотания.

Аватар пользователя axel axel 9 октября 2007 в 2:23

Да будет вики! Lol

Категоризацию в стиле book прикрутить к основному сайту можно тоже, или с вики скрестить? Маразмус, но был уже тут раздел book когда-то, повторять в чистом виде эту штуку больше не хочется.

Аватар пользователя igdrasil@drupal.org igdrasil@drupal.org 5 октября 2007 в 9:54

судя по .htaccess для друпала требуется mod_expires, хотя по моему опыту нормально работает и при отключенном, возможно какие--то функции и не пашут, пока это критично не было, но вдруг? как у nginx с поддержкой модулей - аналогов апачевских?
и вообще, что делать с .htaccess? у себя я без проблем его удалил, переписав в настройки виртуалхоста, но если придется переписывать правила для mod_rewrite - сам не потяну (а у меня один сайт интегрирован с пхпбб, там конфиг тяжелый, в основном rewrite команды)

ЗЫ. с выходом релиза Boost задумался о nginx, эта связка дала бы кучу плюсов но...

Аватар пользователя cwer cwer 5 октября 2007 в 17:02

насчет mod_expires не знаю, а тот конфиг, что я написал включает поддержку ЧПУ для друпала)
насчет пхпбб не знаю. Может стоит попросить или нанять кого-то переписать реврайты

Аватар пользователя cwer cwer 5 октября 2007 в 17:05

Не было, как-то не складывается у меня с тестированием Smile
я вообще новичок в этих делах совсем (пхп например собирал первый раз), так что извините Sad
но я вижу друпал.ру на апаче. Может axel поставит nginx и сделает тесты Wink

Аватар пользователя cwer cwer 5 октября 2007 в 19:48

Сейчас пустил nginx под нагрузку, пока пациент чувствует себя хорошо и забирает метров на 300 меньше оперативки чем апач
Сайт работает по ощущениям Smile быстрее
Правда пришлось перекомпилить пхп (забыл поддержку gd)

Аватар пользователя kiev1 kiev1 6 октября 2007 в 14:11

я обычно ставил nginx только как фронтенд к апачу, а прямо так не пробовал - интересно - как в нем работают short-url и все остальное что требует друпал?
ну и еще - компилировать из сырцов уже не обязательно - на дворе 21-й век - пользуйтесь готовыми бинарниками yum install или apt-get install )

Аватар пользователя cwer cwer 6 октября 2007 в 22:49

ЧПУ работает нормально
насчет компилирования. Даже мне было не лень набрать три команды (с учетом того, что при компилировании можно выбрать различные конфигурации, это все таки нужно)

Аватар пользователя igdrasil@drupal.org igdrasil@drupal.org 7 октября 2007 в 11:16

ну может я хочу его из порта для фряхи собрать? вообще, все публикуют, а вот для фряхи ключей не дают((((
линукс раздувается так, что скоро станет 2-й виндой....

Аватар пользователя axel axel 9 октября 2007 в 2:20

Кстати, если кто не заметил, drupal.ru сейчас работает на nginx Wacko Правда boost пришлось по этому поводу отключить. Осталось найти время и перевести модреврайтовские инструкции буста в правила nginx.

Аватар пользователя marazmus marazmus 9 октября 2007 в 7:25

Axel, при всем уважении - почему на друпал.орг буки есть, а на друпал.ру нет?

Все, что нужно - легкое включение материалов (статей блога и записей форума) в иерархию определенного рода. Фиг с ним, не нужно на первое время светить этот бук на главной, хватит и ссылки в меню пользователя.

Мой основной аргумент - ЛЕГКОСТЬ добавления документов в иерархию. Все. Smile Викисты пусть занимаются вики. Мне вот лично не будет лень перелопатить весь друпал.ру и собрать статьи в иерархию подшивки book. Но меня ломает и будет ломать кидать тексты в вики, потому что это требует на порядок больше времени и усилий.

Axel. В порядке эксперимента? Smile НУ ПАЖАЛУСТА....

P.s. В качестве контраргументов лучше привести то, что было с book до того, когда она исчезла. Некому было работать с ней? Или были проблемы с производительностью? Или была запутанная иерархия? Я буду стараться избегать этих проблем, если они будут описаны в качестве "так делать не рекомендуется".

Спасибо Smile

Аватар пользователя axel axel 13 октября 2007 в 0:47

Я в отдельном топике приведу аргументы, почему на drupal.ru не хочу ставить book для документации. Хотя для других целей он вероятно будет задействован.

Аватар пользователя leo leo 13 января 2008 в 22:26

сам nginx вроде урлы теперь обрабатывет нормально, но как включить clean urls в самом друпале ? Run test не прокатывает -> радио батон в админке задейзеблен Sad

Аватар пользователя bigmazzy bigmazzy 7 апреля 2008 в 23:56

хм. использовал пример конфига. только вместо fastcgi перенапраляю пхп запрос на апач локалхостный.
на выходе получается, что все картинки которые формируются друпалом имеют ссылку http://127.0.0.1/files/la-la-la.jpg

Аватар пользователя Portnov Portnov 23 мая 2008 в 11:09

Это лечится. В конфиге nginx, там где переправляем запросы апачу:

        location ~ \.php$ {
            proxy_pass   ....;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
Аватар пользователя kiev1 kiev1 17 июня 2008 в 19:47

еще вопрос по nginx
иногда вылетает "502 bad gateway", но беда не в этом - беда в том что по нажатии "обновить" - он в течении некоторого интервала упорно выдает из кеша страничку об ошибке не пытаясь еще раз перепослать запрос - как можно или уменьшить этот интервал или сделать что бы он это не кешировал

Аватар пользователя gumk gumk 31 августа 2008 в 12:06

Напишите пожалуйста подробнее как сделать так, чтобы ЧПУ работали на друпале, что и где надо прописать? (брал vds с установленным nginx и теперь не могу разобраться)

Аватар пользователя gumk gumk 31 августа 2008 в 12:17

Напишите пожалуйста подробнее как сделать так, чтобы ЧПУ работали на друпале, что и где надо прописать? (брал vds с установленным nginx и теперь не могу разобраться)

Аватар пользователя MeRamo MeRamo 27 февраля 2009 в 14:47

Интересный момент - точно также у меня работает сервер, и тянет несколько сайтов без проблем. Но потом возникает проблема поставить Imagecache. Все, тупик. Если нет Апача, то найти как заставить Nginx работать с Imagecache не получается. Есть какие-то варианты (точнее один) конфигов, но у меня он не сработал.

Я имею в виду вот этот

location ~/files/imagecache/.*\.(jpg|jpeg|gif|png)$ {
if (!-f $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1;
}
}

Если есть вариант, как заставить nginx нормально обрабатывать и выдавать результаты работы Imagecache, поделитесь пожалуйста!

Аватар пользователя Stasroot1@drupal.org Stasroot1@drupal.org 11 мая 2009 в 15:01

А я хочу поставить и наладить nginx как прокси, чисто для освобождения памяти. Настроил и поставил. НО не до конца. Не происходит обработка php. Ну и соответственно работу мускуля тоже в итоге не могу проверить...
Вот мой конфиг nginx.conf:

user  wwwrun www; #Указываем от какого пользователя будут запускаться процессы.
worker_processes  1; #Количество процессов

#error_log  logs/error.log;
error_log  logs/error.log  notice; #Формат записи в лог ошибок
#error_log  logs/error.log  info;

pid        logs/nginx.pid; #Место расположение PID файла

events {
    worker_connections  1024; # Максимальное количество рабочих процессов.
}

http { # Начало секции фронт-энда.
    include       mime.types; # Подключаем mime-типы для опознания контента.
    default_type  application/octet-stream; # Тип по умолчанию, если mime не опознан.

    # Логирование. Полезно для дебага.
    #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  logs/access.log  main;

    sendfile        on;  # Включить возможность отдавать файлы напрямую.
    #tcp_nopush     on;  # Ээ.. Забыл, вернее не знаю Wink

    #keepalive_timeout  0;
    keepalive_timeout  65; # Тут думаю понятно Wink

    #gzip  on; #Включить/выключить принудительное сжатие страниц gzip

 #######################################################################
# localhost // Секция для локалхоста.
########################################################################

    server { # Инициализация
        listen       80; # На каком порту слушать
        server_name  localhost; # имя сервера. возможно указывать несколько алиасов, перечисляя через запятую.

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / { # Указываем куда будет отдаватся запрос далее.
proxy_pass         http://127.0.0.1:8081/; # Перебрасываем на локалхост:8081
proxy_redirect     off;
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
client_max_body_size       10m;
client_body_buffer_size    128k;
proxy_connect_timeout      90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_buffer_size          4k;
proxy_buffers              4 32k;
proxy_busy_buffers_size    64k;
proxy_temp_file_write_size 64k;
        } # Закончилось.

# Поскольку NginX будем использовать в качестве промежуточного сервера \
# то все динамические страницы будут обрабатыватся самим apache, а \
# статические отдаем напрямую самим nginx

location ~* ^.+.(doc|xls|exe|pdf|ppt|txt)$ {
root   /opt/www/localhost/htdocs/; # откуда будут братся статические файлы.
}
       error_page   500 502 503 504  /50x.html; # Обработка ошибок
        location = /50x.html {
            root   html; # Директория /usr/local/nginx/html Если апач не отвечает, то \
# будет использоватся данная страница ошибки.
        }

  # Запретим все попытки доступа к .htaccess и .htpasswd
        location ~ /.ht {
            deny  all;
        }
}

 #######################################################################
# /localhost
########################################################################

########################################################################
# dnevnikdrupal
########################################################################
server {
        listen       80;
        server_name  dnevnikdrupal;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
proxy_pass         http://127.0.0.1:8082/;
proxy_redirect     off;
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
client_max_body_size       10m;
client_body_buffer_size    128k;
proxy_connect_timeout      90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_buffer_size          4k;
proxy_buffers              4 32k;
proxy_busy_buffers_size    64k;
proxy_temp_file_write_size 64k;
        }

# Static files location

        location ~* ^.+.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {

                    root   /opt/www/dnevnikdrupal/htdocs/;

                            }

   error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ /.ht {
            deny  all;
        }
    }

 #######################################################################
# /dnevnikdrupal
########################################################################

########################################################################
# test
########################################################################
server {
        listen       80;
        server_name  test;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
proxy_pass         http://127.0.0.1:8083/;
proxy_redirect     off;
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
client_max_body_size       10m;
client_body_buffer_size    128k;
proxy_connect_timeout      90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_buffer_size          4k;
proxy_buffers              4 32k;
proxy_busy_buffers_size    64k;
proxy_temp_file_write_size 64k;
        }

 # Static files location
 
        location ~* ^.+.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {

                    root   /opt/www/test/htdocs/;

                            }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location ~ /.ht {
            deny  all;
        }
    }
 #######################################################################
# /test
########################################################################

########## HTTPS #####################
    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
########## /HTTPS #####################
}

И... конфигурационная часть отвечающая за виртуалхосты в апаче:

NameVirtualHost *:8081
<VirtualHost *:8081>
ServerName localhost
ServerAlias localhost
ServerAdmin admin@localhost
DocumentRoot "/opt/www/localhost/htdocs"
#ScriptAlias     /mailman/       "/usr/local/mailman/cgi-bin/"
#Alias           /pipermail/     "/usr/local/mailman/archives/public/"
<Directory "/opt/www/localhost/htdocs">
    Options All
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

NameVirtualHost *:8082
<VirtualHost *:8082>
ServerName dnevnikdrupal
ServerAlias dnevnikdrupal
ServerAdmin admin@dnevnukdrupal
DocumentRoot "/opt/www/dnevnikdrupal/htdocs"
<Directory "/opt/www/dnevnikdrupal/htdocs">
        Options All
AllowOverride All
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

NameVirtualHost *:8083
<VirtualHost *:8083>
ServerName test
#ServerAlias www.arp.org.ua
ServerAdmin admin@test
DocumentRoot "/opt/www/test/htdocs"
<Directory "/opt/www/test/htdocs">
        Options Indexes FollowSymLinks
        AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
</VirtualHost>

Как мне подкорректировать nginx, чтобы php обрабатывался именно Apache2 ? Через fastcgi не хочу.

Аватар пользователя Enkil Enkil 12 сентября 2009 в 23:42

День добрый!
Будьте добры, подскажите как правильно откорректировать конфиг чтобы работали чистые ссылки
ЗЫ используется нгинкс без апача

server {
        listen   80;
        listen localhost:80;
        server_name localhost;

        access_log  /var/www/vhosts/localhost/log/localhost-access.log;

        location / {
                root   /var/www/vhosts/localhost/www;
                index  index.html index.htm index.php;
        }

        location ~ \.php$ {
                root /var/www/vhosts/localhost/www/php;
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param script_FILENAME /var/www/vhosts/localhost/www/php$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
        }

        location ~* \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
                root /var/www/vhosts/localhost/www/php;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
                root   /var/www/nginx-default;
        }

}

Аватар пользователя Shaltay Shaltay 9 декабря 2009 в 2:22

"g00dvin" wrote:
Много вопросов про чистые ссылки. Вот ответ

Ответ дурной.
Прежде чем пиарить свой блог, почитал бы для начала документацию к nginx

http://sysoev.ru/nginx/docs/faq.html

Quote:

Обычно практикуемая прямая трансляция правил:

location / {
if (!-e $request_filename) {
rewrite ^(.*) /index.php?q=$1 last;
}
}

location = /index.php {
fastcgi_pass ...
... прочие fastcgi_param
}

достойна всяческого порицания.

Аватар пользователя vgoodvin vgoodvin 9 декабря 2009 в 8:59

"Shaltay" wrote:
Ответ дурной.
Прежде чем пиарить свой блог, почитал бы для начала документацию к nginx

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