2016-10-30 3 views
0

Если я правильно понимаю, я могу настроить nginx так, чтобы он обрабатывал сканеры (а не nodejs). Так что я удалил app.use(require('prerender-node').set('prerenderToken', 'token')) от экспресс-конфигурации и сделал следующее Nginx установки (я не использую PreRender маркер):Prerender с nginx и node.js возвращает 504

# Proxy/load balance (if more than one node.js server used) traffic to our node.js instances 
upstream my_server_upstream { 
    server 127.0.0.1:9000; 
    keepalive 64; 
} 

server { 
    listen 80; 

    server_name test.local.io; 
    access_log /var/log/nginx/test_access.log; 
    error_log /var/log/nginx/test_error.log; 
    root /var/www/client; 

    # Static content 
    location ~ ^/(components/|app/|bower_components/|assets/|robots.txt|humans.txt|favicon.ico) { 
    root /; 
    try_files /var/www/.tmp$uri /var/www/client$uri =404; 
    access_log off; 
    sendfile off; 
    } 

    # Route traffic to node.js for specific route: e.g. /socket.io-client 
    location ~ ^/(api/|user/|en/user/|ru/user/|auth/|socket.io-client/|sitemap.xml) { 
    proxy_redirect  off; 
    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_set_header Connection ""; 
    proxy_http_version 1.1; 
    proxy_pass_header X-CSRFToken; 
    sendfile off; 
    # Tells nginx to use the upstream server 
    proxy_pass   http://my_server_upstream; 
    } 

    location/{ 
    root /var/www/client; 
    index index.html; 
    try_files $uri @prerender; 
    access_log off; 
    sendfile off; 
    } 

    location @prerender { 
    set $prerender 0; 
    if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") { 
     set $prerender 1; 
    } 
    if ($args ~ "_escaped_fragment_") { 
     set $prerender 1; 
    } 
    if ($http_user_agent ~ "Prerender") { 
     set $prerender 0; 
    } 

    #resolve using Google's DNS server to force DNS resolution and prevent caching of IPs 
    resolver 8.8.8.8; 

    if ($prerender = 1) { 
     #setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing 
     set $prerender "127.0.0.1:3000"; 
     rewrite .* /$scheme://$host$request_uri? break; 
     proxy_pass http://$prerender; 
    } 
    if ($prerender = 0) { 
     rewrite .* /index.html$is_args$args break; 
    } 
    } 
} 

Но когда я проверить его curl test.local.io?_escaped_fragment_= я got 504 in 344ms for http://test.local.io

Node версия 6.9.1. Я использую бродягу для настройки среды.

+0

У вас есть сервер prerender, работающий по адресу http://127.0.0.1:3000? Какой результат вы видите на консоли prerender при доступе к URL?? _escaped_fragment_ = '? –

+0

Сервер Prerender работает на 127.0.0.1:3000, а вывод: 'получил 504 в 344ms для http: // test.local.io' всякий раз, когда я' curl test.local.io? _escaped_fragment_ = ' – user2814599

+1

Если вы зависете http: //127.0.0.1: 3000/http: // test.local.io/'он все еще возвращает 504? Доступен ли 'test.local.io' с сервера, на котором запущен сервер Prerender? –

ответ

0

Указанная конфигурация работает нормально. Все, что было пропущено, это запись в /etc/hosts: 127.0.0.1 test.local.io