【问题标题】:how to build uWSGI with SSL support to use the websocket handshake API function?如何构建支持 SSL 的 uWSGI 以使用 websocket 握手 API 功能?
【发布时间】:2014-08-02 16:46:18
【问题描述】:

我有什么: Ubuntu 14.4 使用 nginx 作为反向代理的烧瓶(python)运行的 uwsgi。

我想要什么: 运行这个 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

【问题讨论】:

  • 当我使用 $ uwsgi --master --http :8080 --http-websockets --wsgi echo:app 直接从 uWSGI 运行时,它工作正常。
  • 我也有同样的问题。我尝试使用“pip install uwsgi -I”在我的 virtualenv 内外重新配置 uwsgi,这似乎表明 SSL 已启用。但是可能与本机 uwsgi 安装有一些冲突?是否有可能测试 SSL 是否启用?

标签: python nginx websocket uwsgi


【解决方案1】:

我必须通过 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

【讨论】:

  • 这对我有用(使用-I 和--no-cache-dir 选项重新安装):CFLAGS="-I/usr/local/opt/openssl/include" LDFLAGS="-L/usr/local/opt/openssl/lib" UWSGI_PROFILE_OVERRIDE=ssl=true pip install uwsgi -I --no-cache-dir
  • 我在 OS X Sierra 上使用了这个命令: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_PROFILE_OVERRIDE=ssl=true pip install uwsgi --no-binary :all: 在第 18 点
  • 添加 Pip 的 --no-cache-dir 也可以避免一些混乱。
【解决方案2】:

正如下面提到的海报之一,您将需要 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  

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • ################# uWSGI 配置################ pcre = 假内核 = Linux malloc = libc execinfo = False ifaddrs = True ssl = True zlib = True 锁定 = pthread_mutex plugin_dir = . timer = timerfd yaml = embedded json = False filemonitor = inotify routing = False debug = False capabilities = False xml = libxml2 event = epoll ############# uWSGI配置结束##### ########
    • 如果你使用基于alpine的docker镜像,安装openssl-dev包。
    【解决方案4】:

    我通过 pip(venv 外部)安装 uwsgi 并更改初始化脚本(Ubuntu)/etc/init.d/uwsgi 以运行新安装的 2.x 分支(而不是 1.9),从而解决了这个问题的版本.

    pip安装到/user/local/bin,所以我把line daemon改成:DAEMON="/usr/local/bin/uwsgi"

    【讨论】:

    • 在 venv 之外安装 uwsgi ** 是我的关键!
    【解决方案5】:

    您可以使用LDFLAGS 指定开发标头的位置。顺便说一句,这也可能发生在 OS X 上,因为 El Capitan 不再提供标头。

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

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2013-06-12
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多