Страница 1 из 1

Установка Nginx

Добавлено: 2007-10-20 21:55:10
Toptyg
Заинтересовался идей создания "легкого" веб сервера для посещаемого портала с большим количеством статики, также будут присутствовать php скрипты.

Для решения задачи я решил использовать Nginx. Подробно о нем можно почитать http://sysoev.ru и http://blog.kovyrin.net/2006/04/04/ngin ... eb-server/

Я лишь расскажу об установке и приведу примеры простых конфигураций под FreeBsd.

Итак, установка

Код: Выделить всё

cd /usr/ports/www/nginx
make install clean 
Первый пример конфига nginx я приведу в случае его работы в качестве сервера прокси. Для этого у меня еще собран apache, + php-fastcgi.

Апач я перевешиваю с 80 порта на 8081 и изменяю конфиг Nginx

Код: Выделить всё

cd /usr/local/etc/nginx
cp nginx.conf nginx.conf.old 
Изменим nginx.conf

Код: Выделить всё

worker_processes 1;
error_log /var/log/nginx/error.log debug;
pid nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 localhost:80;
server_name localhost;


location / {
proxy_pass http://localhost: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;
}

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

}
}
Можно изменить значение root /var/www/; на расположение своего сайта, также указать свои пути для логов, убедиться в их существовании.

запуск nginx для автоматического запуска в /etc/rc.conf

Код: Выделить всё

nginx_enable="YES"
теперь две конфигурации, без использования Апача.

Первая и использованием php fast-cgi черз сокет
(взято из рассылки freebsd)
Для этого создадим скрипт

/usr/local/etc/rc.d/phpFcgid.sh
со следующим содержимым
#!/bin/sh

# PROVIDE: phpFcgid
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="phpFcgid"
rcvar=`set_rcvar`

load_rc_config $name
: ${phpFcgid_enable="NO"}
: ${phpFcgid_users="www"}
: ${phpFcgid_children="2"}

start_cmd=phpFcgid_start
stop_cmd=phpFcgid_stop

phpFcgid_start() {
echo "Starting $name."
export PHP_FCGI_CHILDREN=${phpFcgid_chidlren}
for user in ${phpFcgid_users}; do
socketdir="/tmp/.fastcgi.${user}"
mkdir -p ${socketdir}
chown ${user}:www ${socketdir}
chmod 0750 ${socketdir}
su -m ${user} -c "/usr/local/bin/php-cgi -b ${socketdir}/socket&"
done
}

phpFcgid_stop() {
echo "Stopping $name."
pids=`pgrep php-cgi`
pkill php-cgi
wait_for_pids $pids
}

run_rc_command "$1"

Добавим в
/etc/rc.conf

Код: Выделить всё

phpFcgid_enable='yes'

Изменим и сам конфиг Nginx
worker_processes 1;
error_log /var/log/nginx/error.log debug;
pid nginx.pid;

events {
worker_connections 1024;
}

http {
include 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 localhost:80;
server_name localhost;
root /var/www;
access_log /var/log/nginx/access.log;
index index.php;

location ~ .*\.php$ {
include /usr/local/etc/nginx/fastcgi_params;

fastcgi_pass unix:/tmp/.fastcgi.www/socket;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
}


}
}
Третий вариант конфигурации приведу для работы с php через порт

Код: Выделить всё

worker_processes 1;
error_log /var/log/nginx/error.log debug;
pid nginx.pid;

events {
worker_connections 1024;
}

http {
include 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 localhost:80;
   server_name localhost;
   root /var/www;
   access_log /var/log/nginx/access.log;
   index index.php;

   location ~ .*\.php$ {
     include /usr/local/etc/nginx/fastcgi_params;
     
     fastcgi_pass 127.0.0.1:8888;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
   }


}
}
также как и во второй конфигурации значение пути /var/www и порта 8888 можно сменить на свои.

Ну а скрипт запуска php такой fphp.sh

Код: Выделить всё

#!/bin/sh

killall php

PHPFCGI="/usr/local/bin/php-cgi"

echo "Run php4 fastcgi server on port 8888"
export PHP_FCGI_MAX_REQUESTS=1000
#export PHP_FCGI_CHILDREN=5
export FCGI_WEB_SERVER_ADDRS=127.0.0.1
/usr/local/bin/sudo -u www $PHPFCGI -c /usr/local/etc/php.ini -b 127.0.0.1:8888 2>/dev/null >/dev/null &
запускаем скрипт ./fphp.sh
запускаем #nginx

Радуемся скорости работы.

Re: Установка Nginx

Добавлено: 2007-10-20 23:23:35
askon
Toptyg писал(а):

Код: Выделить всё

listen localhost:80;
Лучше сразу писать, что конфиг не реальный, не вижу особой радости проксировать с локалхоста на локалхост :wink:
5 копеек вставлю, если nginx будет проксировать на апач, желательно такое сделать:

Скачиваем и устанавливаем mod_rpaf - качаем отсюда -> http://stderr.net/apache/rpaf/
mod_rpaf - аналог mod_realip для 1го апача, позволяет писать в логи IP клиентов а не IP прокси, в нашем случае nginx.
В распакованном архиве будет файлик mod_rpaf-2.0.c, делаем:

Код: Выделить всё

#apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
После этого он установится как модуль.
Добавляем в httpd.conf:

Код: Выделить всё

LoadModule rpaf_module libexec/apache2/mod_rpaf-2.0.so
И правим mod_rpaf.conf, который будет у нас автоматом инклудится потом конфигом апача,
cat mod_rpaf.conf:
#Configuration Directives:
RPAFenable On
# Enable reverse proxy add forward
RPAFproxy_ips 127.0.0.1
# which ips are forwarding requests to us
RPAFsethostname On
# let rpaf update vhost settings
# allows to have the same hostnames as in the "real"
# configuration for the forwarding Apache

Re: Установка Nginx

Добавлено: 2007-10-21 8:56:31
Alex Keda
ну, если пробовал на десктопе - почему бы и н еработать локалхосту?

Re: Установка Nginx

Добавлено: 2007-10-21 10:31:03
Toptyg
хех, конфиги взял со своей машины. Конфигурация для продакшен сервера думаю у каждого будет своя :). Мне ,например, нравится цмс Drupal сейчас затачиваю все под него (пример nginx.conf для него можно взять с офф сайта друпала).

Хотелось рассказать про установку и показать виды различных конфигураций. Также не стал говорить о разнице производительности между nginx и апачем (: (у меня где-то 1.5 - 2.5 раза при отдаче статики) т.к. все это зависит от задачи и тюнингованости.

Re: Установка Nginx

Добавлено: 2007-10-21 12:40:28
askon
Когда пробовал ab гонять на локалхосте и по сети - значения существенно отличались, для скоростей с nginx/с php акселератором/nginx+акселератор/чистый apache. Для локалхоста они были слишком уж радужными, а по сетке соотношения скоростей совсем другие были уже, причем никакой пропорции не сохранялось :?

Re: Установка Nginx

Добавлено: 2007-10-21 19:40:16
Toptyg
Когда пробовал ab гонять на локалхосте и по сети - значения существенно отличались
само-сабой )
Nginx как я считаю следует использовать на довольно - таки нагруженных серверах когда клиентов много и апач с модом пхп загибается тк ему трудно выполнять новые скрипты и в тоже время отдавать медленными клиентам ну и он по-меньше памяти ест.

Для тестов я юзаю ApacheBanch, httperf.

Re: Установка Nginx

Добавлено: 2007-10-21 22:17:22
paix
;)
приятно что тема развивается, но в продакщин пока не тянет.. ;)

Некоторая конструктивная критика:
Для связки нжинкс - фастцжи.

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

Например, весьма переспективная разработка: php-fpm
или на крайняк - spawn-fcgi из комплекта lighttpd.

Особенно, понимание этого наступает, когда используем несколько разных виртуалхостов, и пхп хотим запускать от соотвествующих пользователей, с соотвествующими конфигами и настройками.

Re: Установка Nginx

Добавлено: 2008-01-21 17:06:26
максим
Ошибка в конфиге. Отдача статики. Регулярное выражение неправильно, забыл '\'

Re: Установка Nginx

Добавлено: 2008-01-21 23:51:49
paranoidchaos
nginx+apache(backend) нормульное решение отдавая всю статику на nginx а пхп пусть апач обрабатывает