Я пытаюсь настроить дружественное к SEO приложение Angular с nginx и докером на низкоэффективном оборудовании.Идея состоит в том, чтобы использовать SSR с агрессивным кэшированием для неавторизованных пользователей, а CSR для авторизованных пользователей.
Я разработал следующий макет контейнеров докеров и их связность: Эта схема содержит контейнеры 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-готов.Можно ли его как-то упростить или сделать более стабильным?