Вопрос или проблема
У меня nginx/1.12.0
и согласно документу он содержит модуль stream
. Я установил nginx с помощью следующих команд.
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get install nginx
nginx -v
nginx version: nginx/1.12.0
Я попытался добавить директиву stream в nginx.conf
:
stream {
upstream sys {
server 172.x.x.x:9516;
server 172.x.x.x:9516;
}
server {
listen 9516 udp;
proxy_pass sys;
}
}
но когда я перезапускаю nginx
, я получаю следующую ошибку в логах nginx
unknown directive "stream" in /etc/nginx/nginx.conf:86
nginx -V output
nginx version: nginx/1.12.0
built with OpenSSL 1.0.1f 6 Jan 2014
TLS SNI support enabled
configure arguments: --with-cc-opt="-g -O2 -fPIE -fstack-protector --param=ssp -buffer-size=4 -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2" --w ith-ld-opt="-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -fPIC" --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/ var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path =/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/ modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-p ath=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http- scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_m odule --with-http_realip_module --with-http_auth_request_module --with-http_v2 _module --with-http_dav_module --with-http_slice_module --with-threads --with- http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_modul e --with-http_gzip_static_module --with-http_image_filter_module=dynamic --wit h-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with -stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with -mail_ssl_module --add-dynamic-module=/build/nginx-ZgS12K/nginx-1.12.0/debian/ modules/nginx-auth-pam --add-dynamic-module=/build/nginx-ZgS12K/nginx-1.12.0/d ebian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-ZgS12K/ng inx-1.12.0/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-ZgS12K/ nginx-1.12.0/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/ng inx-ZgS12K/nginx-1.12.0/debian/modules/ngx_http_substitutions_filter_module
Я гуглил эту ошибку, и некоторые люди говорят, что мне нужно установить/настроить этот модуль отдельно. Некоторые говорят, что он идет с релизом nginx
1.12.0. Может кто-нибудь подсказать, как мне установить/настроить этот модуль на уже установленном nginx
?
С уважением
VG
Модуль stream добавляется как динамический, согласно:
--with-stream=dynamic
Вам нужно, чтобы он был ‘статическим’ — чтобы загрузить модуль напрямую. Для этого добавьте следующее в самом начале вашего nginx.conf:
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
Затем:
nginx -t
Если всё в порядке:
nginx -s reload
service nginx restart
Редактировать:
-s signal' Отправить сигнал главному процессу. Аргумент сигнал может быть одним из: stop, quit, reopen, reload. Следующая таблица показывает соответствующие системные сигналы.
stop' SIGTERM
quit' SIGQUIT
reopen' SIGUSR1
reload' SIGHUP
Я столкнулся с этой проблемой с nginx
на Amazon Linux, работающим на экземпляре AWS EC2, и моя папка /usr/lib64/nginx/modules/
была пустой.
Я установил модуль с помощью yum
:
yum install nginx-mod-stream
Теперь директива stream
работает без изменения nginx.conf
.
У меня недостаточно репутации, чтобы прокомментировать ответ Джо, поэтому пишу здесь:
На CentOS7 путь к модулям находится в папке lib64. Таким образом, вам нужно добавить эту строку:
load_module '/usr/lib64/nginx/modules/ngx_stream_module.so';
Экземпляр Amazon Linux
- Если вы получаете ошибку “nginx: [emerg] “load_module” directive is specified too late in /usr/share/nginx/modules/mod-stream.conf:1″
- путь существует по умолчанию. Кажется, вы дублируете строку.
Так что всё, что вам нужно сделать, это:
- yum install nginx-mod-stream
Ответ или решение
Ошибка "unknown directive ‘stream’" в NGINX может возникнуть по нескольким причинам, связанной с конфигурацией и сборкой самого веб-сервера. Ниже приводится подробное объяснение, почему эта ошибка возникает и как ее можно устранить.
Причины возникновения ошибки
-
Отсутствие модуля stream: Несмотря на то что версия NGINX 1.12.0 действительно включает в себя модуль stream, если он собран как динамический модуль, необходимо убедиться, что он загружен в конфигурации NGINX.
-
Неправильная конфигурация: При добавлении директивы
stream
в файл конфигурации/etc/nginx/nginx.conf
, если модуль stream не был правильно загружен, NGINX не сможет распознать эту директиву. -
Версия NGINX: Проверка вывода
nginx -V
показывает, что модуль stream собран как динамический (т.е. опция--with-stream=dynamic
). Это означает, что для его использования необходимо явно указать путь к модулю в конфигурационном файле.
Решение проблемы
Вот несколько шагов, которые могут помочь вам устранить эту ошибку:
1. Проверьте наличие модуля
Убедитесь, что файл модуля ngx_stream_module.so
существует в директории с модулями. Обычно для установки модуля на Ubuntu он будет находиться в /usr/lib/nginx/modules/
. Для CentOS или Amazon Linux путь может быть другим, например /usr/lib64/nginx/modules/
.
2. Добавьте директиву load_module
Если модуль существует, добавьте следующую строку в верхнюю часть вашего конфигурационного файла /etc/nginx/nginx.conf
:
load_module /usr/lib/nginx/modules/ngx_stream_module.so;
Для CentOS 7 или Amazon Linux путь будет:
load_module /usr/lib64/nginx/modules/ngx_stream_module.so;
3. Протестируйте конфигурацию
Прежде чем перезапускать NGINX, проверьте конфигурацию на наличие ошибок:
nginx -t
Если тест прошел успешно, следующий шаг — перезагрузить NGINX. Вы можете использовать одну из следующих команд:
nginx -s reload
или
service nginx restart
Дополнительные рекомендации
Если после выполнения вышеперечисленных шагов ошибка все равно сохраняется, возможно, вам нужно будет установить модуль stream через менеджер пакетов. Для этого вы можете использовать команду:
# Для Amazon Linux или CentOS
yum install nginx-mod-stream
Эта команда установит модуль stream, и, как укороченная версия, вы сможете использовать директиву stream
без дополнительных манипуляций с конфигурацией.
Заключение
Ошибка "unknown directive ‘stream’" может быть легко устранена при условии, что тот модуль, который вы пытаетесь использовать, правильно установлен и загружен. Следуя указанным рекомендациям, вы сможете успешно настроить NGINX для работы с UDP и другими протоколами, поддерживаемыми модулем stream. Если возникнут дальнейшие вопросы или проблемы, не стесняйтесь обращаться за помощью.