Непонятки с binary_remote_addr
Доброго времени суток! Передаю в php два заголовка: proxy_set_header 'User-IP' $remote_addr; proxy_set_header 'BIN-IP' $binary_remote_addr; Соответственно, на стороне php ловлю их: $_SERVER ['HTTP_USER_IP'] $_SERVER ['HTTP_BIN_IP'] Параллельно пишу значение $binary_remote_addr в лог nginx. В логе nginx все правильно: \xC0\xA8\x00\xC8 (мой IP 192.168.0.200) В php: * Конвертирую первый заголовок в bin, затем в hex. На выходе правильно: string(8) "c0a800c8" * Конвертирую второй заголовок в hex (т.к. он уже bin). На выходе: string(4) "c0a8" Собственно, все. Тупняк. Ткните носом, плз, куда делась половина второго заголовка? Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Upstream и заголовок Host
Доброе время суток! Тестовый сервер: test.local. В нем тестовый кластер: upstream cdn { server :; server :; } или: upstream cdn { server cdn001.test.local:; server cdn002.test.local:; } Не принципиально, ибо "cdn001.test.local" резолвится в и т.д. Само собой, "proxy_http_version 1.1;" и из какого-то локейшена "proxy_pass http://cdn;; Теперь смотрю, что приходит, например, на выбранный бэкенд. Ожидаю там увидеть в заголовке Host значение или 'cdn###.test.local'. Вижу: http header: "Host: cdn". Что не так? Входящий контроль проверяет правильность заголовка Host. Все, что не соответствуют разрешенным, посылаются на 400. Можно, конечно, добавить фильтрацию по белому списку, что-то типа "такой-то IP должен прислать такой-то заголовок". Но (ИМХО) костыль. proxy_set_header 'Host' $upstream_addr; - бесполезно. $upstream_addr получает значение ПОСЛЕ proxy_pass. Попутно вопрос о $upstream_addr. Ее можно еще как-то использовать, кроме как в логах? Например, отправить в php, но без костылей? Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Вопрос о балансировке нагрузки.
Доброе время суток! Существует ли в принципе возможность получить в какую-то переменную имя бэкенд-сервера, выбранное в директиве upstream? Задача такая. Есть основной сервер example.com, на котором: nginx <=> php <=> БД и несколько бэкендов-хранилок в том же домене, но в разных ДЦ (допустим, s1.example.com, s2.example.com и т.д.) Соответственно: upstream backends { server s1.example.com; server s2.example.com; server s3.example.com; . } Пользователь авторизуется на основном сервере, получает сессию и куки. Каждому пользователю выдаются куки с одинаковами именами, но разными значениями. Кроме того, для каждого пользователя создаются хэши, привязанные к его сессии и кукам. Требуется отдать с ОСНОВНОГО сервера html, содержащую ссылки вида: - для пользователя A - , - для пользователя B - , После чего каждый из них тянет нужный файл с выбранной хранилки. Т.е. не пробрасывать запрос на хранилку через proxy_pass backends, а только получить имя бэкенда, выбранного с учетом правил в upstream. И получив это имя в какую-то переменную, передать его в php, отвечающий за выдачу html страницы из соответствующего локейшена. Заранее благодарю за любые конструктивные идеи. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Странная ситуация с levels
Да, спасибо. До переименования зоны я уже догадался. Но не сразу заметил. Экспериментировал с довольно сложным SSI, пришлось часто заглядывать в кэш, многоуровневый оказался неудобен, переключил в один уровень, вот только тогда. Потом уже полез в дебаг. Себе в шпаргалку на заметку. Но все-таки, неплохо было бы сказать в доке о рестарте (ИМХО). >Пятница, 9 ноября 2018, 16:34 +03:00 от Maxim Dounin : > >Hello! > >On Fri, Nov 09, 2018 at 10:18:30AM +0300, CoDDoC wrote: > >> nginx-debug -v >> nginx version: nginx/1.15.6 >> >> Специально обновился, до этого была версия 1.13.12, там то же самое. >> Изменение levels в proxy_cache_path применяется только после полного >> рестарта (service nginx-debug restart) >> nginx-debug -s reload ожидаемого результата не дает >> >> Как воспроизвести: >> 1. В контексте http: >> proxy_cache_path /var/www/html/cache levels=1:2:1 use_temp_path=off >> keys_zone=testcache:5m inactive=10m max_size=50m; >> 2. service nginx-debug restart >> 3. В error.log: >> cache manager process exited with code 0 >> start cache manager process >> start cache loader process >> 4. Делаю запрос в локейшен, для которого активирована зона testcache >> 5. Получаю ожидаемое: >> /var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053 >> 6. Удаляю ветку '3/05/8/e62d74fdc44e220f0225168323c28053' >> >> 7. Меняю levels 1:2:1 -> levels 1 >> 8. nginx-debug -s reload >> 9. В error.log: >> cache "testcache" had previously different levels >> 10. Запрос в тот же локейшен дает тот же результат: >> /var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053 >> 11. Опять удаляю '3/05/8/e62d74fdc44e220f0225168323c28053' >> 12. service nginx-debug restart >> 13. В error.log: >> cache manager process exited with code 0 >> start cache manager process >> start cache loader process >> 14. Запрос в тот же локейшен опять дает ожидаемое: >> /var/www/html/cache/3/e62d74fdc44e220f0225168323c28053 >> >> Если это нормальное поведение, может, имеет смысл как-то отметить в >> документации необходимость рестарта? > >Это нормальное поведение. > >Многие вещи, работа с которыми происходит через зоны разделяемой >памяти из всех процессов, поменять без пересоздания зоны >разделяемой памяти - нельзя. Наиболее банальный пример - нельзя >поменять собственно размер зоны разделяемой памяти. > >В чуть более сложных случаях - нельзя менять параметры, которые >меняют поведение рабочих процессов на несовместимое с другими >рабочими процессами или с уже имеющейся в разделяемой памяти >информацией. В частности, levels в кэше - определяют, в каком >именно виде лежат данные на диске, и каким именно файлам на диске >соответствуют элементы в разделяемой памяти. То есть поменять >levels просто так нельзя - фактически, надо выкинуть из памяти всю >информацию, которая становится негодной, и презагрузить содержимое >кэша заново. Кроме того, всё ещё осложняется тем, что у нас есть >старые рабочи процессы, которые могут работать неопределённо >долго, и эти рабочие процессы предполагают старое значение levels, то >есть если мы таки выкинем и перезагрузим содержимое разделяемой >памяти - начнут вести себя некорретно они. > >Чтобы подобных проблем не возникало - при применении новой >конфигурации nginx проверяет, что конфигурация совместима с тем, >как использовались зоны разделяемой памяти ранее. И если >обнаруживает, что попытались поменять что-то, что менять нельзя - >логгирует соответствующую ошибку в error log, и откатывается к >старой конфигурации. > >Если тем не менее хочется соответствующие параметры поменять, то >это можно сделать одним из следующих способов: > >- Переименовать зону разделяемой памяти (в случае кэша - лучше > при этом заодно задать новый путь), и использовать её в > конфигурации с новыми параметрами. При таком изменении > конфликтов между старой и новой конфигурацией не будет, можно > будет сделать reload. И при этом сохранится содержимое > остальных зон разделяемой памяти, конфигурацию которых не меняли. > >- Сделать binary upgrade. При этом все зоны разделяемой памяти будут > созданы заново, однако потерь запросов не будет. > >- Ну и собственно сделать restart. Всё тоже заработает с новой > конфигурацией, но смысла в этом приблизительно никакого - binary > upgrade даст тот же результат, но без потери запросов. > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Странная ситуация с levels
nginx-debug -v nginx version: nginx/1.15.6 Специально обновился, до этого была версия 1.13.12, там то же самое. Изменение levels в proxy_cache_path применяется только после полного рестарта (service nginx-debug restart) nginx-debug -s reload ожидаемого результата не дает Как воспроизвести: 1. В контексте http: proxy_cache_path /var/www/html/cache levels=1:2:1 use_temp_path=off keys_zone=testcache:5m inactive=10m max_size=50m; 2. service nginx-debug restart 3. В error.log: cache manager process exited with code 0 start cache manager process start cache loader process 4. Делаю запрос в локейшен, для которого активирована зона testcache 5. Получаю ожидаемое: /var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053 6. Удаляю ветку '3/05/8/e62d74fdc44e220f0225168323c28053' 7. Меняю levels 1:2:1 -> levels 1 8. nginx-debug -s reload 9. В error.log: cache "testcache" had previously different levels 10. Запрос в тот же локейшен дает тот же результат: /var/www/html/cache/3/05/8/e62d74fdc44e220f0225168323c28053 11. Опять удаляю '3/05/8/e62d74fdc44e220f0225168323c28053' 12. service nginx-debug restart 13. В error.log: cache manager process exited with code 0 start cache manager process start cache loader process 14. Запрос в тот же локейшен опять дает ожидаемое: /var/www/html/cache/3/e62d74fdc44e220f0225168323c28053 Если это нормальное поведение, может, имеет смысл как-то отметить в документации необходимость рестарта? Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[6]: Запуск php скриптов из разных директории
Не знаю насчет бредовости, но такое ощущение. что вы не совсем четко ее понимаете для себя. 1. Пользак - админ на своем ВПС. Вы - админ хоста. 2. Если пользак имеет доступ ФТП к директории /home/admin на ВПС, он может слить себе любой пхп файл. Другой вариант, как он может это сделать - если у него есть шелл. Но вы можете положить пхп в '/home/user', а фтп дать '/home/user/ftp'. Технически, не важно, какие запросы делает пользак. Точнее, он может делать запросы, только разрешенные админом. Важно, чтобы для всех правильных (с вашей точки зрения) запросов существовали локейшены. Тогда все запросы, для которых не нашлось подходящего локейшена считаем не правильными. Я обычно для таких заходов создаю мусорку типа: location "" { return 404 ;} Ее можно и логировать отдельно при желании. 3. Считаем, что пользак имеет ФТП только на '/home/user' , выше не поднимается. Вам нужно дать ему админку ЦМС, которая лежит в '/home/admin'. Т.е. пользак делает входящий запрос как /user и получает ответом хтмл - результат работы /home/admin/index.php .Но запрос может быть и такой: /admin/index.php, тогда беда. Для этого и нужно проксировать запрос на бэкенд. Я ж вам сразу сказал изучайте location, rewrite, map и регексы. Простой пример. Допустим, входящий запрос /user На него нужно дать ответом хтмл как результат работы /admin/index.php location /user { rewrite "^/user$" /admin/index.php break; try_files $uri =404 ; proxy_pass <здесь ваш бэкенд>; } "^/user$" в кавычках, потому что здесь возможны варианты (реальный формат запроса, параметры и т.п.). В довесок, для явного указания htm или php в запросе: location ~ (\.html$|\.php$) { internal; } >Пятница, 29 июня 2018, 17:36 +03:00 от al3x < nginx-fo...@forum.nginx.org >: > >Я уже начинаю думать, что у меня какая-то бредовая идея... еще немного и я >откажусь от нее =) >Не знаю как еще объяснить, но попробую... > >Есть файлы CMS: >/home/admin/index.php >/home/admin/modules/module.php >/home/admin/template/news.html >/home/admin/template/style.css > >Директория юзера: >/home/user/ - у юзера есть доступ только к этой директории. > >При обращении по IP сервера nginx сначала смотрит в /home/user/ и если не >находит там index.php, то смотрит в /home/admin/index.php и отдает его. > >Далее /home/admin/index.php выполняет свою работу и хочет обработать файл >template/news.html. Nginx должен проверить, нет ли этого файла в директории >юзера /home/user/template/news.html и если есть, то отдать его. Если этого >файла нет, то отдать из папки /home/admin/template/news.html > >Затем юзер захотел создать свой личный модуль и положил его в папку >/home/user/modules/new_module.php >и когда /home/admin/index.php загружает модули из папки /modules/ то nginx >должен сначала проверить все файлы в директории юзера /home/user/modules/, а >затем здесь /home/admin/modules/ и таким образом подгрузить для PHP все >модули из двух директорий, словно из одной. > >Т.е. директории должны быть как бы зеркалами друг друга. > >Это возможно сделать? > >Dmitriy Lyalyuev Wrote: >--- >> Может я чего не понимаю, но может стоит сделать локейшн типа >> /user_content >> и рут выставить в хомяк юзера? >> Туда же и ФТП пусть смотрит с ограничением юзера в этом каталоге. >> А все остальное юзеру не будет доступно от слова совсем. >> >> Задача простая как 3 копейки и слабо имеет отношение к Nginx. >> Или я чего-то не понимаю? >> ___ >> nginx-ru mailing list >> nginx-ru@nginx.org >> http://mailman.nginx.org/mailman/listinfo/nginx-ru > >Posted at Nginx Forum: >https://forum.nginx.org/read.php?21,280329,280339#msg-280339 > >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[4]: Запуск php скриптов из разных директории
Как-то все больше запутывается. Если речь о ВПС - так это один сервер на одного пользака, остальные туда доступа не имеют. https://ru.wikipedia.org/wiki/VPS Или речь о нескольких пользаках в рамках одной ЦМС на одном физическом сервере? Или о виртхостах в рамках одного сервера? Насчет ионкуба - загуглите два слова 'ioncube decoder' При любом раскладе (ИМХО), позволять пользаку запускать ПХП и жабу даже из его хоум папки небезопасно. Ибо шелл-скрипты никто не отменял. Тогда нужен чрут на его хоум. А еще лучше - так это заготовить пользаку жабоскрипты и разрешить ему только ХТМЛ. В противном случае вы рискуете, что пользак вполне сможет пролезть к вам в ФС со всеми вытекающими. >Пятница, 29 июня 2018, 13:20 +03:00 от al3x < nginx-fo...@forum.nginx.org >: > >Для юзера создается отдельная VPS с USER правами и доступом ФТП к своей >директории (/home/user/) > >В директории /home/admin/ находится ПО (CMS), которое юзер будет >арендовать. > >При обращении к IP сервера в браузере ему будет доступен веб интерфейс ПО. > >Но если юзер создает какие-либо файлы в своей директории (/home/user/), то >nginx должен сначала отдать их, а потом уже файлы ПО. > >Защитить от скачивания нужно именно PHP файлы ПО. Но даже если юзер сможет >скачать пару php-файлов - не страшно, т.к. они будут под ионкубом. Возможно >еще придется отключить какие-то php функции... > > >Если такое организовать не получится, то можно немного изменить задачу и >обрабатывать PHP только в /home/admin/, а в /home/user/ отдавать статику - >js, css, картинки и тд., но оставить возможность обрабатывать PHP только в >одной папке, например, /home/user/scripts/ > >В общем нужно каким-то образом сдавать ПО в аренду, без особого ущемления >действий юзера. У него должна быть возможность править шаблоны в CMS-ке, >ИСПОЛЬЗУЯ СВОЙ ФТП-ДОСТУП, и загружать в эти шаблоны всякие js и тд. > > >CoDDoC Wrote: >--- >> По-моему, вы слишком усложняете. >> При чем здесь вообще фтп? >> И какие файлы пользак не должен скачивать? ПХП? Так в данном случае у >> него как раз есть такая возможность. >> ХТМЛ? - А как иначе у пользака должен работать веб интерфейс? >> Жаба и ЦСС? - Так они обфусцируются и падают в кеш пользаку. >> >> Уточните задачу. > >Posted at Nginx Forum: >https://forum.nginx.org/read.php?21,280329,280334#msg-280334 > >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Запуск php скриптов из разных директории
По-моему, вы слишком усложняете. При чем здесь вообще фтп? И какие файлы пользак не должен скачивать? ПХП? Так в данном случае у него как раз есть такая возможность. ХТМЛ? - А как иначе у пользака должен работать веб интерфейс? Жаба и ЦСС? - Так они обфусцируются и падают в кеш пользаку. Уточните задачу. >Пятница, 29 июня 2018, 10:06 +03:00 от al3x : > >Суть в том, что пользователю нужно предоставить для пользования ПО, которое >бы он не смог скачать. При этом у него есть фтп доступ к своей директории. >Даже если юзер скачает один-два файла - они будут закодированы, поэтому, не >зная структуры всего ПО, он не доберется до остальных. > >Я знаю, что if не содержит ветки else. Выше я написал просто для >наглядности, чтобы как-то правильно перевести в формат nginx. > >Вот что я пробовал, но пока ничего не получается: > >root/home/user; > >location / { > try_files $uri @fallback_all; >} > >location @fallback_all { > root /home/admin; > try_files $uri @fallback_php; >} > >location @fallback_php { > root /home/admin; > > if (!-f $document_root$fastcgi_script_name) {return 404;} > fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; > fastcgi_pass127.0.0.1:9032; > fastcgi_index index.php; > include /etc/nginx/fastcgi_params; >} > > >Конфиг для "одиночного" режима: > >location / { > index index.php; > try_files $uri $uri/ /index.php?$query_string; >} > >location /admin { > try_files $uri /admin/index.php?$query_string; >} > >location ~ [^/]\.php(/|$) { > fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; > if (!-f $document_root$fastcgi_script_name) { >return 404; > } > fastcgi_pass127.0.0.1:9023; > fastcgi_index index.php; > include /etc/nginx/fastcgi_params; >} > >Posted at Nginx Forum: >https://forum.nginx.org/read.php?21,280329,280331#msg-280331 > >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re: Запуск php скриптов из разных директории
И вам не хворать. УФФ... Во-первых, конструкция if не содержит ветки else. В ПРИНЦИПЕ! Во-вторых, если не понимаете, как работает if, лучше не юзайте, словите кучу проблем. То же самое относится к try_files. В-третьих, как минимум, вам нужно разделить запросы на 2 группы: админские и юзерские. Или по какому-то признаку с обработкой в пхп контроллере, или чтобы они падали в разные локейшены. Для этого изучайте location, rewrite, map и регексы (тоже, как минимум). Юзер может запускать админские скрипты? Жэсть!!! >Четверг, 28 июня 2018, 22:19 +03:00 от al3x : > >Здравствуйте, > >имеются директории: > >/home/admin/ - в этой папке находятся файлы (напр. index.php, conf.php, >admin/index.php), которые нужно скрыть от юзера (но запускать он их может). >/home/user/ - в этой папке файлы юзера. > >Задача: > >ЕСЛИ (запрошенный http адрес соответствует файлу в папке /home/user/) >{ >ТО вернуть клиенту этот файл >} >ИНАЧЕ >{ >ЕСЛИ (файл /home/user/index.php существует) >{ >ТО вызвать скрипт /home/user/index.php для обработки запроса >} >ИНАЧЕ >{ >указать root -директорию /home/admin/ и > >ЕСЛИ (запрошенный http адрес соответствует файлу в папке /home/admin/) >{ >ТО вернуть клиенту этот файл >} >ИНАЧЕ >{ >вызвать скрипт /home/admin/index.php для обработки запроса >} >} >} > > >Т.е. если юзер создает файл, например, /home/user/index.php, то при открытии >сайта должен запускаться именно этот файл. Если же этого файла нет, то >запускаться должен /home/admin/index.php и тд. При этом в папках кроме >php-файлов могут находиться файлы css, картинки и другие. > >Подскажите пожалуйста рабочий конфиг для такой задачи. > >Пробовал через try_files пока ничего не получается... > >Posted at Nginx Forum: >https://forum.nginx.org/read.php?21,280329,280329#msg-280329 > >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: О заголовке content-type
А... голова дырявая. Забыл про types. Спасибо. >Понедельник, 19 февраля 2018, 19:26 +03:00 от Maxim Dounin ><mdou...@mdounin.ru>: > >Hello! > >On Mon, Feb 19, 2018 at 06:18:52PM +0300, CoDDoC wrote: > >> Доброе время суток! >> >> Есть такой локейшен: >> location ~ "^/img/" { internal; } >> >> Естественно, прямой запрос 'GET /img/file.jpg' получает 404 >> Все хорошо, но нужно вместо стандартной nginx страницы отдать кастомную. >> Можно решать разными способами, я решил попробовать через 'return 404 >> ' (минимум внутренних реврайтов/редиректов). >> >> Получилось так (упрощенно): >> >> error_page 404 = @err404; >> location @err404 { >> return 404 ' WTF ? >>'; >> add_header "Content-Type" "text/html; charset=UTF-8" always; >> } >> >> Оно работает, одно смущает: дублирование заголовка Content-Type: сперва >> 'image/jpeg', затем уже 'text/html; charset=UTF-8' >> Браузер-то, ясное дело, возьмет по итогу второй заголовок. Но, может, есть >> какой-либо цивилизованный способ оставить один Content-Type без >> прикручивания костыля типа headers-more ? > >Правильно - не пытаться прибить левый Content-Type гвоздями с >помощью add_header, а задать его штатными средствами. Например >так: > >error_page 404 = /error404.html; >location = /error404.html { >charset utf-8; >return 404 ' ...'; >} > >Или, если по каким-то причинам очень хочется именно именованный >location, то так: > >error_page 404 = @err404; >location @err404 { >types {} >default_type text/html; >charset utf-8; >return 404 ' ...'; >} > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
О заголовке content-type
Доброе время суток! Есть такой локейшен: location ~ "^/img/" { internal; } Естественно, прямой запрос 'GET /img/file.jpg' получает 404 Все хорошо, но нужно вместо стандартной nginx страницы отдать кастомную. Можно решать разными способами, я решил попробовать через 'return 404 ' (минимум внутренних реврайтов/редиректов). Получилось так (упрощенно): error_page 404 = @err404; location @err404 { return 404 ' WTF ? '; add_header "Content-Type" "text/html; charset=UTF-8" always; } Оно работает, одно смущает: дублирование заголовка Content-Type: сперва 'image/jpeg', затем уже 'text/html; charset=UTF-8' Браузер-то, ясное дело, возьмет по итогу второй заголовок. Но, может, есть какой-либо цивилизованный способ оставить один Content-Type без прикручивания костыля типа headers-more ? proxy_hide_header не годится - нет проксирования. Отправлять все "не-пойми-какие" запросы на бэкенд - не вижу в этом особого смысла. Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[6]: nginx restart AND listen ip:port
Третий и последний раз повторяю, хотите, чтобы вам помогли - обозначайте ВСЕ части конфига, отвечающие за проблему. То, что по вашему мнению должно работать, но не работает. Вы видите разницу в ваших локейшенах? Апстрим backend у вас как-то определен? В error.log, случаем, не проскакивает что-то типа 'host not found in upstream ...' ? И, кстати, все-же рекомендую перечитывать конфиг как 'nginx -s reload'. Так вы сразу увидите ошибку. 'service nginx reload' вам ответит ОК, а ошибку скинет в лог. >Среда, 14 февраля 2018, 19:13 +03:00 от "imsystem" ><nginx-fo...@forum.nginx.org>: > >Всё проксирует, при записи >server { >listen external_IP_nginx:443; >location / { proxy_pass https://local_IP_IIS; } >} > >При этой записи не проксирует, выдавало, насколько помню, 403 >server { >listen 443; >location / { proxy_pass https://backend; } >} > >А прочие команды я и в документации видел, просто через service/systemctl >как-то привычнее. > >CoDDoC Wrote: >--- >> Да, сопоставима. Просто вы об этом ничего не сказали. >> Насчет опции -s и прочих можете посмотреть nginx -h >> Будет что-то типа: >> nginx version: nginx/1.13.8 >> Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g >> directives] >> >> Options: >> -?,-h : this help >> -v : show version and exit >> -V : show version and configure options then exit >> -t : test configuration and exit >> -T : test configuration, dump it and exit >> -q : suppress non-error messages during configuration >> testing >> -s signal : send signal to a master process: stop, quit, reopen, >> reload >> -p prefix : set prefix path (default: /etc/nginx/) >> -c filename : set configuration file (default: >> /etc/nginx/nginx.conf) >> -g directives : set global directives out of configuration file >> >> По остальному вам Максим ответил. >> >> А почему не проксирует - я вам уже сказал. С такой скудной >> информацией, что вы даете, нужен хрустальный шар. Не нужно вываливать >> весь конфиг, достаточно частей, относящихся к теме. Причин на самом >> деле может быть много. Начиная от правил FW и заканчивая локейшеном, в >> который падает запрос. >> >> >> >Среда, 14 февраля 2018, 15:51 +03:00 от "imsystem" >> < nginx-fo...@forum.nginx.org >: >> > >> >> Вам обязательно 'service nginx restart'? >> >> 'nginx -s reload' пробовали? >> >Нет, не обязательно. >> >Нет, не пробовал, считал её сопоставимой команде service nginx >> reload, а она >> >работает. >> >Меня сам факт смущает. >> > >> >> Насчет версии 1.12.1. В stable ветке доступна 1.12.2. Может там уже >> >> пофиксили? >> >Может и пофиксили. >> > >> >> >> Два интерфейса внешний и локальный. Везде ip - внешний ip. >> >> >> Проксирование идёт по локалке. >> >> >> Если принудительно не указывать ip в listen, то не проксируется. >> >> Потрудитесь четко формулировать вопрос. >> >> Что и куда вы проксируете? nginx на nginx? 80-й порт на 443-й? >> Бэкенд >> >> где находится? На том же сервере или на другом? >> >> ip в конфиге внешние? >> >С nginx на IIS, сервера разные, 80 порт перенаправляется на 443 (http >> -> >> >https). >> >ip которые слушает nginx внешние, проксирует соответственно на >> локальный ip >> >IIS потоо https прколу. >> > >> > >> >> >Среда, 14 февраля 2018, 13:10 +03:00 от "imsystem" >> >> < nginx-fo...@forum.nginx.org >: >> >> > >> >> >И совсем забыл. >> >> > >> >> >nginx -V >> >> >nginx version: nginx/1.12.1 >> >> >built by gcc 6.3.0 20170516 (Debian 6.3.0-18) >> >> >built with OpenSSL 1.1.1-dev xx XXX >> >> >TLS SNI support enabled >> >> >configure arguments: --prefix=/usr/local/nginx/ >> >> >--conf-path=/etc/nginx/nginx.conf >> >> --error-log-path=/var/log/nginx/error.log >> >> >--http-log-path=/var/log/nginx/access.log >> >> --pid-path=/var/run/nginx.pid >> >> >--user=www-data --group=www-data --with-threads --with-file-aio >> >> >--with-http_ssl_module --with-openssl=/home/sysadmin/src/openssl >> >> >--with-http_v2_module --with-http_realip_module >> >> --with-http_addition_module &g
Re[4]: nginx restart AND listen ip:port
Да, сопоставима. Просто вы об этом ничего не сказали. Насчет опции -s и прочих можете посмотреть nginx -h Будет что-то типа: nginx version: nginx/1.13.8 Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives] Options: -?,-h : this help -v : show version and exit -V : show version and configure options then exit -t : test configuration and exit -T : test configuration, dump it and exit -q : suppress non-error messages during configuration testing -s signal : send signal to a master process: stop, quit, reopen, reload -p prefix : set prefix path (default: /etc/nginx/) -c filename : set configuration file (default: /etc/nginx/nginx.conf) -g directives : set global directives out of configuration file По остальному вам Максим ответил. А почему не проксирует - я вам уже сказал. С такой скудной информацией, что вы даете, нужен хрустальный шар. Не нужно вываливать весь конфиг, достаточно частей, относящихся к теме. Причин на самом деле может быть много. Начиная от правил FW и заканчивая локейшеном, в который падает запрос. >Среда, 14 февраля 2018, 15:51 +03:00 от "imsystem" >: > >> Вам обязательно 'service nginx restart'? >> 'nginx -s reload' пробовали? >Нет, не обязательно. >Нет, не пробовал, считал её сопоставимой команде service nginx reload, а она >работает. >Меня сам факт смущает. > >> Насчет версии 1.12.1. В stable ветке доступна 1.12.2. Может там уже >> пофиксили? >Может и пофиксили. > >> >> Два интерфейса внешний и локальный. Везде ip - внешний ip. >> >> Проксирование идёт по локалке. >> >> Если принудительно не указывать ip в listen, то не проксируется. >> Потрудитесь четко формулировать вопрос. >> Что и куда вы проксируете? nginx на nginx? 80-й порт на 443-й? Бэкенд >> где находится? На том же сервере или на другом? >> ip в конфиге внешние? >С nginx на IIS, сервера разные, 80 порт перенаправляется на 443 (http -> >https). >ip которые слушает nginx внешние, проксирует соответственно на локальный ip >IIS потоо https прколу. > > >> >Среда, 14 февраля 2018, 13:10 +03:00 от "imsystem" >> < nginx-fo...@forum.nginx.org >: >> > >> >И совсем забыл. >> > >> >nginx -V >> >nginx version: nginx/1.12.1 >> >built by gcc 6.3.0 20170516 (Debian 6.3.0-18) >> >built with OpenSSL 1.1.1-dev xx XXX >> >TLS SNI support enabled >> >configure arguments: --prefix=/usr/local/nginx/ >> >--conf-path=/etc/nginx/nginx.conf >> --error-log-path=/var/log/nginx/error.log >> >--http-log-path=/var/log/nginx/access.log >> --pid-path=/var/run/nginx.pid >> >--user=www-data --group=www-data --with-threads --with-file-aio >> >--with-http_ssl_module --with-openssl=/home/sysadmin/src/openssl >> >--with-http_v2_module --with-http_realip_module >> --with-http_addition_module >> >--with-http_xslt_module --with-http_image_filter_module >> >--with-http_geoip_module --with-http_sub_module >> --with-http_dav_module >> >--with-http_flv_module --with-http_mp4_module >> --with-http_gunzip_module >> >--with-http_gzip_static_module --with-http_auth_request_module >> >--with-http_random_index_module --with-http_secure_link_module >> >--with-http_degradation_module --with-http_slice_module >> >--with-http_stub_status_module --with-stream --with-stream_ssl_module >> > >> >uname -a >> >Linux gateway 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3+deb9u1 >> (2017-12-23) >> >x86_64 GNU/Linux >> > >> >Posted at Nginx Forum: >> https://forum.nginx.org/read.php?21,278548,278550#msg-278550 >> > >> >___ >> >nginx-ru mailing list >> > nginx-ru@nginx.org >> > http://mailman.nginx.org/mailman/listinfo/nginx-ru >> >> >> -- >> ___ >> nginx-ru mailing list >> nginx-ru@nginx.org >> http://mailman.nginx.org/mailman/listinfo/nginx-ru > >Posted at Nginx Forum: >https://forum.nginx.org/read.php?21,278551,278554#msg-278554 > >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: nginx restart AND listen ip:port
Вам обязательно 'service nginx restart'? 'nginx -s reload' пробовали? Насчет версии 1.12.1. В stable ветке доступна 1.12.2. Может там уже пофиксили? >> Два интерфейса внешний и локальный. Везде ip - внешний ip. >> Проксирование идёт по локалке. >> Если принудительно не указывать ip в listen, то не проксируется. Потрудитесь четко формулировать вопрос. Что и куда вы проксируете? nginx на nginx? 80-й порт на 443-й? Бэкенд где находится? На том же сервере или на другом? ip в конфиге внешние? >Среда, 14 февраля 2018, 13:10 +03:00 от "imsystem" >: > >И совсем забыл. > >nginx -V >nginx version: nginx/1.12.1 >built by gcc 6.3.0 20170516 (Debian 6.3.0-18) >built with OpenSSL 1.1.1-dev xx XXX >TLS SNI support enabled >configure arguments: --prefix=/usr/local/nginx/ >--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log >--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid >--user=www-data --group=www-data --with-threads --with-file-aio >--with-http_ssl_module --with-openssl=/home/sysadmin/src/openssl >--with-http_v2_module --with-http_realip_module --with-http_addition_module >--with-http_xslt_module --with-http_image_filter_module >--with-http_geoip_module --with-http_sub_module --with-http_dav_module >--with-http_flv_module --with-http_mp4_module --with-http_gunzip_module >--with-http_gzip_static_module --with-http_auth_request_module >--with-http_random_index_module --with-http_secure_link_module >--with-http_degradation_module --with-http_slice_module >--with-http_stub_status_module --with-stream --with-stream_ssl_module > >uname -a >Linux gateway 4.9.0-4-amd64 #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23) >x86_64 GNU/Linux > >Posted at Nginx Forum: >https://forum.nginx.org/read.php?21,278548,278550#msg-278550 > >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: В каком порядке обрабатываются location?
А..., вон оно как... А я голову сломал, почему локейшены откуда-то с середины выдергиваются. Еще раз спасибо. >Понедельник, 12 февраля 2018, 17:17 +03:00 от Maxim Dounin ><mdou...@mdounin.ru>: > >Hello! > >On Mon, Feb 12, 2018 at 04:58:32PM +0300, CoDDoC wrote: > >> >> location /456/ оказался в корне дерева, и поэтому проверяется первым. >> А почему именно этот? Можно поподробнее? > >Потом что он находится в середине списка location'ов, >отсортированного строково. Такой подход позволяет минимизировать >количество необходимых сравнений: если строковое сравнение URI >запроса с /456/ говорит, что URI меньше, то дальнейший поиск >нужного location'а будет делаться только среди location'ов, >которые меньше /456/. > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: В каком порядке обрабатываются location?
>> location /456/ оказался в корне дерева, и поэтому проверяется первым. А почему именно этот? Можно поподробнее? Спасибо. >Понедельник, 12 февраля 2018, 16:52 +03:00 от Maxim Dounin ><mdou...@mdounin.ru>: > >Hello! > >On Mon, Feb 12, 2018 at 04:31:18PM +0300, CoDDoC wrote: > >> Доброе время суток! >> Слегка запутался в порядке обработки локейшенов. >> Такая структура: >> >> /1/index.html >> /23/index.html >> /456/index.html >> /7890/index.html >> >> Все файлы index.html, естественно, разные. >> >> Соответственно, тестовый конфиг: >> >> server { >> >> location = /1/ { rewrite ^ /1/index.html break; } >> location = /23/ { rewrite ^ /23/index.html break; } >> location = /456/ { rewrite ^ /456/index.html break; } >> location = /7890/ { rewrite ^ /7890/index.html break; } > >[...] > >> Т.е. работает-то оно правильно, но проверки существующих >> локейшенов почему-то всегда начинаюся с "/456/". Не понимаю, чем >> он такой особенный? Если отталкиваться от длины, так самый >> длинный "/7890/" > >Префиксные location'ы не проверяются последовательно, а строится >дерево, и поиск максимально совпадающего location'а делается >проходом по дереву. В вашем случае location /456/ оказался в >корне дерева, и поэтому проверяется первым. > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
В каком порядке обрабатываются location?
Доброе время суток! Слегка запутался в порядке обработки локейшенов. Такая структура: /1/index.html /23/index.html /456/index.html /7890/index.html Все файлы index.html, естественно, разные. Соответственно, тестовый конфиг: server { location = /1/ { rewrite ^ /1/index.html break; } location = /23/ { rewrite ^ /23/index.html break; } location = /456/ { rewrite ^ /456/index.html break; } location = /7890/ { rewrite ^ /7890/index.html break; } location ~ (\.html$|\.php$) { internal; } location "" { return 404; } error_page 404 = @err404; # все, что не соответствует location @err404 { keepalive_timeout 0; rewrite ^ /err/404.html break; } } Из дебага: 2018/02/12 16:02:05 [debug] 11200#11200: *1 http request line: "GET /1/ HTTP/1.1" 2018/02/12 16:02:05 [debug] 11200#11200: *1 http uri: "/1/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "" <<< === здесь ожидалось test location: "/7890/", как локейшен максимальной длины 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "/456/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "/23/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 test location: "/1/" 2018/02/12 16:02:05 [debug] 11200#11200: *1 using configuration "=/1/" = 2018/02/12 16:03:05 [debug] 11246#11246: *1 http request line: "GET /23/ HTTP/1.1" 2018/02/12 16:03:05 [debug] 11246#11246: *1 http uri: "/23/" 2018/02/12 16:03:05 [debug] 11246#11246: *1 test location: "" <<< === здесь также ожидалось test location: "/7890/", как локейшен максимальной длины 2018/02/12 16:03:05 [debug] 11246#11246: *1 test location: "/456/" 2018/02/12 16:03:05 [debug] 11246#11246: *1 test location: "/23/" 2018/02/12 16:03:05 [debug] 11246#11246: *1 using configuration "=/23/" === 2018/02/12 16:03:51 [debug] 11283#11283: *1 http request line: "GET /456/ HTTP/1.1" 2018/02/12 16:03:51 [debug] 11283#11283: *1 http uri: "/456/" 2018/02/12 16:03:51 [debug] 11283#11283: *1 test location: "" 2018/02/12 16:03:51 [debug] 11283#11283: *1 test location: "/456/" 2018/02/12 16:03:51 [debug] 11283#11283: *1 using configuration "=/456/" = Запрос в несуществующий локейшен 2018/02/12 16:22:47 [debug] 11285#11285: *3 http request line: "GET /7890/ HTTP/1.1" 2018/02/12 16:22:47 [debug] 11285#11285: *3 http uri: "/7890/" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "/456/" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "/7890/" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: ~ "(\.html$|\.php$)" 2018/02/12 16:22:47 [debug] 11285#11285: *3 using configuration "" 2018/02/12 16:22:47 [debug] 11285#11285: *3 rewrite phase: 3 2018/02/12 16:22:47 [debug] 11285#11285: *3 http finalize request: 404, "/7890/?" a:1, c:1 2018/02/12 16:22:47 [debug] 11285#11285: *3 http special response: 404, "/7890/?" 2018/02/12 16:22:47 [debug] 11285#11285: *3 test location: "@err404" 2018/02/12 16:22:47 [debug] 11285#11285: *3 using location: @err404 "/7890/?" .. = Т.е. работает-то оно правильно, но проверки существующих локейшенов почему-то всегда начинаюся с "/456/". Не понимаю, чем он такой особенный? Если отталкиваться от длины, так самый длинный "/7890/" Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Вопрос по access_log
Насчет уровня location не проверял, но точно проверено, что 'access_log off' в уровне server глушит все access_log уровня http Думаю, с location будет то же самое >Пятница, 9 февраля 2018, 16:26 +03:00 от Ruslan Ermilov <r...@nginx.com>: > >On Fri, Feb 09, 2018 at 04:11:16PM +0300, Slawa Olhovchenkov wrote: >> On Fri, Feb 09, 2018 at 04:01:09PM +0300, Maxim Dounin wrote: >> >> > Hello! >> > >> > On Fri, Feb 09, 2018 at 12:38:32PM +0300, CoDDoC wrote: >> > >> > [...] >> > >> > > access_log в нижестоящем контексте отменяет все вышестоящие? >> > >> > Как и все остальные директивы, access_log наследуется с >> > предыдущих уровней тогда и только тогда, когда на данном уровне не >> > указано директив access_log. >> >> и при этом, кажется, нет возможности просто включать/выключать acceess >> log, не трогая его настройки? > >Запись в лог может быть условной при помощи параметра "if=". > >Кроме того, можно на внешнем уровне (напр., server) задать access_log'и, >а на вложенном уровне (напр., location) указать "access_log off;". >Тогда на данном вложенном уровне access_log'и будут отключены, а >на других вложенных уровнях (где не указаны свои access_log'и) будут >действовать настройки как на внешнем уровне. > >Я, впрочем, не уверен, что понял Ваш витиеватый вопрос правильно. > >http://nginx.org/r/access_log/ru >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Вопрос по access_log
Да, спасибо, уже разобрался "методом научного тыка". ИМХО, неплохо было бы это в доках указать >Пятница, 9 февраля 2018, 16:01 +03:00 от Maxim Dounin <mdou...@mdounin.ru>: > >Hello! > >On Fri, Feb 09, 2018 at 12:38:32PM +0300, CoDDoC wrote: > >[...] > >> access_log в нижестоящем контексте отменяет все вышестоящие? > >Как и все остальные директивы, access_log наследуется с >предыдущих уровней тогда и только тогда, когда на данном уровне не >указано директив access_log. > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Вопрос по access_log
Доброе время суток! nginx/1.13.8 Случайно обнаружилась непонятка. Конфиг 1: http { log_format f1 '[$time_local - 1]'; log_format f2 '[$time_local - 2]'; access_log /var/log/nginx/1.log f1; access_log /var/log/nginx/2.log f2; server { listen ... root index . # access_log /var/log/nginx/1.log f1; # access_log /var/log/nginx/2.log f2; } } Делаем запрос и получаем ожидаемое: запись в ОБА файла. --- Теперь так. Конфиг 2: http { log_format f1 '[$time_local - 1]'; log_format f2 '[$time_local - 2]'; access_log /var/log/nginx/1.log f1; # access_log /var/log/nginx/2.log f2; server { listen ... root index . # access_log /var/log/nginx/1.log f1; access_log /var/log/nginx/2.log f2; } } И запись ТОЛЬКО во второй файл. --- Конфиг 3: http { log_format f1 '[$time_local - 1]'; log_format f2 '[$time_local - 2]'; # access_log /var/log/nginx/1.log f1; # access_log /var/log/nginx/2.log f2; server { listen ... root index . access_log /var/log/nginx/1.log f1; access_log /var/log/nginx/2.log f2; } } Опять все ожидаемо, запись в оба файла. --- В server / location похожая ситуация: server { listen ... root ... index ... access_log /var/log/nginx/1.log f1; # Все, что не совпало с разрешенными location "" { return 404; } error_page 404 = @err404; location @err404 { keepalive_timeout 0; rewrite ^ /err/404.html break; access_log /var/log/nginx/2.log f2; } } Ожидаемо: бредовый запрос должен отметиться и в 1.log, и в 2.log По факту: если работает "access_log /var/log/nginx/2.log f2;", соответственно, не работает "access_log /var/log/nginx/1.log f1;" Правильный запрос приходит в 1.log, бредовый - в 2.log Если "access_log /var/log/nginx/2.log f2;" отключить, тогда в 1.log приходят все запросы, и правильные, и бредовые. access_log в нижестоящем контексте отменяет все вышестоящие? --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Непонятное количество воркеров
Доброго времени суток! nginx/1.13.8 Тестовый сервер, 2 ядра. В конфиге 'worker_processes auto' или 'worker_processes 2' - без разницы pstree дает такую картину: nginx───2*[nginx───32*[{nginx}]] 32 воркера на каждый из двух Куда копать? --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Список модулей
Доброе время суток! nginx -V показывает вкомпиленные модули. А как, без просмотра конфига, оперативно посмотреть, какие динамические модули загружены директивой load_module? Что-то типа php -m, apachectl -M. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Непонятки с ответом 400
Ладно, с этим разберусь. Еще толику Вашего времени... Не совсем в тему, но почти. О выборе секции server для обработки запроса. Я слегка запутался, что от чего зависит: $host от $server_name или наоборот? Вот как я это понимаю. 1. Сначала неправильный запрос: echo -e 'HEAD http://www.other-domain.com/some-path HTTP/1.1\n''host:www.my-domain.com\n''user-agent:NCAT-TEST\n'| ncat www.my-domain.com 80 Как все происходит (ИМХО): 1.1. Получаем значение $host из строки запроса: $host = www.other-domain.com На заголовок ($http_host = www.my-domain.com) в данном случае не смотрим. 1.2. Ищем секцию, соответствующую значению $host для заданного порта (80) 1.3. Такой секции не существует, запрос передается в дефолтовую, и получаем $server_name = _ 2. Теперь правильный запрос: echo -e 'HEAD / HTTP/1.1\n''host:www.my-domain.com\n''user-agent:NCAT-TEST\n'| ncat www.my-domain.com 80 2.1. В строке запроса хоста нет, берем из заголовка ($http_host = www.my-domain.com). Получаем значение $host из $http_host: $host= www.my-domain.com 2.2. Ищем секцию, соответствующую значению $host для заданного порта (80) 2.3. Передаем в нее запрос и получаем $server_name = www.my-domain.com 3. Опять неправильный запрос с пустым $http_host: echo -e 'HEAD / HTTP/1.1\n''host:\n''user-agent:NCAT-TEST\n'| ncat www.my-domain.com 80 3.1. Значения $host = '' и $http_host = '' 3.2. Ищем секцию, соответствующую значению $host для заданного порта (80) 3.3. Такой секции не существует, запрос передается в дефолтовую, и получаем $server_name = _ 3.4. $host получает значение $server_name, т.е. $host = _ Т.е., в отличие от примера 2, не $server_name получаем из $host, а $host из $server_name Я верно понимаю алгоритм? >Понедельник, 20 ноября 2017, 16:24 +03:00 от Maxim Dounin <mdou...@mdounin.ru>: > >Hello! > >On Mon, Nov 20, 2017 at 03:43:16PM +0300, CoDDoC wrote: > >> Это я понял. Бот дернул запрос и быстро сбежал, чтобы не попасть в бан. >> Однако-же попал :) >> Как мне эмулировать такую ситуацию? > >Я, вроде бы, вполне однозначно написал: > >> > Если клиент закрыл соединение, не прислав запрос полностью - >> > то ... > >Так и эмулировать - закрывать соединение, не прислав запрос >полностью. > >[...] > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Непонятки с ответом 400
Это я понял. Бот дернул запрос и быстро сбежал, чтобы не попасть в бан. Однако-же попал :) Как мне эмулировать такую ситуацию? >Понедельник, 20 ноября 2017, 15:34 +03:00 от Maxim Dounin <mdou...@mdounin.ru>: > >Hello! > >On Mon, Nov 20, 2017 at 02:57:13PM +0300, CoDDoC wrote: > >> Доброго дня! >> >> Собственно, классическая секция server, принимающая запросы с неправильным >> $host: >> >> server { >> listen :80 default_server; >> listen :443 default_server; >> server_name _; >> return 444; >> access_log здесь лог, что попадет в эту секцию >> } >> >> Формат этого лога: >> [$remote_addr] [$host] [$http_host] [$request] [$status] [$http_user_agent] >> [$server_name] [$server_port] >> >> Там такая запись: >> [155.94.254.143] [] [] [GET /OWA-AUTODISCOVER-EWS >> HTTP/1.1] [400] [Mozilla/5.0 Project 25499 (project25499.com)] [_] [80] >> >> В error логе вижу такое: >> [info] 7455#0: *356814 client prematurely closed connection while reading >> client request headers, client: 155.94.254.143, server: _, request: "GET >> /OWA-AUTODISCOVER-EWS HTTP/1.1", host: "" >> >> Хорошо, откуда 400, если должно быть 444? > >Если клиент закрыл соединение, не прислав запрос полностью - то >это ошибка 400 Bad Request. До обработки запроса - которая >вернула бы 444 в соответствии в "return 444" в конфигурации - дело >просто не доходит, потому что запрос ещё не получен полностью. > >-- >Maxim Dounin >http://mdounin.ru/ >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru -- ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Непонятки с ответом 400
Доброго дня! Собственно, классическая секция server, принимающая запросы с неправильным $host: server { listen :80 default_server; listen :443 default_server; server_name _; return 444; access_log здесь лог, что попадет в эту секцию } Формат этого лога: [$remote_addr] [$host] [$http_host] [$request] [$status] [$http_user_agent] [$server_name] [$server_port] Там такая запись: [155.94.254.143] [] [] [GET /OWA-AUTODISCOVER-EWS HTTP/1.1] [400] [Mozilla/5.0 Project 25499 (project25499.com)] [_] [80] В error логе вижу такое: [info] 7455#0: *356814 client prematurely closed connection while reading client request headers, client: 155.94.254.143, server: _, request: "GET /OWA-AUTODISCOVER-EWS HTTP/1.1", host: "" Хорошо, откуда 400, если должно быть 444? Пытаюсь эмулировать ситуацию: echo -e 'GET /OWA-AUTODISCOVER-EWS HTTP/1.1\n''host:\n''user-agent:Mozilla/5.0 Project 25499 (project25499.com)\n'| ncat 80 И получаю ожидаемое 444. Т.е. за исключением ответа 444 и моего IP, все аналогично: [<мой IP>] [] [] [GET /OWA-AUTODISCOVER-EWS HTTP/1.1] [444] [Mozilla/5.0 Project 25499 (project25499.com)] [_] [80] Вот такая печалька... Что я упускаю и как получить 400? Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Вопрос по дебагу
Доброго времени суток! Подскажите, плиз, где можно почитать нормальную документацию про сообщения в дебаг логе. Перерыл весь гугол, ничего толком нет. Честно, надоело играть в угадайку. Например, что означают такие записи в режиме debug_http: 1. 2017/11/13 07:41:37 [debug] 624#0: *244736 rewrite phase: 3 2017/11/13 07:41:37 [debug] 624#0: *244736 post rewrite phase: 4 2017/11/13 07:41:37 [debug] 624#0: *244736 generic phase: 5 2017/11/13 07:41:37 [debug] 624#0: *244736 generic phase: 6 2017/11/13 07:41:37 [debug] 624#0: *244736 generic phase: 7 2017/11/13 07:41:37 [debug] 624#0: *244736 generic phase: 8 2017/11/13 07:41:37 [debug] 624#0: *244736 http script var: "Q^Y,m" 2017/11/13 07:41:37 [debug] 624#0: *244736 limit conn: 4B30596F 1 2017/11/13 07:41:37 [debug] 624#0: *244736 access phase: 9 2017/11/13 07:41:37 [debug] 624#0: *244736 access phase: 10 2017/11/13 07:41:37 [debug] 624#0: *244736 post access phase: 11 2. 2017/11/13 07:41:37 [debug] 624#0: *244736 http script copy: "Connection: close^M" 2017/11/13 07:41:37 [debug] 624#0: *244736 http script copy: "" 2017/11/13 07:41:37 [debug] 624#0: *244736 http script copy: "" 2017/11/13 07:41:37 [debug] 624#0: *244736 http script copy: "" 2017/11/13 07:41:37 [debug] 624#0: *244736 http script copy: "" Последние 4 пустых строки 3. 2017/11/13 07:41:37 [debug] 624#0: *244736 http cleanup add: 01F02220 2017/11/13 07:41:37 [debug] 624#0: *244736 get rr peer, try: 1 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream connect: -2 2017/11/13 07:41:37 [debug] 624#0: *244736 http finalize request: -4, "/?" a:1, c:2 2017/11/13 07:41:37 [debug] 624#0: *244736 http request count:2 blk:0 2017/11/13 07:41:37 [debug] 624#0: *244736 http run request: "/?" 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream check client, write event:1, "/" 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream recv(): -1 (11: Resource temporarily unavailable) Здесь особо интересует (11: Resource temporarily unavailable). Запрос делался в корень методом HEAD Потому что дальше, вроде бы, все в порядке: 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream request: "/?" 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream send request handler 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream send request 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream send request body 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream request: "/?" 2017/11/13 07:41:37 [debug] 624#0: *244736 http upstream process header 2017/11/13 07:41:37 [debug] 624#0: *244736 http proxy status 200 "200 OK" 4. 2017/11/13 07:41:37 [debug] 624#0: *244736 http write filter: l:1 f:0 s:298 2017/11/13 07:41:37 [debug] 624#0: *244736 http write filter limit 0 2017/11/13 07:41:37 [debug] 624#0: *244736 http write filter 2017/11/13 07:41:37 [debug] 624#0: *244736 finalize http upstream request: 0 2017/11/13 07:41:37 [debug] 624#0: *244736 finalize http proxy request 2017/11/13 07:41:37 [debug] 624#0: *244736 free rr peer 1 0 2017/11/13 07:41:37 [debug] 624#0: *244736 close http upstream connection: 5 2017/11/13 07:41:37 [debug] 624#0: *244736 http finalize request: 0, "/?" a:1, c:1 2017/11/13 07:41:37 [debug] 624#0: *244736 set http keepalive handler 2017/11/13 07:41:37 [debug] 624#0: *244736 http close request Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Зацикливание на редиректе
А вот интересно, от ботов тоже будем требовать соблюдения RFC? Я воспроизвел ситуацию, как создать бесполезную нагрузку на сервер при бесконечном редиректе. Правильно я делаю запрос или нет - в данном случае не важно. Важно то, что оно работает, и у сервера нет встроенных средств для корректной обработки такой ситуации. По большому счету, это называется уязвимостью. Дальше. господа разрабы, решать вам. Закрыть проблему или оставить все как есть и подождать, пока эту уязвимость начнут эксплуатировать. Засим позволю себе откланяться, поскольку не имею времени продолжать бессмысленную дискуссию. Спасибо. >Понедельник, 7 августа 2017, 16:12 +03:00 от Валентин Бартенев ><vb...@nginx.com>: > >On Monday 07 August 2017 15:26:11 CoDDoC wrote: >> Ну, хорошо. Пусть в моем примере вообще нет хоста. >> Тогда что такое https://test.com ? Давайте назовем строкой запроса, суть >проблемы от этого не меняется. > >В вашем примере это аргумент командной строки, который не участвует в запросе. >В строке запроса он не передается. > > >> В документации так: >> " $host >> в порядке приоритета: имя хоста из строки запроса, или имя хоста >из поля “Host” заголовка запроса.," >> >> Объясните мне, пожалуйста, что понимать как "имя хоста из строки запроса" и >"имя хоста из поля “Host” заголовка запроса". >> Желательно с примером для курла, как особо одаренному. > >Что такое строка запроса описано в RFC: >https://tools.ietf.org/html/rfc7230#section-3.1.1 > >Пример с curl: > >$ curl -ILH 'Host: www.nginx.org ' -x http://nginx.org:80/ http://nginx.org/ > > >> >> Далее, Вы приводите пример с netcat. Аналогично можно использовать telnet. >> Только ведь после получения Location ему нужно следовать. Полученный >Location: http://nginx.org/ куда возвращает? На HEAD http://nginx.org/ >HTTP/1.1. > >Первый пример netcat как раз содержит http://nginx.org/ в строке запроса >и как вы можете наблюдать - редиректа нет. > >Второй пример не содержит в строке запроса хоста, а в заголовке Host >содержится www.nginx.org и происходит редирект. > > >> >> То же самое, только не вводить построчно: >> >> curl -ILH 'Host: www.nginx.org ' https://nginx.org/ >> >> И точно такое же зацикливание. > >В данном случае отправляет запрос только с www.nginx.org в заголовке Host >и отсутствием хоста в строке запроса. Так работает curl. > >Зацикливания происходит только потому, что вы сами заставили curl >постоянно отправлять запрос с Host: www.nginx.org , о чем предупреждает >документация: > > >man curl: > > -H, --header > > WARNING: headers set with this option will be set in > all requests - even after redirects are followed, > like when told with -L, --location. This can lead to > the header being sent to other hosts than the origi‐ > nal host, so sensitive headers should be used with > caution combined with following redirects. > > > >Если вы укажите заголовок Host так, как это правильно для curl, >то никаких проблем нет: > > curl -IL https://www.nginx.org/ > > >> Пусть мои примеры неверны. Но работают, и приводят к зацикливанию при >псевдо-валидном запросе. > >Ваши примеры демонстрируют неправильное использование команды curl, >о чем вас предупреждает документация. > >> По большому счету, меня интересует только, как это побороть. >> > >Использовать curl правильно. > >-- >Валентин Бартенев >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Зацикливание на редиректе
Ну, хорошо. Пусть в моем примере вообще нет хоста. Тогда что такое https://test.com ? Давайте назовем строкой запроса, суть проблемы от этого не меняется. В документации так: " $host в порядке приоритета: имя хоста из строки запроса, или имя хоста из поля “Host” заголовка запроса.," Объясните мне, пожалуйста, что понимать как "имя хоста из строки запроса" и "имя хоста из поля “Host” заголовка запроса". Желательно с примером для курла, как особо одаренному. Далее, Вы приводите пример с netcat. Аналогично можно использовать telnet. Только ведь после получения Location ему нужно следовать. Полученный Location: http://nginx.org/ куда возвращает? На HEAD http://nginx.org/ HTTP/1.1. То же самое, только не вводить построчно: curl -ILH 'Host: www.nginx.org' https://nginx.org/ И точно такое же зацикливание. Пусть мои примеры неверны. Но работают, и приводят к зацикливанию при псевдо-валидном запросе. По большому счету, меня интересует только, как это побороть. >Понедельник, 7 августа 2017, 13:37 +03:00 от Валентин Бартенев ><vb...@nginx.com>: > >On Monday 07 August 2017 13:25:32 Валентин Бартенев wrote: >> On Monday 07 August 2017 09:01:39 CoDDoC wrote: >> > >> > Спасибо. >> > >> > Только Вы говорите об URI "/", а вопрос был об URL, точнее - о >> > зацикливании, связанном с неправильной (ИМХО) интерпретацией в ngx >> > переменной $host. Как она ДОЛЖНА обрабатываться - сказано в доке, что >> > имеем ПО ФАКТУ - в моем примере. >> >> Ещё раз. Вы неправильно интерпретируете команду curl, отсюда и считаете, >> что поведение nginx отличается от описанного в документации. Ваш пример >> неверен. >> >> И далее на этом неверном предположении строите все остальные выводы. >> >> Вы пишите: >> >> | Вот такой случай: >> | curl -ILH 'Host: www.test.com ' https://test.com >> | >> | Если бы переменная $host получила значение в порядке приоритета, оно было >> бы test.com (имя хоста из строки запроса). >> >> Нет не было бы. Потому что в строке запроса, которую отправляет данная >> команда curl нет "test.com". Там нет вообще хоста. >> >[..] > > >Вот наглядный пример, всё работает как описано >в документации и должно быть по RFC: > > >% netcat nginx.org 80 >HEAD http://nginx.org/ HTTP/1.1 >Host: www.nginx.org > >HTTP/1.1 200 OK >Server: nginx/1.13.3 >Date: Mon, 07 Aug 2017 10:34:37 GMT >Content-Type: text/html; charset=utf-8 >Content-Length: 6680 >Last-Modified: Tue, 11 Jul 2017 15:45:07 GMT >Connection: keep-alive >Keep-Alive: timeout=15 >ETag: "5964f283-1a18" >Accept-Ranges: bytes > >HEAD / HTTP/1.1 >Host: www.nginx.org > >HTTP/1.1 301 Moved Permanently >Server: nginx/1.13.3 >Date: Mon, 07 Aug 2017 10:34:53 GMT >Content-Type: text/html >Content-Length: 185 >Connection: keep-alive >Keep-Alive: timeout=15 >Location: http://nginx.org/ > >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Re[2]: Зацикливание на редиректе
Спасибо. Только Вы говорите об URI "/", а вопрос был об URL, точнее - о зацикливании, связанном с неправильной (ИМХО) интерпретацией в ngx переменной $host. Как она ДОЛЖНА обрабатываться - сказано в доке, что имеем ПО ФАКТУ - в моем примере. Добавление опции -v, по сути, ничего не меняет. Разве что лишний раз убедиться, что при редиректе передается заголовок HOST. Тема уже поднималась, в частности, здесь ( http://mailman.nginx.org/pipermail/nginx-ru/2014-June/054083.html ) довольно обширная дискуссия. Но там все достаточно просто, речь идет о явно невалидных запросах, которые можно и нужно фильтровать. Я же несколько усложнил задачу и привел пример псевдо-валидного запроса, который отфильтровать невозможно. И до тех пор, пока проблема с переменной $host не будет решена, такое зацикливание неизбежно. Так что вопрос больше к разработчикам. >Суббота, 5 августа 2017, 21:46 +03:00 от Валентин Бартенев < vb...@nginx.com >>: > >On Thursday 03 August 2017 12:15:16 CoDDoC wrote: >[..] >> Судя по логам, это не совсем так. >> По крайней мере, в моем случае (nginx/1.10.2), переменная $host получает имя >> хоста из строки запроса только если не указано поле host заголовка. Т.е. >> обрабатывается ситуация с HTTP/1.0, без $http_host в заголовке. Но если в >> заголовке задать какое-то (любое) значение $http_host, это же значение >> получает и $host. >> >> Далее ( http://nginx.org/ru/docs/http/request_processing.html ): nginx >> "сопоставляет значение поля Host заголовка запроса с директивами server_name >> в блоках server, которые соответствуют IP-адресу и порту". Т.е. все-таки >> $http_host. А туда можно прописать что угодно. >> Я не рассматриваю сейчас ситуацию, когда в $http_host прописано имя, не >> совпадающее с перечисленными в server_name. Это все благополучно фильтруется >> и отправляется на 444. Также, я не рассматриваю браузеры, которые отправляют >> правильный $http_host и получают правильные редиректы. >> >> Вот такой случай: >> curl -ILH 'Host: www.test.com ' https://test.com >> >> Если бы переменная $host получила значение в порядке приоритета, оно было бы >> test.com (имя хоста из строки запроса). Тогда можно было бы реализовать >> такой костыль, как фильтрация по условию "$host не равно $http_host". Но в >> запросе присутствует заголовок host, и обе переменные $host и $http_host >> получают одно и то же значение www.test.com , отфильтровать невозможно. > > > >Вы видимо ошибочно считаете, что данная команда curl в качестве строки запроса >передает " https://test.com ". > >Нет, curl в данном случае в строке запроса передает "/". > >Чтобы увидеть, что конкретно посылает curl на сервер, можно добавить опцию >"-v". > >-- >Валентин Бартенев >___ >nginx-ru mailing list >nginx-ru@nginx.org >http://mailman.nginx.org/mailman/listinfo/nginx-ru ___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru
Зацикливание на редиректе
Доброго дня сообществу! Прошу совета по проблеме. Собственно, редирект с www на https без-www server { #1 http to https without www listen 1.2.3.4:80; server_name www.test.com test.com; rewrite ^ https://test.com$request_uri? permanent; } server { #2 https with www to https without www listen 1.2.3.4:443 ssl; server_name www.test.com; rewrite ^ https://test.com$request_uri? permanent; } server { #3 https without www listen 1.2.3.4:443 ssl; server_name test.com; ... } Насколько я понял из документации (http://nginx.org/ru/docs/http/ngx_http_core_module.html#var_host), переменная $host принимает значения "в порядке приоритета: имя хоста из строки запроса, или имя хоста из поля Host заголовка запроса, или имя сервера, соответствующего запросу" Судя по логам, это не совсем так. По крайней мере, в моем случае (nginx/1.10.2), переменная $host получает имя хоста из строки запроса только если не указано поле host заголовка. Т.е. обрабатывается ситуация с HTTP/1.0, без $http_host в заголовке. Но если в заголовке задать какое-то (любое) значение $http_host, это же значение получает и $host. Далее (http://nginx.org/ru/docs/http/request_processing.html): nginx "сопоставляет значение поля Host заголовка запроса с директивами server_name в блоках server, которые соответствуют IP-адресу и порту". Т.е. все-таки $http_host. А туда можно прописать что угодно. Я не рассматриваю сейчас ситуацию, когда в $http_host прописано имя, не совпадающее с перечисленными в server_name. Это все благополучно фильтруется и отправляется на 444. Также, я не рассматриваю браузеры, которые отправляют правильный $http_host и получают правильные редиректы. Вот такой случай: curl -ILH 'Host: www.test.com' https://test.com Если бы переменная $host получила значение в порядке приоритета, оно было бы test.com (имя хоста из строки запроса). Тогда можно было бы реализовать такой костыль, как фильтрация по условию "$host не равно $http_host". Но в запросе присутствует заголовок host, и обе переменные $host и $http_host получают одно и то же значение www.test.com , отфильтровать невозможно. Имя www.test.com перечислено в server_name, в итоге такой запрос успешно проходит фильтрацию. После сопоставления значения $http_host с server_name, nginx отправляет запрос в секцию 2, откуда возвращается 301 и новый location https://test.com , т.е. на выходе получаем тот же самый запрос (curl -ILH 'Host: www.test.com' https://test.com) и, естесвенно, зацикливание на второй секции: curl -ILH 'Host: www.test.com' https://test.com HTTP/1.1 301 Moved Permanently .. Location: https://test.com/ HTTP/1.1 301 Moved Permanently .. Location: https://test.com/ .. Это баг или фича? Или я что-то делаю не так? Как это побороть? Спасибо. --___ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru