====== Установка nginx на Ubuntu Server из исходников ======
Дано: Ubuntu Server 10.04.1 LTS x64. Версия из пакета nginx-0.7.65-1ubuntu2, а в природе есть уже и постарше (на момент написания заметки была nginx-1.0.3).
Задача: установить nginx, переложить на него отдачу статического контента (картинок, документов и прочего).
Так как в репозитории слишком уж старая версия, будем ставить руками. Поехали.
**Примечание**: есть PPA здесь - https://launchpad.net/~nginx/+archive/stable
===== Установка оригинального пакета =====
Для начала надо установить оригинальный пакет - в нем есть ценный сценарий запуска и конфигурационные файлы (они помогут сократить время настройки). Затем его удаляем чтобы не мешался.
# sudo apt-get install nginx
# sudo apt-get remove nginx
===== Сборка из исходников =====
Проверяем зависимости, какие же пакеты нужны для сборки.
# sudo aptitude show nginx | grep Depends
Depends: libc6 (>= 2.4), libpcre3 (>= 7.7), libssl0.9.8 (>= 0.9.8k-1), zlib1g
Ставим нужные пакеты:
# sudo apt-get install libc6-dev libpcre3-dev libssl-dev zlib1g-dev
Качаем nginx, разворачиваем, заходим в папку:
# mkdir /usr/src/nginx
# cd /usr/src/nginx
# wget http://sysoev.ru/nginx/nginx-1.0.3.tar.gz
# tar xvf nginx-1.0.3.tar.gz
# cd nginx-1.0.3/
Задаем некоторые опции для сборки. Пояснение: я люблю когда все лежит по местам и вообще "красота". Бинарник поместим в /usr/local/sbin чтобы он не пересекался с бинарником из пакета, вдруг таковой будет случайно установлен. Ну и --with-http_ssl_module пригодится. Работать nginx будет у нас под стандартным пользователем www-data:www-data
# ./configure --sbin-path=/usr/local/sbin \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/nginx-error.log \
--http-log-path=/var/log/nginx/nginx-http.log \
--pid-path=/var/run/nginx.pid \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--user=www-data \
--group=www-data
Просмотрим отчет, убедимся что все правильно:
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1 library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/sbin"
nginx configuration prefix: "/etc/nginx"
nginx configuration file: "/etc/nginx/nginx.conf"
nginx pid file: "/var/run/nginx.pid"
nginx error log file: "/var/log/nginx/nginx-error.log"
nginx http access log file: "/var/log/nginx/nginx-http.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
Собираем
# make
Устанавливаем
# sudo make install
===== NAXSI =====
NAXSI = **N**GINX **A**NTI **X**SS & **S**QL **I**NJECTION
Проще говоря, это файрвол веб-приложений (WAF) для NGINX, помогающий в защите от XSS, SQL-инъекций, CSRF, Local & Remote file inclusions.
Отличительными особенностями его являются быстрота работы и простота настройки. Это делает его хорошей альтернативой например mod_security и апачу.
Статья по теме: http://habrahabr.ru/post/145241/
==== Установка ====
Из репозиториев:
# sudo apt-get install nginx-naxsi
Из исходников:
# wget http://nginx.org/download/nginx-x.x.xx.tar.gz
# wget http://naxsi.googlecode.com/files/naxsi-x.xx.tar.gz
# tar xvzf nginx-x.x.xx.tar.gz
# tar xvzf naxsi-x.xx.tar.gz
# cd nginx-x.x.xx/
# ./configure --add-module=../naxsi-x.xx/naxsi_src/ [тут ваши опции для nginx]
# sudo make
# sudo make install
==== Настройка ====
Набор правил: http://code.google.com/p/naxsi/source/browse/trunk/naxsi_config/naxsi_core.rules
Раскомментируем в конфигурации nginx включение базовых запретительных правил
include /etc/nginx/naxsi_core.rules;
Теперь добавим в конфигурацию виртуального хоста желаемые настройки (рекомендую вынести их в отдельный файл и подключать через include):
LearningMode;
SecRulesEnabled;
DeniedUrl "/RequestDenied";
#include "/etc/nginx/mynaxsi.rules";
## check rules
CheckRule "$SQL >= 8" BLOCK;
CheckRule "$RFI >= 8" BLOCK;
CheckRule "$TRAVERSAL >= 4" BLOCK;
CheckRule "$EVADE >= 4" BLOCK;
CheckRule "$XSS >= 8" BLOCK;
Разберем подробней, что значат эти команды:
* LearningMode — включен режим обучения. Запросы не блокируются, формируется вайт-лист.
* SecRulesEnabled — NAXSI включен для данной локации. Если захотим выключить для другой локации (например, защищенной внутренней зоны), то делаем в ней SecRulesDisabled.
* DeniedURL — URL редиректа для запрещенных запросов.
* CheckRule — проверка “штрафных очков” запроса по категориям.
* /etc/nginx/mynaxsi.rules — сгенерированные правила (пока не сгенерили — закомментированные).
===== Подготавливаемся к запуску =====
Все, сборка закончена, теперь надо подготовиться к запуску
Создаем папку для логов:
# sudo mkdir /var/log/nginx
Правим скрипт запуска: в файле /etc/init.d/nginx меняем строку DAEMON на
DAEMON=/usr/local/sbin/nginx
Все, можно запускаться и пробовать:
# sudo service nginx start
Если конфигурационный файл лежит на месте, все должно заработать.
===== Конфигурируем =====
**Преамбула**: у меня живет несколько виртуальных хостов в Апаче, это необходимо учесть при настройке. Конфигурационные файлы живут в /etc/apache2/sites-available - так проще их настраивать.
Для того, чтобы в логах Апача писались реальные IP-адреса, а не 127.0.0.1 (на котором он будет висеть), требуется установить модуль rpaf:
# sudo apt-get install libapache2-mod-rpaf
# sudo a2enmod rpaf
Проверяем что у нас в /etc/apache2/mods_available/rpaf.conf
# cat rpaf.conf
RPAFenable On
RPAFsethostname On
#RPAFproxy_ips 127.0.0.1
RPAFproxy_ips 127.0.0.1 realip [realip1]
**Объяснялки**: Для того, чтобы прикрутить несколько виртуалхостов апача делается следующее:
* Каждый виртуалхост апача должен висеть на адресе 127.0.0.1:номер_порта, именно туда и подключается nginx, получив запрос
* В /etc/apache2/ports.conf заводится требуемое кол-во портов (по 1 на виртуалхост)
* В конфиге каждого виртуалхоста при помощи директивы VirtualHost выставляется требуемый адрес и порт
* В конфиге nginx прописывается каждый домен
**Примеры** - внимание, это очень простые болванки, а не рабочие файлы!
/etc/apache2/ports.conf :
#Listen 80
Listen 127.0.0.1:8081
Listen 127.0.0.1:8082
/etc/apache2/sites-available/site1 :
# Это нужно если стоит модуль mpm_itk_module - для запуска каждого виртуалхоста
# под своим пользователем
AssignUserId site1com site1com
ServerName site1.com
ServerAlias www.site1.com
ServerAdmin admin@site1.com
DocumentRoot /var/www/site1.com
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
ErrorLog /var/log/apache2/site1.com-error.log
CustomLog /var/log/apache2/site1.com-access.log combined
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
/etc/apache2/sites-available/site2 :
# Это нужно если стоит модуль mpm_itk_module - для запуска каждого виртуалхоста
# под своим пользователем
AssignUserId site2com site2com
ServerName site2.com
ServerAlias www.site2.com
ServerAdmin admin@site2.com
DocumentRoot /var/www/site2.com
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
ErrorLog /var/log/apache2/site2.com-error.log
CustomLog /var/log/apache2/site2.com-access.log combined
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
/etc/nginx/nginx.conf :
user www-data;
worker_processes 3;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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;
tcp_nodelay on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
gzip_min_length 1000;
gzip_buffers 16 8k;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain application/xml application/x-pointplus application/x-javascript text/css;
gzip_comp_level 5;
gzip_disable "MSIE [1-6]\.(?!.*SV1)"; # do not compress for IE1-6
# site1.com
server {
listen 80;
server_name www.site1.com site1.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://127.0.0.1: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;
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 256;
client_max_body_size 40m;
client_body_buffer_size 256k;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Отдача картинок
# 1. Если картинка лежит в папке product, забрать ее через Apache - там скриптом наложится watermark
location ~* "product"
{
root /var/www/site1.com;
proxy_pass http://127.0.0.1:8081;
proxy_redirect off;
access_log off;
}
# 2. Все остальные картинки отдаем напрямую
location ~* \.(jpg|jpeg|gif|png|ico|zip|tar|tgz|gz|bz2|rar|doc|xls|exe|pdf|ppt|txt)$
{
root /var/www/site1.com;
access_log off;
}
}
}
# site2.com
server {
listen 80;
server_name www.site2.com site2.com;
#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;
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 256;
client_max_body_size 40m;
client_body_buffer_size 256k;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;
proxy_buffer_size 64k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location ~* \.(jpg|jpeg|gif|png|ico|zip|tar|tgz|gz|bz2|rar|doc|xls|exe|pdf|ppt|txt)$
{
root /var/www/site1.com;
access_log off;
}
}
}
===== Ссылки =====
* Домашняя страничка nginx - http://sysoev.ru/