我有: Ubuntu 14.4 uwsgi 使用 Flask (python) 运行,并使用 nginx 作为反向代理。
我想要什么: 运行这个 WebSocket 示例: https://github.com/zeekay/flask-uwsgi-websocket/blob/master/examples/echo/echo.py
当我在端口 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
我必须通过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
正如下面的海报之一提到的,您将需要 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)安装它们,这会将它们放入 /opt/local/include 中,并在 /usr/local/include 中提供链接。 您还可以直接安装它们,方法是下载并解压 openssl,运行“./Configure darwin64-x86_64-cc”,然后“make”,最后“sudo make install”。
Xcode 的构建实用程序打包了整个预定义的构建环境。对于 XCode 项目,这意味着开发人员有一个共同的工作基础,基础中没有的任何内容都必须在 XCode 项目中。 在基础目录之外构建开源项目会变得有点混乱,因为像 openssl 这样的依赖项位于基础目录之外。 你可以给uwsgi的构建链一个包含目录来使用。 它不支持 PATH 样式:分隔符。
在大多数安装情况下,以下内容应该适用于 OpenSSL。
UWSGI_INCLUDES=/usr/local/include/ pip install uwsgi
只需安装 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"
通过
Ubuntu 20.04
作为系统包安装 python 3.8.10
和 pip
和 apt
的解决方案:
# switch to root because system packages can't be changed without root privileges
# This is not necessary for user based environment like virtualenv or pyenv
sudo su -
# Uninstall previous version of `uwsgi` if exists
pip uninstall uwsgi
# Install libraries for SSL support
apt-get install libssl-dev
## Manually build uwsgi with SSL support
# set necessary lib paths
export CFLAGS="-I/usr/include/openssl"
# aarch64-linux-gnu folder used for ARM architecture and may be different for your env
# use [apt-file list libssl-dev] to check lib folders (apt-file should be additionally installed)
export LDFLAGS="-L/usr/lib/aarch64-linux-gnu"
# activate SSL support
export UWSGI_PROFILE_OVERRIDE=ssl=true
# build uwsgi using pip (--no-use-wheel deprecated so used --no-binary instead)
# this command will install 2.0.20 version. Version may be changed or removed. It is not mandatory
pip install -I --no-binary=:all: --no-cache-dir uwsgi==2.0.20
# Check SSL support
uwsgi --help | grep https
预期输出:
--https-socket bind to the specified UNIX/TCP socket using HTTPS protocol
--https-socket-modifier1 force the specified modifier1 when using HTTPS protocol
--https-socket-modifier2 force the specified modifier2 when using HTTPS protocol
--https add an https router/server on the specified address with specified certificate and key
--https2 add an https/spdy router/server using keyval options
--https-export-cert export uwsgi variable HTTPS_CC containing the raw client certificate
--https-session-context set the session id context to the specified value
--http-to-https add an http router/server on the specified address and redirect all of the requests to https
基于本线程中的其他答案和评论。谢谢大家
您可以使用
LDFLAGS
指定开发标头的位置。顺便说一句,由于 El Capitan 不再提供标头,这种情况也可能发生在 OS X 上。
LDFLAGS="-L/usr/local/lib" pip install uwsgi --no-use-wheel