为什么反向代理不能指向其自身?

为什么反向代理不能指向其自身?

当我将反向代理设置为从其自己的端口 80 转发到其自己的端口 8080 时,我收到以下警告

2016/03/28 22:05:59 [alert] 4193#0: 512 worker_connections are not enough

这可能是无限循环的结果。

在接受的答案中Nginx 配置:前端反向代理到另一个端口,用户写道:“我假设 nginx 不是监听端口 5010 和 80 的服务器,对吗?”是因为反向代理无法转发到自身吗?还是说这个无限循环的发生还有其他原因,而那条评论只是转移注意力的借口?

下面是我的 nginx.conf。当我访问 router.example.com 时,我收到警告。当我删除 之间的内容时#### BEGIN BAD LINES ####,它运行正常。

user    root;
worker_processes    1;
worker_cpu_affinity 0101;
master_process  off;
worker_priority 10;
error_log   /tmp/var/log/nginx/error.log;
pid /tmp/var/run/nginx.pid;
worker_rlimit_nofile    8192;
events {
    worker_connections  512;
}
http {
    log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';

    # Because end of http://nginx.org/en/docs/http/server_names.html
    server_names_hash_bucket_size  64; 


    # From NixCraft
    # http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html

    # Host required
    server {
        listen      80 default_server;
        server_name "";
        return      444;
    }

  #### BEGIN BAD LINES ####
    ## Start router proxy ##
    server {
        listen       80;
        server_name  router.example.com
                     tomatopaste.example.com;
        access_log  /var/log/nginx/log/router.example.access.log  main;
        error_log  /var/log/nginx/log/router.example.error.log;

        ## send request back to apache1 ##
        location / {
            proxy_pass  http://192.168.1.1:8080/;
            proxy_redirect default;
            proxy_buffering 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;
        }
    }
    ## End ##
  #### END BAD LINES ####


    ## Start primary proxy ##
    server {
        listen       80;
        server_name  jira.example.com
                     confluence.example.com
                     stash.example.com
                     cacti.example.com;
        access_log  /var/log/nginx/log/lamp.example.access.log  main;
        error_log  /var/log/nginx/log/lamp.example.error.log;

        ## send request back to apache1 ##
        location / {
             proxy_pass  http://192.168.1.99/;
             proxy_redirect default;
             proxy_buffering 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;
        }
    }
    ## End ##



    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    # Websockets
    server {
        listen 8686;
        server_name other.example.com;
        location / {
            proxy_pass http://192.168.1.99:8686;
            proxy_redirect default;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    } 
}

答案1

我认为问题不在于“为什么反向代理不能指向自身?”而是“为什么不应该反向代理指向自身吗?正如评论者指出的那样,、nginxhttpd其他代理软件配置为将连接代理回自身;软件或配置中没有任何内容防止这。

但是,正如您所猜测的,问题变成了资源问题。配置为将请求代理回自身(直接或间接通过另一个代理,例如httpd)的 HTTP 反向代理需要维护该请求的某些状态(以便将响应发送回调用者)。如果请求只是反复循环通过相同的代理(由于配置),最终会达到某些状态/资源限制,例如

512 worker_connections are not enough

并且请求转发终止。因此,“为什么不应该反向代理指向自身?”的常见问题是:“最终,反向代理会耗尽资源,无法正确处理请求。”随着链中反向代理数量的增加,无意配置导致循环/周期的可能性也会增加,并且随着循环中的代理数量的增加,更难探测这样的循环正在发生。(也许像httpd和这样的应用程序nginx可以检查像这样的标头X-Forwarded-For,假设标头值是可信的,以检测这样的循环,IE查看代理本身是否已经出现在该转发链中?)

在您的特定情况下,为了通过经验证明它确实是一个无限的转发循环,我们需要将httpd日志条目与nginx日志条目关联起来;我怀疑我们确实会通过这样做在反向代理图中看到循环。

希望这可以帮助!

相关内容