【问题标题】:How to make try_files with multiple fallbacks work in nginx?如何使具有多个后备的 try_files 在 nginx 中工作?
【发布时间】:2019-01-30 21:43:08
【问题描述】:

我让 nginx 作为两个应用服务器的代理运行:daphnegunicorn

我的 webApp 是一个 AngularJs 单页应用程序。所以我需要使用prerender.io来帮助机器人抓取网站。

我的 nginx 文件:

upstream ex_server{
 server unix:/home/webapps/ex/run/gunicorn.sock fail_timeout=0;
}

upstream channels-backend {
    server 0.0.0.0:8001;
}

server {
    server_name example.com;
    listen 80; 
        rewrite ^ https://$http_host$request_uri permanent;
}

server {
    server_name example.com;

    listen 443 ssl;
    ssl_certificate /etc/ssl/_cert_chain.crt;
    ssl_certificate_key /etc/ssl/_in.key; 

    root /usr/share/nginx/html;

    server_name _;

    location / {
            try_files /$uri @prerender;
            #try_files /$uri @prerender @proxy_to_main_app; <= I wanted this
    }

    location @proxy_to_main_app {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto https;  # <-
            proxy_set_header Host $http_host;
            proxy_redirect off;
            #proxy_buffering off;

            try_files $uri @proxy_to_daphne_app;

        if (!-f $request_filename) {
            proxy_pass http://ex_server;
            break;
        }
    }

location @proxy_to_daphne_app {
    proxy_pass http://channels-backend;
    proxy_set_header X-Forwarded-Proto https;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    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;
}

location @prerender {
    proxy_set_header X-Prerender-Token RMVQxJkVVugDjcPgHakN;
    set $prerender 0;
    if ($http_user_agent ~* "googlebot|bingbot|yandex|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;
    }
    if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {
        set $prerender 0;
    }

    resolver 8.8.8.8;

    if ($prerender = 1) {
        set $prerender "service.prerender.io";
        rewrite .* /$scheme://$host$request_uri? break;
        proxy_pass http://$prerender;
    }
    if ($prerender = 0) { 
        # here is the problem. when $prerender=0 means it isn't the crawler requesting a rendered page but an actual user. So, we need to show path to our webApp as usual.
    }
}

    }

如您所见,我有三个备用方案@prerender@proxy_to_main_app@proxy_to_daphne_app

现在@prerender 工作正常。但是if($prerender=0),我需要试试@proxy_to_main_app,即,

if($prerender=0){
    try_files @proxy_to_main_app
}

但这不起作用。 nginx 不允许 try_files 在 if 中。

请帮助解决方法。我已经浏览了其他所有帖子。但无济于事。

【问题讨论】:

    标签: django nginx prerender


    【解决方案1】:

    try_files 中只能有一个 @ 位置,因此您可能想尝试将它们组合起来。您的 try_files 的 $uri 部分实际上是否匹配此文件系统上的任何文件,或者您只是代理请求?像这样的东西有用吗?

    upstream ex_server{
     server unix:/home/webapps/ex/run/gunicorn.sock fail_timeout=0;
    }
    
    upstream channels-backend {
        server 0.0.0.0:8001;
    }
    
    server {
        server_name example.com;
        listen 80; 
            rewrite ^ https://$http_host$request_uri permanent;
    }
    
    server {
        server_name example.com;
    
        listen 443 ssl;
        ssl_certificate /etc/ssl/_cert_chain.crt;
        ssl_certificate_key /etc/ssl/_in.key; 
    
        root /usr/share/nginx/html;
    
        server_name _;
    
        location / {
                proxy_set_header X-Prerender-Token YOUR_TOKEN;
                set $prerender 0;
                if ($http_user_agent ~* "googlebot|bingbot|yandex|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;
                }
                if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {
                    set $prerender 0;
                }
    
                resolver 8.8.8.8;
    
                if ($prerender = 1) {
                    set $prerender "service.prerender.io";
                    rewrite .* /$scheme://$host$request_uri? break;
                    proxy_pass http://$prerender;
                }
    
                try_files /$uri @proxy_to_main_app;
        }
    
        location @proxy_to_main_app {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;  # <-
                proxy_set_header Host $http_host;
                proxy_redirect off;
                #proxy_buffering off;
    
                try_files $uri @proxy_to_daphne_app;
    
            if (!-f $request_filename) {
                proxy_pass http://ex_server;
                break;
            }
        }
    
        location @proxy_to_daphne_app {
            proxy_pass http://channels-backend;
            proxy_set_header X-Forwarded-Proto https;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
    
            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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 2014-02-12
      • 2018-12-19
      • 2017-02-11
      • 2014-08-19
      • 1970-01-01
      • 2018-04-01
      • 2021-02-20
      • 2014-02-05
      相关资源
      最近更新 更多