Python 如何构建支持SSL的uWSGI以使用websocket握手API函数?

Python 如何构建支持SSL的uWSGI以使用websocket握手API函数?,python,nginx,websocket,uwsgi,Python,Nginx,Websocket,Uwsgi,我所拥有的: ubuntu 14.4 uwsgi使用flask(python)运行,nginx作为反向代理 我想要什么: 运行此WebSocket示例: 当我在端口5000上使用chromepy运行此应用程序时,它工作正常,但当我尝试在不使用chromepy的情况下运行时,会出现错误 错误: Thu Jun 12 12:58:24 2014 - you need to build uWSGI with SSL support to use the websocket handshake api

我所拥有的: ubuntu 14.4 uwsgi使用flask(python)运行,nginx作为反向代理

我想要什么: 运行此WebSocket示例:

当我在端口5000上使用chromepy运行此应用程序时,它工作正常,但当我尝试在不使用chromepy的情况下运行时,会出现错误

错误:

Thu Jun 12 12:58:24 2014 - you need to build uWSGI with SSL support to use the websocket handshake api function !!!
Traceback (most recent call last):
  File "/home/lab_alglab/rep/car/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/lab_alglab/rep/car/local/lib/python2.7/site-packages/flask_uwsgi_websocket/websocket.py", line 54, in __call__
    uwsgi.websocket_handshake(environ['HTTP_SEC_WEBSOCKET_KEY'], environ.get('HTTP_ORIGIN', ''))
IOError: unable to complete websocket handshake

只需安装openssl开发头文件(libssl dev)并重建uwsgi(其构建系统将自动检测ssl可用性)

我通过pip(在venv外部)安装uwsgi,并更改init脚本(Ubuntu)/etc/init.d/uwsgi来运行新安装的2.x分支(而不是1.9),从而修复了我的版本


Pip安装到/user/local/bin,因此我将行守护程序更改为:daemon=“/usr/local/bin/uwsgi”

您可以使用
LDFLAGS
指定开发头的位置。另一方面,由于El Capitan不再提供标题,这也可能发生在OS X上

LDFLAGS="-L/usr/local/lib" pip install uwsgi --no-use-wheel

正如下面提到的海报之一,您需要openssl头,如果它们位于非传统位置(例如在Mac OS-X上),您必须让uWSGI知道

在Debian/Ubuntu上,使用“apt get install libssl dev”安装它们。它们将进入/usr/include/“这是UWSGI自动路径的一部分。你应该完成

Mac OS-X El Capitan(10.11)删除了openssl标头。您可以使用此命令检查公共位置——它们可能是由brew或macports之类的软件包管理器安装的

find /usr/local/include /usr/include /opt/local/include /usr/local/ssl/include -name openssl -type d 2> /dev/null
如果该命令未返回任何内容,则需要安装头文件。您可以使用MacPorts(port install openssl)安装头文件。MacPorts(port install openssl)将头文件放入/opt/local/include中,并在/usr/local/include中创建一个链接。您还可以通过下载和取消标记openssl,运行“/Configure darwin64-x86_64-cc”,然后“make”直接安装头文件,最后是“sudo make install”

Xcode的构建实用程序包是一个完整的预定义构建环境。对于XCode项目,这意味着开发人员有一个共同的基础,基础之外的任何东西都必须在XCode项目中。在基本目录之外构建开源项目会有点混乱,因为像openssl这样的依赖关系存在于基本目录之外。您可以给uwsgi的构建链一个包含目录来使用。它不支持路径样式:分隔符

在大多数安装情况下,以下内容应适用于OpenSSL

UWSGI_INCLUDES=/usr/local/include/ pip install uwsgi  

我必须通过brew安装OpenSSL。然后运行这个命令

CFLAGS="-I/usr/local/opt/openssl/include" LDFLAGS="-L/usr/local/opt/openssl/lib" UWSGI_PROFILE_OVERRIDE=ssl=true pip install uwsgi -Iv

当我直接从uWSGI运行$uWSGI--master--http:8080--HTTPWebSockets--wsgi echo:app时,它工作得很好。我有完全相同的问题。我已经尝试在我的virtualenv内外用“pip install uwsgi-I”重新配置uwsgi,这似乎表明启用了SSL。但是,可能与本机uwsgi安装存在一些冲突?测试是否有可能测试是否启用了SSL,是否有可能测试是否有可能测试是否有某种某种某种某种某种可能的方式,测试是否有可能测试是否启用了SSL是否启用了SSL,是否有可能测试是否有某种某种某种某种某种某种某种可能,是否有可能测试是否有可能测试是否启用了SSL,是否有可能测试是否有某种某种某种某种可能,不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知不知如何如何,是否有何何何何何何可能,测试是否可能测试是否可能测试是否是否是否是否有可能测试是否是否有可能测试是否是否是否是否是否是否有可能测试是否是否是否是否有可能,是否有可能测试是否是否是否是否是否kernel=Linux malloc=libc execinfo=False ifaddrs=True SSL=True zlib=True locking=pthread\u mutex plugin\u dir=。在本次比赛中,本次比赛中,本次比赛中使用图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片图片在本次比赛中,在本次事件中,本次事件事件事件事件事件中,本次比赛事件事件事件事件事件事件中,在本次比赛中,在本次比赛中,在本次比赛中,在本次比赛中,在本次比赛比赛中,本次比赛中,在本次比赛中,在本次比赛中,在本次比赛中,在本次比赛中,本次比赛中,在本次比赛中,在本次比赛中,在本次比赛中,本次比赛中,本次比赛中,在本次比赛中,在本次比赛中,本次比赛中,在本次比赛中,在本次比赛中,本次比赛中,本次比赛在本次比赛中,本次比赛中,本次比赛在本次比赛中,本次比赛的在阿尔卑斯山上,安装
openssl dev
软件包。在venv外部安装uwsgi**是我的关键!这对我适用(使用
-I
-no cache dir
选项重新安装):
CFLAGS=“-I/usr/local/opt/openssl/include”LDFLAGS=“-L/usr/local/opt/openssl/lib”UWSGI\u PROFILE\u OVERRIDE=ssl=true pip在OS X上安装UWSGI-I--no cache dir
,Sierra for me使用此命令:
CFLAGS=“-I/usr/local/opt/openssl/include”LDFLAGS=“-L/usr/local/opt/openssl/lib”UWSGI_PROFILE_OVERRIDE=ssl=true-pip install UWSGI-Iv--no use wheel
;注意
--no use wheel
通过源代码强制其构建的标志似乎在不断变化;它是
CFLAGS=“-I/usr/local/opt/openssl/include”LDFLAGS=“-L/usr/local/opt/openssl/lib“UWSGI\u PROFILE\u OVERRIDE=ssl=true pip安装UWSGI--no binary:all:
在pip 18中添加pip的
--no cache dir
也可以避免一些混淆。