Маршрутизация nginx прервана после перезагрузки сервера
На сервере CentOS у меня есть установка nginx, которая действует как прокси для нескольких веб-приложений. Nginx настроен на маршрутизацию запросов на разные имена хостов на разные бэкэнд-серверы.
Этот сервер был настроен несколько месяцев назад, и до сих пор все работало нормально. После перезагрузки (вероятно, это была также первая перезагрузка после настройки nginx), nginx больше не маршрутизирует должным образом: он перенаправляет все запросы в один и тот же бэкэнд, независимо от имени хоста!
Следующее было проверено:
- Все серверные приложения работают и прослушивают соответствующие порты (проверено с помощью netstat)
- Конфигурация nginx не имеет ошибок (проверено с помощью sudo nginx -t)
- Nginx правильно читает все файлы конфигурации (проверено с помощью sudo nginx -T)
- Nginx не выводит никаких ошибок (/var/log/nginx/error.log пуст, sudo journalctl -u nginx не отображает ничего, что указывает на ошибку)
Рассматриваемый сервер содержит 4 приложения (2 пользовательских серверных приложения с именами "организатор" и "интеграция" в файлах конфигурации, самый важный сервер и сервер GITEA GIT). Весь трафик http перенаправляется на https.
Несмотря на конфигурацию, все перенаправляется в органайзер. Если бэкэнд органайзера закрыт, ничего не работает.
Ниже приведена конфигурация (отредактированные домены) как вывод nginx, нерелевантные части были удалены:
# configuration file /etc/nginx/nginx.conf:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
}
# configuration file /usr/share/nginx/modules/mod-http-geoip.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_geoip_module.so";
# configuration file /usr/share/nginx/modules/mod-http-image-filter.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_image_filter_module.so";
# configuration file /usr/share/nginx/modules/mod-http-perl.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_perl_module.so";
# configuration file /usr/share/nginx/modules/mod-http-xslt-filter.conf:
load_module "/usr/lib64/nginx/modules/ngx_http_xslt_filter_module.so";
# configuration file /usr/share/nginx/modules/mod-mail.conf:
load_module "/usr/lib64/nginx/modules/ngx_mail_module.so";
# configuration file /usr/share/nginx/modules/mod-stream.conf:
load_module "/usr/lib64/nginx/modules/ngx_stream_module.so";
# configuration file /etc/nginx/conf.d/http_to_https.conf:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 301 https://$host$request_uri;
}
# configuration file /etc/nginx/conf.d/integration.conf:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name integration.mydomain.org;
ssl on;
ssl_certificate /etc/nginx/ssl/mydomain_wildcard.pem;
ssl_certificate_key /etc/nginx/ssl/mydomain_wildcard.key;
location / {
proxy_pass http://localhost:3080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
}
}
# configuration file /etc/nginx/conf.d/mattermost.conf:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name chat.mydomain.org;
ssl on;
ssl_certificate /etc/nginx/ssl/mydomain_wildcard.pem;
ssl_certificate_key /etc/nginx/ssl/mydomain_wildcard.key;
location / {
proxy_pass http://localhost:8065;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
}
}
# configuration file /etc/nginx/conf.d/git.conf:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name git.mydomain.org;
ssl on;
ssl_certificate /etc/letsencrypt/live/git.mydomain.org/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/git.mydomain.org/privkey.pem; # managed by Certbot
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
}
}
# configuration file /etc/nginx/conf.d/organizer.conf:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name organizer.mydomain.org;
ssl on;
ssl_certificate /etc/nginx/ssl/mydomain_wildcard.pem;
ssl_certificate_key /etc/nginx/ssl/mydomain_wildcard.key;
location / {
proxy_pass http://localhost:3080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header X-Client-DN $ssl_client_s_dn;
proxy_set_header X-SSL-Subject $ssl_client_s_dn;
proxy_set_header X-SSL-Issuer $ssl_client_i_dn;
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
}
}
Эта проблема довольно загадочная, и я не смог найти ничего плохого, кроме того, что сервер не работает должным образом. Кто-нибудь видит (или знает...) причину, по которой nginx будет игнорировать свою конфигурацию и направлять все в один и тот же бэкэнд?
Дополнительная информация:
- Nginx находится на версии 1.12.2 (и не обновлялся с момента установки сервера)
2 ответа
Причина проблемы была найдена, и в первую очередь не имела отношения к nginx!
До того, как я использовал nginx, в то время существовало только одно бэкэнд-приложение. У меня были настроены некоторые правила брандмауэра для переадресации портов 80 и 443 на один сервер. Когда nginx был установлен, правила брандмауэра были удалены, чтобы освободить место для nginx - но, видимо, не навсегда!
Следовательно, все работало тогда. До перезагрузки, когда правила брандмауэра будут перезагружены в предыдущую конфигурацию. Несмотря на проверку netstat и iptables, все выглядело нормально.
Обнаружил проблему при попытке предложить nikpelgr попробовать одно приложение за один раз. Я обнаружил, что все это не имеет значения. После завершения работы nginx, просто чтобы попробовать, мой сервер все еще работал...
Уроки выучены:
- Попробуйте перезагрузить свой сервер, после того, как все настроено. Если он сломается, по крайней мере, все будет свежо в памяти...
- Netstat не учитывает firewalld.
Можете ли вы предоставить нам версию Nginx, которую вы используете сейчас? Какая разница с установленной вами версией?
Кроме того, пытались ли вы изменить конфигурацию для запуска для одного домена за раз, чтобы найти более ненормальное поведение и собрать больше информации об этой проблеме?