Маршрутизация 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, которую вы используете сейчас? Какая разница с установленной вами версией?

Кроме того, пытались ли вы изменить конфигурацию для запуска для одного домена за раз, чтобы найти более ненормальное поведение и собрать больше информации об этой проблеме?

Другие вопросы по тегам