Настройка Nginx | Losst

nginx

nginx — это HTTP-сервер и почтовый прокси-сервер, разработанный замечательным специалистом Игорем Сысоевым.  Сейчас nginx работает на множестве серверов, в том числе на большинстве серверов Рамблера.

Установка nginx

Переходим в /usr/local:

# cd /usr/local

Создаем директорию:

# mkdir nginx

Переходим в директорию /usr/local/nginx:

# cd nginx

Загружаем дистрибутив:

# wget http://www.sysoev.ru/nginx/nginx-0.7.61.tar.gz

Распаковываем:

# tar zxf nginx-0.7.61.tar.gz

Переходим в директорию nginx-0.7.61:

# cd nginx-0.7.61

Конфигурируем:

# ./configure

Собираем nginx:

# make

Устанавливаем nginx:

# make install

nginx будет установлен в каталог /usr/local/nginx/, директорию nginx-0.7.61 можно удалить.

Конфигурируем Apache

Откройте для редактирования файл /etc/httpd/conf/httpd.conf.

Укажем Apache на просмотр порта 8080, а не 80, для этого строку

Listen 8080

указываем вместо

Listen 80

и добавим строку:

NameVirtualHost *:8080

Необходимо откорректировать по адресу /var/www/vhosts/site.ru/conf/httpd.include или другом файле с описанием VirtualHost-ов на сервер, в файле заменяем:

<VirtualHost [IP-адрес или домен]:80>

на

<VirtualHost *:8080>

Перезапускаем Apache:

# service httpd restart

Реальные IP-адреса

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

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

Переходим в /usr/local/nginx:

# cd /usr/local/nginx 

Загружаем дистрибутив:

# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.5.tar.gz

Распаковываем:

# tar -zxf mod_rpaf-0.5.tar.gz 

Переходим в /usr/local/nginx/mod_rpaf-0.5:

# cd /usr/local/nginx/mod_rpaf-0.5

Устанавливаем

# apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

Или

# apxs2 -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

Добавим строку загрузки модуля в /etc/httpd/conf/httpd.conf:

LoadModule rpaf_module modules/mod_rpaf-2.0.so

и настройки модуля:

# Mod_rpaf settings
RPAFenable On
RPAFproxy_ips 127.0.0.1
# Исключить для версии 1.x
RPAFsethostname On

Параметр RPAFproxy_ips содержит перечень IP-адресов, обслуживаемых nginx. Если адресов несколько, укажите из через пробел, например, RPAFproxy_ips 127.0.0.1 xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy zzz.zzz.zzz.zzz

Внимание! Для nginx 1.x из конфигурации исключается строка RPAFsethostname On

Перезапускаем Apache:

# service httpd restart

Проблемы конфигурирования

Возможно, при конфигурировании возникнет ошибка из-за того, что не найдена та или иная библиотека, например, библиотека PCRE:

./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using —without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using —with-pcre=

Необходимо загрузить PCRE:

# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz

Распаковываем pcre-7.7.tar.gz:

# tar zxf pcre-7.7.tar.gz

Конфигурируем nginx, указывая путь к PCRE:

# ./configure —with-pcre=/usr/local/nginx/nginx-0.7.61/pcre-7.7

Отсутствует apxs или apxs2

Необходимо установить httpd-devel, выполним:

# yum install httpd-devel

Настройка nginx

Конфигурационный файл nginx располагается /usr/local/nginx/conf/nginx.conf

Пример конфигурационного файла:

# Количество процессов рекомендуется устанавливать равному количеству ядер CPU worker_processes 1; events { worker_connections 1024; } # [ debug | info | notice | warn | error | crit ] error_log /var/log/nginx.error_log error; 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; # При большой посещаемости рекомендуется отключить логирование запросов # access_log off; sendfile on; tcp_nopush on; tcp_nodelay on; # Настройки GZIP # http://sysoev.ru/nginx/docs/http/ngx_http_gzip_module.html gzip on; gzip_min_length 1100; # Разрешает или запрещает сжатие ответа методом gzip для проксированных запросов в зависимости от запроса и ответа.

gzip_proxied expired no-cache no-store private auth; # Разрешает сжатие ответа методом gzip для указанных MIME-типов в дополнение к text/html, который сжимается всегда. gzip_types text/plain application/xml application/javascript application/x-javascript text/javascript text/js text/css; # Запрещаем сжатие gzip для IE6 gzip_disable «msie6»; # Уровень gzip-компрессии gzip_comp_level 3; server { listen 80 default; server_name site.ru www.site.ru; # access_log /var/log/httpd/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|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|js)$ { root /var/www/vhosts/site.ru/httpdocs/; } } }

В секции server_name  site.ru www.site.ru; указывается список доменов, которые будут обрабатываться nginx.

nginx берет на себя функции по отдаче статики, например графических файлов. Список расширений указывается в следующем блоке:

# Static files location

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

     root   /var/www/vhosts/site.ru/httpdocs/;

}

Не забудьте указать корректный путь к корневой директории сайта.

Автоматический запуск nginx

Для автоматического запуска добавим строку в /etc/rc.local

/usr/local/nginx/sbin/nginx

Не нашли ответ на свой вопрос в документации? Направьте обращение в или онлайн чат.

Эта заметка в первую очередь предназначена для начинающих разработчиков. Во всяком случае, тех из них, кому еще ни разу не доводилось устанавливать и настраивать Nginx. Цель поста заключается в том, чтобы показать, насколько легко и непринужденно происходит эти самые установка с настройкой, а также что Nginx не нужно бояться и не стоит без лишней необходимости перекладывать его настройку на админов.

Nginx (произносится «энжин икс») — это легковесный веб-сервер (на самом деле, не только веб-), созданный Игорем Сысоевым. Nginx используется дофига где, в том числе в Mail.ru, Яндексе, Рамблере, и великом-великом множестве других высоконагруженных и не очень веб-проектов. Вот далеко неполный список возможных применений Nginx:

  • Ваше приложение умеет HTTP, а вы решили дополнительно прикрутить SSL, gzip или, возможно, SPDY;
  • У вас много приложений, но вы хотите, чтобы все они были на 80-м порту и отвечали за разные URL;
  • Вы хотите быстро раздавать статику;
  • Приложение поднято на разных серверах и вы хотите (1) распределять нагрузку между ними, (2) если один из серверов прилег, успешно отвечать на запросы при помощи оставшихся;
  • Запросы обрабатываются приложением медленно и вы хотите их кэшировать;
  • Написанное вами приложение не умеет логировать HTTP-запросы;
  • Доступ к ресурсу нужно ограничить по логину и паролю, либо по IP;
  • У вас LAMP и при большом числе запросов начинает заканчиваться память (см заметку об оптимизации WordPress);
  • Вы изменили URL ресурса и хотите настроить редирект со старого URL для обратной совместимости;
  • Вам хочется делать все написанное выше одновременно;

Устанавливается Nginx очень просто:

sudoapt-get install nginx
sudo service nginx start
wget localhost:80-O —

Должны увидеть «Welcome to nginx».

Логи запросов и ошибок пишутся в /var/log/nginx/. Конфиги лежат в /etc/nginx/. В подкаталоге sites-available складываются все-все конфиги, даже те, которые вы раньше использовали, а теперь не используете. В sites-enabled складываются используемые конфиги, принято делать их линками на конфиги в sites-available.

После правки конфигов стоит проверить их на наличие синтаксических ошибок:

sudo nginx -t

Nginx умеет перечитывать конфиги без перезапуска. Для этого нужно сказать:

sudo service nginx reload

После reload обязательно проверяйте по логам, нет сыпятся ли какие ошибки:

sudotail-f/var/log/nginx/error.log

Рассмотрим пример. Допустим, вы записываете свой подкаст и решили его раздавать при помощи друплета в DigitalOcean. Тогда вот как примерно будет выглядеть ваш конфиг Nginx:

server {
  listen 80 default_server;
  listen [::]:80 default_server ipv6only=on;
  limit_rate 512k;
  server_tokens off;
  error_page 403 http://devzen.ru/;
  error_page 404 http://devzen.ru/;

  root /var/www;
  index index.html index.htm;

  # Make site accessible from http://localhost/
  server_name localhost;

  location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
  }

По большому счету все, что мы тут говорим Nginx — это (1) слушай порт 80, (2) отдавай файлы со скоростью не больше 512 кбайт в секунду, (3) в случае ошибок 403 или 404 делай редирект на указанный хост, (4) раздавай файлы из каталога /var/www, (5) если пользователь запросил каталог, и в нем есть файл с именем index.html или index.htm, отдавать этот файл. Совсем несложно, правда?

Рассмотрим еще один пример. Допустим, ваше приложение крутиться в AWS и общается с миром при помощи вебсокетов. Вам хочется зашифровать трафик при помощи SSL.

Нет проблем:

map $http_upgrade $connection_upgrade {
  default upgrade;
  » close;
}

upstream websocket {
  server localhost:1234;
}

server {
  listen 443;
  location / {
    proxy_pass http://websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  ssl on;
  ssl_certificate /etc/nginx/nginx.crt;
  ssl_certificate_key /etc/nginx/nginx.key;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
  ssl_prefer_server_ciphers on;

  # see http://nginx.com/blog/improve-seo-https-nginx/
  ssl_session_cache shared:SSL:100m;
  ssl_session_timeout 12h;
}

Здесь мы говрим nginx (1) слушать порт 443 и пробрасывать все запросы на localhost:1234, (2) при пробросе устанавливать заголовок с IP пользователя, (3) включить SSL без дырявого SSLv3, (4) выделить 100 Мб памяти под SSL сессии.

Наконец, последний пример. Ваш REST-сервис крутится в Hetzner, отдает данные в форматах JSON и CSV, а также генерирует бесконечные стримы событий (JSON в chunked transfer encoding). Генерация стримов требует большого количества ресурсов, поэтому их вы хотите пробросить на отдельное множество машин. Также вы хотите сжимать трафик при помощи gzip.

Соответствующих конфиг:

upstream service_default {
  server localhost:1234;
}

map _ $service_upstream {
  default service_default;
}

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

server {
  listen 80;
  chunked_transfer_encoding on;
  proxy_buffering off;
  tcp_nodelay off;
  proxy_read_timeout 1800;
  proxy_send_timeout 1800;

  location ~* ^/api/.*/streams/.*$ {
    proxy_pass http://$service_upstream;
    proxy_next_upstream timeout http_500 http_502 http_503;
    proxy_redirect off;
    proxy_connect_timeout 30s;
  }

  location / {
    proxy_pass http://localhost:1234;
  }

  gzip on;
  gzip_comp_level 6;
  gzip_proxied any;
  gzip_types application/json application/x-json-stream;
}

Полагаю, к этому моменту вы уже сами можете понять, о чем идет речь. В случае чего обращайтесь к официальной документации по Nginx, она классная и в ней все есть. Также обратите внимание на официальные списки рассылки.

Собственно, это все, о чем я хотел поведать. А как вы используете Nginx?

Дополнение: Чтобы Nginx не раскрывал информацию об операционной системе и своей версии, нужно в nginx.conf добавить в блоке .

Дополнение:Настройка HTTPS с сертификатами Let’s Encrypt

Метки: Linux.

Я занимаюсь разработкой сайтов на node.js, поэтому давно ушёл от Apache. Поначалу использовал сам node.js в качесте веб-сервера, но это неправильно, да и не очень удобно отдавать им статику.

Недавно мне понадобилось разместить на том же сервере этот блог, а WordPress работает на PHP — значит, нужно каким-то образом их связывать.

Вариант с проксированием через nginx запросов в апач отпал почти сразу — nginx должен работать на 80 порту, а апач соответственно на каком-то другом. Однако, вордпресс по каким-то причинам не работает на портах, отличных от 80 и 443. К тому же, сервер у меня слабенький, и я не могу позволить себе роскошь держать два запущенных веб-сервера.

Поэтому пробуем другую конфигурацию: nginx работает на 80 порту, и сам обрабатывает PHP вместо Apache. Запросы к блогу он будет отправлять в PHP-код через враппер fast_cgi, а запросы к node.js-сайту — отправлять в node.js.

Я пытался сделать это в течение трёх дней, находил странные сложные решения, но в итоге нашёл простой выход.

sudo apt-get update sudo apt-get install nginx php5-fpm sudo nano /etc/php5/fpm/php.ini #cgi.fix_pathinfo=0 #https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager sudo add-apt-repository ppa:chris-lea/node.js sudo apt-get update sudo apt-get install python-software-properties sudo apt-get install nodejs sudo apt-get install php5 phpmyadmin sudo mkdir /var/www sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin #Теперь есть nginx, nodejs, php и php5-fpm. Ставим wordpress (+mysql) sudo apt-get install mysql-server php5-mysql

В nginx создаём файл конфигурации блога:

sudoedit /etc/nginx/sites-enabled/wordpressserver { listen 80; root /var/www; index index.php index.html index.htm; server_name catethysis.ru; location / { try_files $uri $uri/ /index.php?q=$uri&$args; } error_page 404 /404.html; error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/www; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9$ location ~ .php$ { #fastcgi_pass 127.0.0.1:9000; #With php5-fpm: fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }

И файл конфигурации сайта:

sudoedit /etc/nginx/sites-enabled/novokosinoserver { listen 80; server_name novokosino.tk; root /var/www; index index.php index.html index.htm; # server_name 129.168.1.10; location / { # IP и порт, на которых висит node.js proxy_pass http://localhost:7880; proxy_set_header Host $host; } }

Перезагружаем сервера:

sudo service php5-fpm restart sudo nginx -s reload

Не забудьте добавить соответствующие записи в DNS. Всё работает.

Добавить комментарий

Закрыть меню