Mac OSX: LoadModule wsgi_module 没有像文档中提到的那样工作

Mac OSX: LoadModule wsgi_module not working as mentioned in docs

出于 Mac OSX 中的安全原因,我将 apache 从 2.4.25 升级到 2.4.29。 还通过 pip 安装了 mod_wsgi。

现在在重新启动 apache 服务器时遇到困难!

我运行这个命令按照mod_wsgidocs,

> mod_wsgi-express module-config
LoadModule wsgi_module "/Library/Python/2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so"
WSGIPythonHome "/System/Library/Frameworks/Python.framework/Versions/2.7"

将以上两行复制到 apache.conf 文件中并尝试启动 apache 服务器,但出现以下错误:

> sudo apachectl start
/usr/local/apache/bin/apachectl: line 79: 51863 Illegal instruction: 4  $HTTPD -k $ARGV

如有任何帮助,我们将不胜感激。谢谢!

编辑 根据格雷厄姆的回答:

# I upgraded the mod_wsgi
> sudo pip install --upgrade --no-cache-dir mod_wsgi
Collecting mod_wsgi
  Downloading mod_wsgi-4.5.21.tar.gz (2.5MB)
    100% |████████████████████████████████| 2.5MB 2.1MB/s 
Installing collected packages: mod-wsgi
  Found existing installation: mod-wsgi 4.5.20
    Uninstalling mod-wsgi-4.5.20:
      Successfully uninstalled mod-wsgi-4.5.20
  Running setup.py install for mod-wsgi ... done
Successfully installed mod-wsgi-4.5.21

但是当我尝试时:

> mod_wsgi-express start-server
Traceback (most recent call last):
  File "/Library/WebServer/Documents/DSFENV/bin/mod_wsgi-express", line 11, in <module>
    load_entry_point('mod-wsgi==4.5.21', 'console_scripts', 'mod_wsgi-express')()
  File "/Library/WebServer/Documents/DSFENV/lib/python2.7/site-packages/mod_wsgi/server/__init__.py", line 3484, in main
    cmd_start_server(args)
  File "/Library/WebServer/Documents/DSFENV/lib/python2.7/site-packages/mod_wsgi/server/__init__.py", line 3332, in cmd_start_server
    config = _cmd_setup_server('start-server', args, vars(options))
  File "/Library/WebServer/Documents/DSFENV/lib/python2.7/site-packages/mod_wsgi/server/__init__.py", line 2999, in _cmd_setup_server
    language, encoding = locale.getdefaultlocale()
  File "/Library/WebServer/Documents/DSFENV/lib/python2.7/locale.py", line 543, in getdefaultlocale
    return _parse_localename(localename)
  File "/Library/WebServer/Documents/DSFENV/lib/python2.7/locale.py", line 475, in _parse_localename
    raise ValueError, 'unknown locale: %s' % localename
ValueError: unknown locale: UTF-8

出现上述错误。 我还安装了 apache 2.4.29 blog:

第二次编辑 我已经解决了 ValueError: unknown locale: UTF-8,现在 mod_wsgi-express start-server 的输出显示:

> mod_wsgi-express start-server
Server URL         : http://localhost:8000/
Server Root        : /tmp/mod_wsgi-localhost:8000:501
Server Conf        : /tmp/mod_wsgi-localhost:8000:501/httpd.conf
Error Log File     : /tmp/mod_wsgi-localhost:8000:501/error_log (warn)
Request Capacity   : 5 (1 process * 5 threads)
Request Timeout    : 60 (seconds)
Startup Timeout    : 15 (seconds)
Queue Backlog      : 100 (connections)
Queue Timeout      : 45 (seconds)
Server Capacity    : 20 (event/worker), 20 (prefork)
Server Backlog     : 500 (connections)
Locale Setting     : en_US.UTF-8

但是当我尝试进行配置测试时,仍然显示相同的错误:

> sudo apachectl configtest
/usr/local/apache/bin/apachectl: line 79: 53944 Illegal instruction: 4  $HTTPD -t

xcode版本:

> xcodebuild -version
Xcode 8.3.2
Build version 8E2002

第三次编辑 根据评论:

> /usr/local/apache/bin/httpd
Illegal instruction: 4

> /Library/Python/2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so
-bash: /Library/Python/2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so: cannot execute binary file

> sys.prefix
'/System/Library/Frameworks/Python.framework/Versions/2.7'

> sys.version
'2.7.10 (default, Feb  7 2017, 00:08:15) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)]'

我按照这个博客安装了 Apache 2.4.29: http://mac-dev-env.patrickbougie.com/apache/
--with-ssl 选项,因为我们的网站需要 https。

第四次编辑:

> file /usr/local/apache/bin/httpd
/usr/local/apache/bin/httpd: Mach-O 64-bit executable x86_64

> file /Library/Python/2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so
/Library/Python/2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so: Mach-O universal binary with 2 architectures: [x86_64: Mach-O 64-bit bundle x86_64] [i386: Mach-O bundle i386]
/Library/Python/2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so (for architecture x86_64):   Mach-O 64-bit bundle x86_64
/Library/Python/2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so (for architecture i386): Mach-O bundle i386

请让我知道如何进行。

如果您以某种方式更新了 Apache 安装,通常来自旧版本的 mod_wsgi.so 二进制文件应该仍然可以工作,因为 Apache 保持跨补丁级别更新的 ABI 兼容性。

如果它不起作用,那么您可能需要重新构建 mod_wsgi。如果 mod_wsgi 没有更新版本,您将需要强制完全重新构建以确保不使用来自 pip 缓存的缓存二进制文件。

pip install --upgrade --no-cache-dir mod_wsgi

下一个问题是,如果您已升级到 Xcode 9.1,Apple 通过完全删除 apxs 进一步破坏了一些东西,这意味着我之前针对 Apple 破坏的解决方法不再有效。在这种情况下,您需要确保安装的是 mod_wsgi 4.5.21 或更高版本。该版本刚刚发布,带有修复以适应 Xcode 9.1

所以请尝试上面的 pip 命令并确保 mod_wsgi-express 在 运行 之前仍然有效:

mod_wsgi-express start-server

然后 运行 再次验证要在 Apache 配置中使用的配置片段:

mod_wsgi-express module-config

如果主 Apache 仍然存在问题,请确保您完全停止 Apache 然后再启动,而不仅仅是重新启动。让我知道一切进展如何。


更新 1

以上假定您使用的是 Apple 提供的 Apache,以符合 Xcode 9.1 注释。您似乎在使用自己的 Apache,可能来自 Homebrew。仍然尝试同样的事情。

正如格雷厄姆所建议的:

pip install --upgrade --no-cache-dir mod_wsgi

升级到 mod_wsgi 4.5.22 成功了。