Ключевые слова:web, nginx, http, (найти похожие документы)
From: zsh <ssh2@bk.ru.>
Date: Sun, 18 Sep 2007 17:02:14 +0000 (UTC)
Subject: Настройка совместной работы Apache и nginx
Оригинал: http://ssh3.livejournal.com/29252.html
Настройка совместной работы Apache,nginx для обслуживания
1. Сборка
Жизнь в стиле Debian уже почти отучила меня собирать что-либо
самостоятельно. :) Но случай с nginx, стал исключением. Ни для
Debian, ни для FC4, которую мне любезно поставил на сервер
хостер пакета мне найти не удалось. Пришлось вспоминать.
До сборки я использовал "configure" с опциями:
./configure --prefix=/usr/local \
--sbin-path=/usr/local/bin \
--conf-path=/usr/local/etc/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/spool/nginx/client_body_temp \
--http-proxy-temp-path=/var/spool/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/spool/nginx/fastcgi_temp \
--pid-path=/var/run/nginx/nginx.pid \
--user=www-data \
--group=www-data
Далее традиционный:
#make
Правда пришлось в ручную создать каталоги, и сделать их владельцем
www-data:www-data:
/var/log/nginx/
/var/run/nginx/
/var/spool/nginx/proxy_temp
/var/spool/nginx/fastcgi_temp
/var/spool/nginx/client_body_temp
#make install
2. Конфигурация
a. Настройка nginx
Отдельное спасибо, Mr. Alexey N. Kovyrin за его статью
описывающую настройку nginx в режиме Reverse-Proxy сервера.
user www-data;
worker_processes 2;
events {
worker_connections 1024;
}
http {
include /usr/local/etc/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $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;
tcp_nodelay on;
server {
listen 80;
server_name mysite.ru www.mysite.ru;
access_log /home/mysite/log/access.log main;
# Main location
location / {
proxy_pass http://127.0.0.1:8080/;
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|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|wav|bmp|rtf|js)$ {
root /home/mysite/html;
}
}
Процесс конфигурирования можно закончен, проверим синтаксис
конфигурационного файла:
#nginx -t
b. Настройка apache
Что касается настройки apache, поскольку nginx
сконфигурирован таким образом, что все полученные на порт 80
запросы пересылает backend на ip-адрес: 127.0.0.1 и порт
8080, то достаточно в рабочем конфиге apache изменить
следующие директивы:
...
Listen 8080
...
NameVirtualHost *:8080
...
<VirtualHost *:8080>
ServerName mysite.ru
ServerAlias www.mysite.ru
ServerAdmin [email protected]
DocumentRoot /home/mysite/html
ErrorLog /home/mysite/log/error_log
CustomLog /home/mysite/log/access_log common
</VirtualHost>
Следует отметить, что скриптами IPB активно используются
ip-адреса посетителей, а в случае использования конфигурации
приведенной выше, все посетители будут для apache приходить c
одного ip-адреса: 127.0.0.1, что не правильно.
Разрешить ситуацию поможет сторонний модуль для apache с
трудно произносимым названием mod_rpaf, что я вляется
аббревиатурой от reverse proxy add forward.
Некоторые заметки о настройке совместной работы apache и
mod_rpaf можно найти здесь.
Поскольку модуль mod_rpaf является сторонней разработкой,
сборку его придется провести самостоятельно. В случае с FC4
мне потребовалось установить пакет httpd-devel.i386 командой:
#yum install httpd-devel.i386.
Сборка модуля выглядит так:
в Makefile устанавливаем значение APXS=/usr/sbin/apxs, затем
выполняем:
#make rpaf-2.0 && make install-2.0.
В конфигурационный файл apache добавляем:
...
LoadModule rpaf_module modules/mod_rpaf-2.0.so
...
## Mod_rpaf settings
RPAFenable On
RPAFproxy_ips 127.0.0.1 realip [realip1]
RPAFsethostname On
В конфигурационный файл nginx в раздел server необходимо
добавить:
...
server {
...
# Main location
location / {
...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
...
c. Замечания по интеграции в дистрибутив
1. logrotate
/home/mysite/log/*log{
missingok
daily
rotate 7
compress
delaycompress
notifempty
sharedscripts
postrotate
/bin/kill -10 `cat /var/run/nginx/nginx.pid 2>/dev/null` 2> /dev/null || true
endscript
}
2. init-скрипт
Честно говоря я не очень глубоко знаком с устройством FC
в этой части и знакомиться особого желания не испытываю,
поэтому поступил проще, скопировав с новым именем
init-cкрипт от vsftp и поправил его под собственные
нужды, возможно не везде идеологически правильно, но
работоспособно!
#!/bin/bash
# v.0.0.2
# nginx - This shell script takes care of starting and stopping nginx.
#
# chkconfig: - 60 50
# description: nginx [engine x] is light http web/proxy server
# that answers incoming ftp service requests.
# processname: nginx
# config: /usr/local/etc/nginx.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/local/bin/nginx ] || exit 0
RETVAL=0
prog="nginx"
start() {
# Start daemons.
if [ -e /usr/local/etc/nginx.conf ] ; then
echo -n $"Starting $prog: "
/usr/local/bin/nginx -t -c /usr/local/etc/nginx.conf &&
/usr/local/bin/nginx &
RETVAL=$?
[ $RETVAL -eq 0 ] && {
touch /var/lock/subsys/$prog
success $"$prog"
}
echo
else
RETVAL=1
fi
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down $prog: "
kill -3 `cat /var/run/nginx/nginx.pid 2>/dev/null`
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
return $RETVAL
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reconfigure)
if [ -f /var/lock/subsys/$prog ]; then
kill -1 `cat /var/run/nginx/nginx.pid 2>/dev/null`
RETVAL=$?
fi
;;
status)
status $prog
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|reconfigure|status}"
exit 1
esac
exit $RETVAL
Для автоматического страрта при загрузке системы
достаточно скопировать стартовый скрипт nginx в каталог
/etc/init.d и выполнить следующие команды:
#chkconfig --add nginx
#chkconfig --level 345 nginx on
Проверить статус можно командой:
#chkconfig --list | grep nginx
nginx 0:off 1:off 2:off 3:on 4:on 5:on 6:off
3. Заключение
Комплект из apache и nginx работает на моем сервере уже пару дней,
без каких либо проблем.
Ответ на любой из возникших у меня вопросов я смог найти на
странице Игоря Сысоева в разделе документации nginx.
Буду рад откликам, особенно положительным :)
А что если у пользователей будет закрыт порт 8080?
У нас апач обрабатывает скрипты и слушает порт 80, а nginx статику по 81. Некоторые пользователи стали жаловаться, что ен видят картинок - оказалось что достаточно таких, у кого 81 порт закрыт по тем или иным причинам. Как быть в подобной ситуации?
nginx, как фронтенд, висит на 80 порту и выдает всю статику.
а бакенду передает запросы на 8080 локальный порт для динамики.
т.е. для пользователя должен быть открыт только 80 порт