nginx: как настроить серверные блоки, чтобы разрешить поддомен

#nginx #dns #subdomain #openresty

Вопрос:

У меня есть openresty, работающий на моем экземпляре aws (экземпляр A), и ip-адрес сервера уже привязан к доменному имени myapp.john.com .

Мое приложение работает на другом экземпляре aws (экземпляр B) в той же частной сети. У него есть частный ip-адрес 192.42.56.87 , и приложение работает на порту :80 .

Я хочу настроить свой openresty / nginx таким образом , чтобы при посещении prod.myapp.john.com nginx указывал мне 192.42.56.87:80 . И при посещении test.myapp.john.com nginx направляет меня к другому экземпляру (экземпляру C), на котором запущена тестовая версия моего приложения, скажем, на 192.xx.xx.xx:80

Ниже приведен код в (пример А):

Основной файл конфигурации /usr/local/openresty/nginx/conf/nginx.conf определяется как:

 # Main NGNX Config File
#user www-data;
worker_processes  auto;
pid logs/nginx.pid;

error_log  logs/error.log  info;
error_log  logs/error.log  notice;
error_log  logs/error.log  debug;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    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  logs/access.log  main;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay     on;

    keepalive_timeout  65;
    keepalive_requests 100000;

    resolver 8.8.8.8 valid=30s ipv6=off;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    gzip  on;

    # Include all the sites for the domain
    include /usr/local/openresty/nginx/sites/*;

}
 

/usr/local/openresty/nginx/sites/prod.myapp.john.com определяется как:

 server {
  listen 80;
  listen [::]:80;
  server_name prod.myapp.john.com; // this does not work; but "myapp.john.com" works
  return 301 https://$host$request_uri;
}

server {
  listen 443 ssl;
  server_name prod.myapp.john.com; // this does not work; but "myapp.john.com" works

  ssl_certificate      /etc/letsencrypt/live/myapp.john.com/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/myapp.john.com/privkey.pem;

  location / {
    proxy_pass http://192.42.56.87:80/;

    expires 0;

    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-Forwarded-Proto  $scheme;

    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;

  }
}

 

Теперь, в браузере chrome , когда я посещаю prod.myapp.john.com , ответа вообще нет, так как запрос никогда не попадает в мой экземпляр A;

Однако, если я изменюсь

server_name prod.myapp.john.com

Для

server_name myapp.john.com

это работает, и веб — страница отображается.

Почему? Как я могу включить больше файлов сайта /usr/local/openresty/nginx/sites/ и правильно настроить server блоки в конфигурации, чтобы предоставить больше поддоменов на моем сайте?

Комментарии:

1. В чем заключается ошибка? Это 404 от nginx, 500 от nginx или может быть, вы просто не настроили поддомены в своем DNS? Если вы просто добавите myapp.john.com , DNS ничего не вернет *.myapp.john.com

2. Глупая я. Я предполагал, что у меня есть DNS-запись поддомена с подстановочными знаками, но это не так.