← На главную

Установка и настройка Nginx, пара несложных примеров

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

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

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

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

sudo apt-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 обязательно проверяйте по логам, не сыпятся ли какие ошибки:

sudo tail -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 добавить server_tokens off; в блоке http {.

Дополнение: Вас также могут заинтересовать статьи Настройка HTTPS с сертификатами Let’s Encrypt и Памятка по использованию WebDAV.