Конфигурация Docker и nginx для Angular SSR или CSR на основе аутентификации - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь настроить дружественное к SEO приложение Angular с nginx и докером на низкоэффективном оборудовании.Идея состоит в том, чтобы использовать SSR с агрессивным кэшированием для неавторизованных пользователей, а CSR для авторизованных пользователей.

Я разработал следующий макет контейнеров докеров и их связность: enter image description here Эта схема содержит контейнеры Backend, Fornted и Nginx Docker.Фронт-контейнер дополнительно предоставляет файлы Angular, чтобы позволить серверу Nginx сохранять их как статические для экономии ресурсов ЦП.Чтобы определить, прошел ли пользователь аутентификацию, я проверяю XSRF-TOKEN cookie.

Конфигурация nginx выглядит следующим образом:

    worker_processes auto;

    events {
      worker_connections 768;

    }

    http {

      access_log /etc/nginx/access_log.log;
      error_log /etc/nginx/error_log.log debug;


      client_max_body_size 20m;

      proxy_cache_path /etc/nginx/cache keys_zone=one:500m max_size=1000m;

      sendfile on;

      map $http_cookie $authTokenExists {
          default               "noToken";
          "~*XSRF-TOKEN=[^;]+"  "hasToken";
      }

      server {
        server_name myapp.com www.myapp.com;

        proxy_cache one;
        proxy_cache_key $request_method$request_uri;
        proxy_cache_min_uses 1;
        proxy_cache_methods GET;
        proxy_cache_valid 200 1m;

        listen [::]:444 http2 ssl;
        listen 444 http2 ssl;


        include /etc/nginx/mime.types;

        keepalive_timeout   70;
        ssl_certificate /etc/ssl/certs/myapp.com.crt;
        ssl_certificate_key /etc/ssl/private/myapp.com.key;

        gzip on;
        gzip_disable "msie6";
        gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml font/woff2;


        root /dist/browser/;

        location ~* \.(css|js|gif|jpe?g|png|svg)$ {

            add_header DebugAddCacheParamsToStatic true;

            expires 1M;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }

        location ~* \.(css|js|gif|jpe?g|png|svg)$ {

            add_header DebugServeStatic true;

            try_files $uri $uri/;
        }

        location / {

            add_header DebugRewriteToHasOrNoToken true;

            rewrite (.*) /$authTokenExists$1 last;
        }

        location /hasToken {

            add_header DebugServeHasToken true;

            rewrite /hasToken/(.*) /$1  break;

            try_files $uri $uri/ /index.html;

            http2_push /api/events;
        }

        location /noToken {

            add_header DebugServeNoToken true;

            rewrite /noToken/(.*) /$1  break;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port 444;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass  http://myapp-frontend:4000;
        }

        location /api {

            add_header DebugServeApi true;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port 444;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass  http://myapp-backend:8080/api;
        }

        location /login {

            add_header DebugServeLogin true;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port 444;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;

            proxy_pass  http://myapp-backend:8080/login;
        }
      }
    }

Эта схема притворяется, что работает, но я не уверена, что онадействительно PROD-готов.Можно ли его как-то упростить или сделать более стабильным?

...