本地主机反向代理失败 nginx AWS Ubuntu

本地主机反向代理失败 nginx AWS Ubuntu

我正在尝试使用 Gunicoron 在托管多个 Nginx Web 服务的服务器上托管 Flask 应用程序。我正在使用 AWS ubuntu 作为测试平台,最终将其托管在所述 Nginx 多个 Web 服务(不是 AWS)上。我一直试图通过将 IP 从外部 AWS 更改为带有套接字 8006 和其他套接字的本地主机 127.0.0.1 来使其处于生产状态。我尝试进行反向代理,但没有成功。我收到 502 Bad Gateway 错误,错误如下:

站点错误日志

2019/06/11 05:08:58 [错误] 9310#9310:*9 connect()连接到上游时失败(111:连接被拒绝),客户端:162.155.112.131,服务器:127.0.0.1,请求:“GET /favicon.ico HTTP/1.1”,上游:“http://127.0.0.1:8006/favicon.ico",主机:AWS

错误日志:

2019/06/11 05:08:08 [emerg] 9311#9311:open()“/run/nginx.pid”失败(13:权限被拒绝)2019/06/11 05:08:25 [warn] 9313#9313:无法构建最佳 proxy_headers_hash,您应该增加 proxy_headers_hash_max_size:512 或 proxy_headers_hash_bucket_size:64;忽略 proxy_headers_hash_bucket_size

以下是代码的复现。我尝试展示我所做的事情,同时使其可复现

/etc/nginx/sites-available/Flask

upstream tester {
    server 127.0.0.1:3306;
}
server {
    listen 80;
    server_name 127.0.0.1;
    listen [::]:80;
    listen 443 ssl;
    location / {
        include proxy_params;
#       proxy_pass 34.215.33.211;
#       proxy_pass http://unix:/tmp/Flask.sock;
        proxy_pass http://127.0.0.1:8006;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location ^~ /static/  {
        rewrite ^/static$ / break;
        rewrite ^/static/(.*) /$1 break;
        include  /etc/nginx/mime.types;
        proxy_pass http://127.0.0.1:8009;
        }

}

/etc/nginx/nginx.conf(仅限虚拟主机)

  ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

请并感谢您帮助我解决这个问题。

編輯:http://unix:/tmp/Flask.sock适用于我的 AWS 上的代理传递,但不适用于生产服务器

编辑2:现在我还会触发以下 500 个错误:

768 worker_connections are not enough while connecting to upstream, client: 127.0.0.1, server: [AWS] request: "GET /favicon.ico HTTP/1.0"

/etc/nginx/sites-available/Flask 的代码现在如下:

upstream gnx{
        server  127.0.0.1:8006;
}
server {
    listen 80;
    server_name [AWS URL];
    listen [::]:80;
    listen 8006;
    listen [::]:8006;
    listen [::1];
    access_log /var/log/nginx/site_access.log;
    error_log /var/log/nginx/site_error.log;

    location / {
        include proxy_params;
#        proxy_pass http://unix:/tmp/Flask.sock;
        proxy_pass http://gnx;
        proxy_redirect off;
    }
    location ^~ /static/  {
        #root  /home/ubuntu/Flask/static/;
        #proxy_pass http://gnx;

        proxy_redirect http://127.0.0.1:8006/static/ http://$host/static/;
        proxy_set_header SCRIPT_NAME /static;
        }

    location /docs  {
        alias /home/ubuntu/Flask/docs;
 }
}

答案1

好的,我发现了这个问题,所以首先让我们解决 /sites-available/Flask (或 /default)文件

upstream gnx{
        server  127.0.0.1:8006;
}
server {
    listen 80;
    server_name [AWS URL];
    listen [::]:80;
    listen [::1];
    access_log /var/log/nginx/site_access.log;
    error_log /var/log/nginx/site_error.log;

    location / {
        include proxy_params;
#        proxy_pass http://unix:/tmp/Flask.sock;
        proxy_pass http://gnx;
       proxy_set_header X-SCRIPT-NAME "/";
    }
    location ^~ /static/  {
        #root  /home/ubuntu/Flask/static/;
        #proxy_pass http://gnx;

        proxy_redirect http://127.0.0.1:8006/static/ http://$host/static/;
        proxy_set_header SCRIPT_NAME /static;
        }

    location /docs  {
        alias /home/ubuntu/Flask/docs;
 }
}

因此我们不需要监听端口 8006,因为我们将使用它们。我们添加的下一部分是以下内容:

proxy_set_header X-SCRIPT-NAME "/";

X-SCRIPT-NAME 允许将 Flask 反向代理重定向到 Flask 脚本。您也可以将其放在 proxy_params 文件 (/etc/nginx/proxy_params) 中,我就是这么做的,但我想将其放在脚本中以便可见。

现在,诀窍是实现反向代理。这是您要输入的 Python 代码和函数:

from werkzeug.serving import WSGIRequestHandler
class ScriptNameHandler(WSGIRequestHandler):
    def make_environ(self):
        environ = super().make_environ()
        script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
        if script_name:
            environ['SCRIPT_NAME'] = script_name
            path_info = environ['PATH_INFO']
        if path_info.startswith(script_name):
            environ['PATH_INFO'] = path_info[len(script_name):]
        scheme = environ.get('HTTP_X_SCHEME', '')
        if scheme:
            environ['wsgi.url_scheme'] = scheme
        return environ

最后,对于您的 app.run 文件,您需要将其切换为以下内容:

app.run(request_handler=ScriptNameHandler)

现在它为你运行反向代理并完成设置。此方法 99.9% 源自大卫其中也有 Apache 版本。我希望它能帮助大家解决这个问题。

相关内容