nginx: избавляемся от localhost:XXXX

Наконец-то дошли руки поставить nginx на тестовый сервер, что позволило избавиться от всех этих kavaleu-al:1080, kavaleu-al:8500, kavaleu-al:3000. TeamCity-серверу повезло еще больше, он получил свой собственный субдомен teamcity.kavaleu-al вместо “стыдного” kavaleu-al:8080

Что я люблю в современном IT, так это то, что большинство вещей решаются за 10-20 минут по принципу “нашел”, “поставил”, “настроил” и все работает. Про nginx я знал очень давно, так что “искать” его не пришлось. Тем более, что мне уже давно мозолит статья про него. Ставится он за 5 минут. Ну и настройка у него тоже простая. Хотя мне пришлось повозиться (20 минут, не больше). Зато сейчас я абсолютно довольный слон. Но обо всем по порядку.

Я ставил nginx на винду, поэтому буду рассказывать про нее. Установка его на линуксе, конечно же отличается, но там тоже ничего сложного (sudo apt-get install nginx). Уверен, вы разберетесь.

У версии под винду есть особенность. Она, как говорят разработчики, не быстрая (что для тестового сервера не важно):

В настоящий момент в качестве метода обработки соединений используется только select(), поэтому не стоит ожидать высокой производительности и масштабируемости.

Шаг 1: Установка

Скачиваем дистрибутив. Распаковываем его в нужную вам папку. И запускаем.

cd c:\
unzip nginx-1.5.8.zip
cd nginx-1.5.8
start nginx

Идем браузером на localhost и, вуаля, видим Welcome to nginx!. Значит мы все сделали верно.

Если же во время старта nginx ругается на то, что не может забиндитться на 80 порт (типа не хватает прав), то дело, скорее всего, в том, что кто-то уже этот порт себе забрал. В моем случае это был Скайп. Отбираем у него 80й порт и nginx заводиться как молодой (дело тут явно не правах, у меня UAC затянут по максимуму, но все равно не ругается, скорее все сообщение о правах досталось нам от линуксовой версии, там нужен рут для портов ниже 1024).

Шаг 2: Настройка

Открываем файл nginx.conf (в папке conf) и находим секцию another virtual host using mix of. Изменяем ее как-то так:

server {
    listen       80;
    server_name  teamcity.kavaleu-al;

    location / {
        proxy_pass http://localhost:8080/;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
    }
}

Из ключевых вещей тут listen 80 и server_name teamcity.kavaleu-al (все входящие соединения на teamcity.kavaleu-al:80 обрабатывать этой секцией) и proxy_pass http://localhost:8080/ (перенаправлять все запросы на http://localhost:8080/).

Вместо виртуального хоста (субдомена) можно было настроить “папку” на основном хосте, например kavaleu-al/teamcity/ Для этого поднимаемся к основному серверу и добавляем ему новый локэйшен (я сделал это для своего ColdFusion сервера).

location /sop/ {
    proxy_pass http://localhost:8500/sop/;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
}	

Чтобы браузер узнал о teamcity.kavaleu-al, нужно править файл hosts, добавив туда заодно и kavaleu-al

127.0.0.1   kavaleu-al
127.0.0.1   teamcity.kavaleu-al

Теперь просим nginx перечитать конфиг nginx -s reload. Заходим на http://kavaleu-al/sop и http://teamcity.kavaleu-al и радуемся успеху.

Если радоваться нечему (а у меня так и было :( ), то не отчаиваемся. Берем волшебную команду nginx -t и смотрим что-то же мы сделали не так.

Шаг 3: Автозапуск nginx

nginx дистрибутив не содержит виндовых сервисов, поэтому нужно поместить команду start nginx в автозагрузку. Для девелоперской машины автозагрузка лучшее места. Но вот для сервера этот способ может оказаться неудачным. Так как сервер стартует и работает без пользователя. Т.е. не для кого выполнить автозагрузку.

Я поместил start nginx в Scheduled Jobs, можно было бы создать из команды start nginx сервис. Благо утилит в инете валом. Вроде даже, стандартная виндовая команда для этого есть. Но лучшее враг хорошего и я остановился на Планировщике.

Ура!

Вот, в принципе, и все. Ничего сложного. Писать оказалось в разы дольше, чем настраивать.

Еще раз напоминаю о волшебной команде nginx -t. Если у вас не запускается nginx эта команда расскажет почему. Мне она сильно помогла.