Внесите WWW за балансировщик нагрузки AWS EC2

Я придумал небольшую проблему, мы используем балансировщик нагрузки для нового проекта, но мы не можем заставить www. без перекрестного цикла между запросами.

В настоящее время мы используем NGINX, а фрагмент для перенаправления:


ЗАГРУЗКА БАЛАНСА NGINX CONFIG

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/mywebsite.com/before/*;

# FORGE CONFIG (DOT NOT REMOVE!)
include upstreams/mywebsite.com;

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name .mywebsite.com;

    if ($host !~* ^www\.){
        rewrite ^(.*)$ https://www.mywebsite.com$1;
    }

    # FORGE SSL (DO NOT REMOVE!)
    ssl_certificate /etc/nginx/ssl/mywebsite.com/225451/server.crt;
    ssl_certificate_key /etc/nginx/ssl/mywebsite.com/225451/server.key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    charset utf-8;

    access_log off;
    error_log  /var/log/nginx/mywebsite.com-error.log error;

    # FORGE CONFIG (DOT NOT REMOVE!)
    include forge-conf/mywebsite.com/server/*;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://370308_app/;
        proxy_redirect off;

        # Handle Web Socket Connections
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/mywebsite.com/after/*;

HTTP-СЕРВЕР NGINX CONFIG

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/mywebsite.com/before/*;

server {
    listen 80;
    listen [::]:80;
    server_name .mywebsite.com;
    root /home/forge/mywebsite.com/public;

    if ($host !~* ^www\.){
        rewrite ^(.*)$ https://www.mywebsite.com$1;
    }

    # FORGE SSL (DO NOT REMOVE!)
    # ssl_certificate;
    # ssl_certificate_key;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/dhparams.pem;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    # FORGE CONFIG (DOT NOT REMOVE!)
    include forge-conf/mywebsite.com/server/*;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/mywebsite.com-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

# FORGE CONFIG (DOT NOT REMOVE!)
include forge-conf/mywebsite.com/after/*;

Thing is, с этой конфигурацией я получаю только переадресацию циклов с сервера.

Помогите пожалуйста: D < 3

Ответ 1

После написания предыдущего ответа общего назначения я Googled "FORGE CONFIG (DOT NOT REMOVE!)" , и это было первое результат:

https://laracasts.com/discuss/channels/forge/forge-how-to-disable-nginx-default-redirection

внутри файла nginx/forge-conf/be106.net/before/redirect.conf есть эта простая конфигурация:

…
server_name www.my-domain.net;
return 301 $scheme://my-domain.net$request_uri;
…

существует простой способ удалить это без изменения самого файла (поскольку он выглядит как плохая идея).

Итак, похоже, что перенаправление вызвано приложением, которое вы используете, поэтому мы нашли наиболее вероятную причину цикла!


В свою очередь, подходящий способ настроить ваше приложение, чтобы избежать указанного цикла, будет за пределами оценки StackOverflow.

Однако, как обходной путь:

  • рассмотрите, действительно ли вам нужны все эти директивы forge-conf include на уровне балансировки нагрузки; впоследствии вы могли бы подделать соответствующий домен, который должен быть передан на бэкэнд, который не вызвал бы перенаправление (при условии, что вы удалите свои избыточные перенаправления):

    -        proxy_set_header Host $http_host;
    +        proxy_set_header Host example.com;
    
  • обратите внимание, что причина, по которой директива forge-conf/example.com/before/redirect.conf имеет приоритет над вашей собственной конфигурацией для .example.com, - это порядок директивы - вы можете перенести /before/* include на свою собственную конфигурацию, если бы такой ход имел бы смысл.

Ответ 2

  • Я не думаю, что предоставленные вами фрагменты nginx вызовут цикл переадресации.

  • Во-первых, вам нужно выяснить, действительно ли это перенаправление - очень часто в этих вопросах, ответ 301 Moved Permanently кэшируется в вашем браузере, а затем вы видите кешированную версию вместо новой.

  • Впоследствии вам нужно выяснить, что вызывает цикл перенаправления:

    • Попробуйте добавить уникальные строки к каждой директиве redirect, чтобы посмотреть, какой из них вызывает цикл.

      if ($host !~* ^www\.) {return 301 $scheme://www.$host/levelX$request_uri}
      
    • Спросите себя, почему у вас так много директив перенаправления в первую очередь - похоже, нет веской причины иметь директивы перенаправления как на внешнем балансировщике нагрузки, так и на бэкенд.

  • Если вышеуказанное не разрешает проблему, то вы знаете, что цикл перенаправления не поступает из файлов, которые вы предоставили, и вам нужно копать глубже - возможно, что это происходит из какого-то другого файлы, возможно, одна из ваших директив include или, возможно, сервер по умолчанию www.example.com определен в другом месте, который перенаправляется на example.com, или, возможно, перенаправление выполняется на уровне приложения.