Внедрение 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
а в чем тогда был смысл установки nginx если картинки обрабатывает апач? И если приводите свои конфиги, так и приводите, но где же конфиг /etc/nginx/virtual.conf
Не стоит того nginx ( в вашем случае он практически не разгружает апача)
!!!! Пробовали ли вы сами вводить каптчу для комментариев?!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!