У меня были небольшие проблемы с тем, чтобы Nginx нормально работал с библиотекой Python Flask-socketio (которая основана на gevent). В настоящее время, поскольку мы активно развиваемся, я пытаюсь заставить Nginx работать просто как прокси. Для отправки страниц я могу заставить это работать, либо напрямую запустив приложение flask-socketio, либо запустив gunicorn. Одна загвоздка: обмен сообщениями через веб-сокет не работает. Страницы успешно размещены и отображаются. Однако, когда я пытаюсь использовать веб-сокеты, они не работают. Они достаточно живы, чтобы веб-сокет думал, что он подключен, но они не будут отправлять сообщение. Если я удалю прокси Nginx, они будут работать. Firefox выдает мне эту ошибку, когда я пытаюсь отправить сообщение:
Firefox не может установить соединение с сервером по адресу ws: ///socket.io/1/websocket/.
Где веб-адрес - это место, где расположен сервер, а уникальный идентификатор - это просто набор случайных цифр. Кажется, что этого достаточно, чтобы поддерживать соединение (например, клиент думает, что оно подключено), но не может отправить сообщение через веб-сокет. Я должен думать, что проблема связана с какой-то частью прокси, но у меня серьезные проблемы с отладкой, в чем может быть проблема (отчасти потому, что это мой первый обход как с Flask-socketIO, так и с nginx). Файл конфигурации, который я использую для nginx:
user <user name>; ## This is set to the user name for the remote SSH session
worker_processes 5;
events {
worker_connections 1024; ## Default: 1024
}
http {
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
sendfile on;
server_names_hash_bucket_size 128; # this seems to be required for some vhosts
server {
listen 80;
server_name _;
location / {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
}
Я сделал файл конфигурации как смесь общего примера и конкретного веб-сокета, но попытка возиться с ним не решила проблему. Кроме того, я использую вызов werkzeug Proxy_Fix в моем Flask app.wsgi_app, когда я использую его в режиме wsgi. Я пробовал с этим и без него, однако безрезультатно. Если у кого-то есть понимание, я буду всем ушами / глазами.