OS X 上 apache2 + django(mod_wsgi) 的适当文件系统权限

Appropriate filesystem permission for apache2 + django(mod_wsgi) on OS X

我在我的 apache 中得到了大量的以下内容 error.log:

Current thread 0x00007fff730d2000 (most recent call first):
[Sat Apr 08 19:49:59.958559 2017] [core:notice] [pid 38953] AH00052: child pid 38968 exit signal Abort trap (6)
[Sat Apr 08 19:49:59.960853 2017] [wsgi:warn] [pid 38969] (13)Permission denied: mod_wsgi (pid=38969): Unable to stat Python home /Users/user/Documents/VirtualEnvs/securedash. Python interpreter may not be able to be initialized correctly. Verify the supplied path and access permissions for whole of the path.
Fatal Python error: Py_Initialize: unable to load the file system codec
ImportError: No module named 'encodings'

根据谷歌搜索发现的各种建议,我尝试了无数的文件系统权限和所有权组合,但到目前为止没有任何效果。大约一周前,我通过 chmod -R 777 ~/ 进行了这项工作,但我不想再这样做了。意识到这是个坏主意后,我修复了我的主目录的权限并被其他事情分散了注意力。现在我重新开始处理它,我无法再次 运行 该应用程序。那么 apache 需要什么权限 1. 我的 virtualenv 和 2. django 项目本身?是否还有其他任何我需要授予对 apache 的访问权限的区域?谢谢!

编辑 重新安装mod_wsgi 并从头开始设置 virtualenv:

$ which python3
    /usr/local/bin/python3

$ virtualenv -p python3 secureDash
    Running virtualenv with interpreter /usr/local/bin/python3
    Using base prefix '/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5'
    New python executable in /Users/user/Documents/VirtualEnvs/secureDash/bin/python3.5
    Also creating executable in /Users/user/Documents/VirtualEnvs/secureDash/bin/python
    Installing setuptools, pip, wheel...done.

(secureDash) user VirtualEnvs $ python --version
    Python 3.5.2

(secureDash) user VirtualEnvs $ pip --version
    pip 9.0.1 from /Users/user/Documents/VirtualEnvs/secureDash/lib/python3.5/site-packages (python 3.5)

$ ./configure --with-python=/usr/local/bin/python3
    checking for apxs2... no
    checking for apxs... /usr/sbin/apxs
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables...
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking for prctl... no
    checking Apache version... 2.4.18
    configure: creating ./config.status
    config.status: creating Makefile

$ make
    ./apxs -c -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -Wc,-g -Wc,-O2  -Wc,'-arch x86_64' src/server/mod_wsgi.c src/server/wsgi_*.c -L/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/lib -L/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/config-3.5m  -arch x86_64 -lpython3.5 -ldl  -framework CoreFoundation
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/mod_wsgi.lo src/server/mod_wsgi.c && touch src/server/mod_wsgi.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_apache.lo src/server/wsgi_apache.c && touch src/server/wsgi_apache.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_buckets.lo src/server/wsgi_buckets.c && touch src/server/wsgi_buckets.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_convert.lo src/server/wsgi_convert.c && touch src/server/wsgi_convert.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_daemon.lo src/server/wsgi_daemon.c && touch src/server/wsgi_daemon.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_interp.lo src/server/wsgi_interp.c && touch src/server/wsgi_interp.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_logger.lo src/server/wsgi_logger.c && touch src/server/wsgi_logger.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_memory.lo src/server/wsgi_memory.c && touch src/server/wsgi_memory.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_metrics.lo src/server/wsgi_metrics.c && touch src/server/wsgi_metrics.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_restrict.lo src/server/wsgi_restrict.c && touch src/server/wsgi_restrict.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_server.lo src/server/wsgi_server.c && touch src/server/wsgi_server.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_stream.lo src/server/wsgi_stream.c && touch src/server/wsgi_stream.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_thread.lo src/server/wsgi_thread.c && touch src/server/wsgi_thread.slo
    ./libtool --silent --mode=compile /usr/bin/cc    -DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -DDARWIN_10 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.Internal.sdk/usr/include/apr-1  -I/usr/include/apache2  -I/usr/include/apr-1   -I/usr/include/apr-1  -g -O2 -arch x86_64 -I/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/include/python3.5m -DNDEBUG  -c -o src/server/wsgi_validate.lo src/server/wsgi_validate.c && touch src/server/wsgi_validate.slo
    ./libtool --silent --mode=link /usr/bin/cc    -o src/server/mod_wsgi.la  -rpath /usr/libexec/apache2 -module -avoid-version    src/server/wsgi_validate.lo src/server/wsgi_thread.lo src/server/wsgi_stream.lo src/server/wsgi_server.lo src/server/wsgi_restrict.lo src/server/wsgi_metrics.lo src/server/wsgi_memory.lo src/server/wsgi_logger.lo src/server/wsgi_interp.lo src/server/wsgi_daemon.lo src/server/wsgi_convert.lo src/server/wsgi_buckets.lo src/server/wsgi_apache.lo src/server/mod_wsgi.lo -L/usr/local/opt/python3/Frameworks/Python.framework/Versions/3.5/lib -L/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/config-3.5m -arch x86_64 -lpython3.5 -ldl -framework CoreFoundation

$ sudo make install LIBEXECDIR=/usr/local/httpd/modules
Password:
    ./apxs -i -S LIBEXECDIR=/usr/local/httpd/modules -n 'mod_wsgi' src/server/mod_wsgi.la
    /usr/share/httpd/build/instdso.sh SH_LIBTOOL='./libtool' src/server/mod_wsgi.la /usr/local/httpd/modules
    ./libtool --mode=install install src/server/mod_wsgi.la /usr/local/httpd/modules/
    libtool: install: install src/server/.libs/mod_wsgi.so /usr/local/httpd/modules/mod_wsgi.so
    libtool: install: install src/server/.libs/mod_wsgi.lai /usr/local/httpd/modules/mod_wsgi.la
    libtool: install: install src/server/.libs/mod_wsgi.a /usr/local/httpd/modules/mod_wsgi.a
    libtool: install: chmod 644 /usr/local/httpd/modules/mod_wsgi.a
    libtool: install: ranlib /usr/local/httpd/modules/mod_wsgi.a
    libtool: install: warning: remember to run `libtool --finish /usr/libexec/apache2'
    chmod 755 /usr/local/httpd/modules/mod_wsgi.so

我通过从符号链接目录中删除我的项目解决了这个问题。正如我在上面的最后一条评论中提到的,我将我的项目放在我的 iCloud 目录中,以便我的所有机器都可以轻松访问它,直到我在 github 上启动该项目。为了更方便地访问 iCloud 目录, 我设置了一个符号链接:

~/icloud -> Library/Mobile Documents/com~apple~CloudDocs/

一段时间后,我在上面报告的大量错误中注意到以下错误:

AH00037: Symbolic link not allowed or link target not accessible: /Users/user/icloud

因此,一旦我在 github 上获得我的项目,我将其拉入 ~/projects 并将我的 apache 配置指向正确的位置并使其正常工作。

可能有一些其他的解决方法可以让 apache 跟随符号链接,但经过一些调查,这似乎比将我的项目移动到 apache 可以跟随的常规目录更困难。