Я пытаюсь разместить приложение 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. Надеюсь, это поможет кому-нибудь в этом вопросе.