Nginx Угловой Докер - PullRequest
       4

Nginx Угловой Докер

0 голосов
/ 28 февраля 2019

Я запускаю docker-compose с одним внешним и двумя внутренними серверами.Запросы к бэкэндам работают как шарм, я могу перемещаться в своем приложении с помощью angulars router.URL-адреса изменены в моем браузере, но я предполагаю, что это делается как-то внутренне с помощью angular.Мой baseref - /. Я также попробовал его с ./.

. Проблема: Как только я перезагрузил страницу (или ввел uri вручную), который не является индексом, nginx пытается переслать эту страницу в @nodeгде это не найдено.Затем я мог бы перенаправить с помощью Express на index, но это не похоже на легкое решение для меня.

Моя конфигурация nginx:

#This is a minimalist nginx configuration file that might be an appropriate starting point for dev work
#This file was not developed with the intent of being used on a production environment.
#user nobody nogroup;

worker_processes 1;

pid        /var/log/nginx/nginx.pid;
error_log  /var/log/nginx/error.log error;

events {
    worker_connections 512;
}

http {
  include   /etc/nginx/mime.types;

  #send all requests which are not served by nginx to nodejs core
  upstream docker-node {
      server myapp_core:3000;
  }
  upstream docker-intergram {
      server myapp_intergram:5000;
  }

  #chatbot
  server {
    listen 8443 default_server ssl;
    ssl_certificate /etc/ssl/cert_chain.crt;
    ssl_certificate_key /etc/ssl/my-app.key;
    server_name my-app.com;

    location / {
        proxy_pass         http://docker-intergram;
        proxy_redirect     off;
        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-Host $server_name;
    }
  }

  #redirect to ssl
  server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 301 https://$host$request_uri;
  }

  # nginx server instance
  server {
      access_log /var/log/nginx/access.log;
      listen 443 default_server ssl;
      ssl_certificate /etc/ssl/cert_chain.crt;
      ssl_certificate_key /etc/ssl/my-app.key;
      server_name my-app.com;

      client_header_buffer_size 256k;
      large_client_header_buffers 8 1024k;
      client_max_body_size 5M;

      location /assets {
          alias /usr/src/app/assets/;
      }

      location /node_modules {
          alias /usr/src/app/node_modules;
      }

      location / {
          index index.html index.htm;
          root /usr/src/app;
          # try_files $uri $uri/ @node;
          try_files $uri$args $uri$args/ $uri/ @node;
      }

      location @node {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;
          proxy_buffering on;

          proxy_pass http://docker-node;
          proxy_redirect off;

          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
      }

      location /socket.io/ {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host $http_host;
          proxy_set_header X-NginX-Proxy true;
          proxy_buffering off;

          proxy_pass http://docker-node;
          proxy_redirect off;

          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
     }
  }

}

Ни

try_files $uri $uri/ @node;

, ни(из nginx-angular2-angular-routs )

try_files $uri$args $uri$args/ $uri/ @node; # solution from other stackoverflow question does not work

работа.

В этом решении , похоже, не соответствует индексу, ноЯ бы хотел, чтобы мои внутренние маршруты оставались без префикса.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Как и предполагалось, порядок расположения важен.попробуйте что-то вроде этого (далее я использую префикс для всех API)

upstream node_server {
  server localhost:3000;
}

server {
    listen 80;

     root /home/ec2-user/Elaisian/dist/;
     include /etc/nginx/default.d/*.conf;

    if ($http_x_forwarded_proto = 'http'){
       return 301 https://$host$request_uri;
    }

location /api/ {
   proxy_pass http://node_server/api/;
   proxy_http_version 1.1;
   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;
 }

 location / {
   try_files $uri $uri/ /index.html;
 }
0 голосов
/ 28 февраля 2019

Я думаю, что порядок маршрута имеет значение в конфиге nginx.Я рекомендую указывать маршрут "location /" как последний маршрут.В противном случае он может перезаписать маршруты, которые следуют, может произойти с вашим маршрутом /socket.io?

Попробуйте изменить строку try_files в расположении / на:

try_files $uri /index.html

Я использую это, чтокстати в моей настройке и все работает.Если вам нужна конфигурация в @node для вашего корневого местоположения, вы можете скопировать ее в это местоположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...