Назад | Перейти на главную страницу

Обратный прокси-сервер localhost не работает nginx AWS Ubuntu

Я пытаюсь разместить приложение Flask с Gunicoron на сервере, на котором размещено несколько веб-сервисов на Nginx. Я использую AWS ubuntu в качестве испытательного стенда для постоянного размещения его на указанной веб-службе Nginx mutilple (это не AWS). Я пытался сделать его производственным, изменив IP-адрес с внешнего AWS на localhost 127.0.0.1 с сокетом 8006, а также с другими. Я безуспешно пытался сделать обратное проксирование. Я получаю ошибку 502 Bad Gateway со следующей ошибкой:

Журнал ошибок сайта

2019/06/11 05:08:58 [ошибка] 9310 # 9310: * 9 сбой подключения () (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

Вот воспроизведенный код. Я пытался показать, что я сделал, делая это воспроизводимым

/ и т.д. / nginx / сайты-доступные / 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;
 }
}

Хорошо, я обнаружил проблему, поэтому сначала давайте обратимся к файлу / 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. Надеюсь, это поможет кому-нибудь в этом вопросе.