Home > High technologies, Internets, IT-bullshit, Linux, Linux-software, System administration, Web 2.0 and something like that > Внедрение nginx на примере работающего сервера с Centos 6.2

Внедрение nginx на примере работающего сервера с Centos 6.2

Сегодня будем рассматривать оптимизацию посредством внедрения nginx .

Изначальные условия: работающий сервер на centos 6.2, на котором стоит apache+php+mysql и несколько расширений и модулей для php, на которых мы заостряться не будем. На сервере крутится ~25 сайтов настроенных как virtual hosts.

Появилась необходимость настроить nginx как frontend и apache как backend соответственно. Последняя стабильная версия nginx оказалась в репозитории epel, который надо подключать отдельно. К сожалению там не оказалось по умолчанию некоторых модулей, и было принято решение собирать nginx самостоятельно. Для удобства, а так же в целях удобства администрирования было решено собирать rpm из src.rpm. Это даст нам возможность пересобрать пакет, если нас что-то не устроит, безболезненно его удалить, а так же не упустить никаких зависимостей пакета. В пакетных дистрибутивах, будь то rpm-based или deb-based, всегда рекомендуется установка из пакетов.

Для начала подключим репозиторий EPEL командой:

# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-5.noarch.rpm

# rpm –import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL

Затем включим репозиторий с пакетами исходников, отредактировав файл /etc/yum.repos.d/epel.repo

# nano /etc/yum.repos.d/epel.repo

В секции epel-source меняем значение enabled=1 .

Далее установим пакеты необходимые для сборки:

# yum install yum-utils rpmdevtools gcc make

Скачиваем исходники пакета:

# yumdownloader –source nginx

Пакет скачается в директорию в которой мы находимся. Установим его:

# rpm –ivh nginx -1.0.14-1.el6.src.rpm

Не стоит пугаться сообщений вида:

warning: user mockbuild does not exist – using root

warning: group mockbuild does not exist – using root

Для нашей задачи эти уведомления никакой роли не играют. Ошибки здесь тоже никакой нет.

Установим зависимости исходников для сборки:

# yum-builddep nginx -1.0.14-1.el6.src.rpm

У нас появилась папка rpmbuild, а в ней папка SPECS, а в ней nginx.spec, отредактируем его:

# nano ~/rpmbild/SPECS/nginx.spec

Редактируем по своему желанию, а можем и оставить как есть.

Приступаем к сборке:

# rpmbuild -ba ~/rpmbuild/SPECS/nginx.spec

# cd ~/rpmbuild/RPMS/x86_64/

# ls –l

А вот и наш готовый пакет. Устанавливаем:

# rpm -ivh nginx-1.0.14-1.el6.x86_64.rpm

Первая часть закончена. Остается настроить.

Файлы с настройками я сначала скопировал в другое место, отредактировал, потом забекапил оригинальные файлы, на случай непредвиденных неприятностей. После чего просто останавливал сервисы httpd и nginx, заменял конфигурационные файлы и запускал. В случае неудачи вернуть всё назад было делом одной минуты.

 

В файле конфигурации httpd.conf заставляем слушать apache порт 8080 :

Listen 8080
NameVirtualHost 127.0.0.1:8080

 

В файле с виртуальными хостами все тоже приводим к однообразию:

<VirtualHost 127.0.0.1:8080>

ServerName имя

ServerAlias алиасы

ServerAdmin admin@domen.domen

ErrorLog /var/www/html/sitename/logs/sitename_error.log

CustomLog /var/www/html/sitename/logs/sitename_access.log combined

DocumentRoot /var/www/html/sitename/htdocs

<Directory “/var/www/html/sitename/htdocs/”>

Options -Indexes

AllowOverride All

Order allow,deny

Allow from all

</Directory>

</VirtualHost>

На этом настройка apache закончена.

Далее я воспользовался статьями которые публиковались ранее.

Только с небольшими дополнениями.

При использовании типовой конфигурации nginx, Apache будет получать все запросы с единого IP-адреса, что не позволит вести корректную статистику.

 

Для решения проблемы необходимо установить дополнительный модуль reverse proxy add forward module (mod_rpaf) :

# rpm -Uvh http://www6.atomicorp.com/channels/atomic/centos/6/x86_64/RPMS/mod_rpaf-0.6-2.el6.art.x86_64.rpm

$ nano /etc/httpd/conf.d/mod_rpaf.conf

добавляем строки:

RPAFenable On

RPAFproxy_ips 127.0.0.1

RPAFsethostname On

Сохраняем. Теперь в логах будут реальные IP, а не 127.0.0.1

 

Мой файл nginx.conf:

#######################################################################

user              nginx;

worker_processes  4;

 

error_log  /var/log/nginx/error.log;

#error_log  /var/log/nginx/error.log  notice;

#error_log  /var/log/nginx/error.log  info;

 

pid        /var/run/nginx.pid;

 

 

events {

worker_connections  2048;

}

 

 

# Пришлось добавить директиву server_names_hash_bucket_size
# так как nginx с таким

# количеством виртуальных хостов запускаться отказался
# предложив увеличить это значение.

http {

include       /etc/nginx/mime.types;

default_type  application/octet-stream;

server_names_hash_bucket_size 128

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;

 

sendfile        on;

tcp_nopush     on;

 

#keepalive_timeout  0;

keepalive_timeout  65;

# сжатие я поставил чуть меньше, так как
# загрузка на процессор иногда была слишком большой, а сильного
# выигрыша нет. А так же отключаем сжатие для IE6 .

gzip  on;

gzip_static          on;

gzip_buffers 4 8k;

gzip_comp_level 6;

gzip_proxied any;

gzip_disable “msie6”;

gzip_types text/css text/plain text/json text/x-js text/javascript text/xml application/json application/x-javascript application/xml

 

server_tokens off;

expires 30m;

tcp_nopush on;

tcp_nodelay on;

# Load config files from the /etc/nginx/conf.d directory

# The default server is in conf.d/default.conf

include /etc/nginx/conf.d/*.conf;

 

}

Файл proxy.conf соответствует предыдущим инструкциям.

В файле /etc/nginx/virtual.conf всё приводим к виду:

server {

listen 80;

server_name имена_и_алиасы;

location / {

proxy_pass http://localhost:8080/;

}

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

root /var/www/html/sitename/htdocs/;

if (!-e $request_filename) {

rewrite ^(.*)$ /index.php;

}

}

}

 

На этом всё.

После чего я выключил сервисы httpd и nginx

# service httpd stop

# service nginx stop

Подменил файлы, и включил сервисы:

# service httpd start

# service nginx start

 

В большинстве своем всё заработало нормально, только на паре сайтов начались небольшие неполадки с картинками. В деталях еще не разбирался, поэтому пустил сразу на apache минуя nginx:

server {

listen 80;

server_name имена_и_алиасы;

location / {

proxy_pass http://localhost:8080/;

}

}

 

После того как всё было проверено, я включил автозапуск nginx:

# chkconfig nginx on

  1. tux
    June 2nd, 2012 at 18:41 | #1

    а в чем тогда был смысл установки nginx если картинки обрабатывает апач? И если приводите свои конфиги, так и приводите, но где же конфиг /etc/nginx/virtual.conf
    Не стоит того nginx ( в вашем случае он практически не разгружает апача)

    !!!! Пробовали ли вы сами вводить каптчу для комментариев?!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  1. No trackbacks yet.