在 macOS 上配置 Flask + mod_wsgi + Apache 环境

背景 – Background

我個人認為

我希望在MacOS的Apache上运行Flask应用程序,但我对Apache的了解几乎为零。

需要性

最近的macOS更新提升了安全性,同时也让环境设置变得更加复杂。很多以前的文章不再适用,因此需要分享自己的经验。

要求以华文母语进行改述:
执行环境:

Apache -> 2.4.54
Python -> 3.10.11
pip3 -> 23.1.2
flask -> 2.3.2

Apache -> 2.4.54
Python -> 3.10.11
pip3 -> 23.1.2
flask -> 2.3.2

>httpd -v
Server version: Apache/2.4.54 (Unix)
...

> python3
Python 3.10.11 (main, May 29 2023, 06:42:58) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
...

> pip3 --version
pip 23.1.2 from /Users/rikanshin/.local/lib/python3.10/site-packages/pip (python 3.10)

> pip3 show flask
Name: Flask
Version: 2.3.2
...

根据其他文章的说法,据称MacOS的默认python3并不是很好。请从https://www.python.org/downloads/macos/下载并安装。

在安装Python后,需要设置环境变量将其添加到系统路径中。

如果可以,请检查pip3的位置。

which pip3

如果地方改变了的话,没问题。

背景了解

Flask是Python的一个网页框架,如果想要在Apache上运行Python应用程序,就需要使用wsgi。但是,需要自己下载wsgi并加载到Apache上。此外,除了Flask应用程序的文件外,还需要自己编写wsgi文件。

最终目标的最终目标

在本地主机的80端口上显示“Hello, Apache!”

建立的过程

安装mod_wsgi

最新的MacOS已经装好了Python3、httpd(apachectl)和pip3。

首先检查是否安装了Flask。

pip3 show flask

如果没有安装的话,请安装。

pip3 install flask

然后,下载 mod_wsgi。

pip3 install mod_wsgi

应该会有错误。

$ pip3 install mod_wsgi
Collecting mod_wsgi
  Using cached mod_wsgi-4.9.4.tar.gz (497 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... error
  error: subprocess-exited-with-error
  
  × Getting requirements to build wheel did not run successfully.
  │ exit code: 1
  ╰─> [17 lines of output]
      Traceback (most recent call last):
  ...

因为没有Xcode命令行工具,所以无法进行编译。因此,需要先在App Store下载Xcode。

xcode-select --install

请通过以下命令安装(推荐):

如果您不想下载Xcode因为它太占用空间,可以参考以下链接:

Xcodeでcommand line toolsの導入・確認方法を徹底解説します!


或者
https://qiita.com/SayCheeese/items/1b9db660917049bbad64

安装了命令行工具后,我们将安装mod_wsgi。

pip3 install mod_wsgi

如果可以的话,我会查找mod_wsgi的位置。

> pip3 show mod_wsgi
Name: mod-wsgi
Version: 4.9.4
Summary: Installer for Apache/mod_wsgi.
Home-page: https://www.modwsgi.org/
Author: Graham Dumpleton
Author-email: Graham.Dumpleton@gmail.com
License: Apache License, Version 2.0
Location: /Users/rikanshin/.local/lib/python3.10/site-packages
Requires: 
Required-by: 

那个地点是目的地。根据你自己的输出地点移动,一旦到达那里的mod_wsgi文件夹的server文件夹,应该会有一个名为”mod_wsgi-py310.cpython-310-darwin.so”的文件。文件名中的cpython-310表示适用于python3.10版本,所以请检查你的python版本是否匹配。

准备测试文件

首先创建一个文件夹。假设这里的例子是 /Users/rikanshin/Desktop/flask/myapp。
在那里创建三个文件。

你好.py(Flask应用程序文件)

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello, Apache!'

if __name__ == '__main__':
    app.run()

2. test1.py(wsgi测试文件)

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

3. 为hello.py创建wsgi文件的测试。

import sys
sys.path.insert(0, '/Users/rikanshin/Desktop/flask/myapp')

from hello import app
application = app

请根据需要适当更改那条路径。
另外,给这三个文件赋予执行权限。

chmod 755 ファイル名

准备文件就OK了。

将mod_wsgi部署到apache上。

首先,在Apache的配置文件中(默认为/etc/apache2/httpd.conf)最后添加以下内容。

<VirtualHost *:80>
    LoadModule wsgi_module /Users/rikanshin/.local/lib/python3.10/site-packages/mod_wsgi/server/mod_wsgi-py310.cpython-310-darwin.so
    WSGIScriptAlias / /Users/rikanshin/Desktop/flask/myapp/test.wsgi
    <Directory /Users/rikanshin/Desktop/flask/myapp>
        Require all granted
    </Directory>
</VirtualHost>

请写下。

请在LoadModule wsgi_module之后输入之前下载的.so文件的路径。
请在WSGIScriptAlias /之后输入wsgi文件的路径。
请在其内输入之前创建的文件夹的路径。

保存后,检查httpd文件。

apachectl -t

出现了很多错误。

[so:error] [pid 3908] AH06665: No code signing authority for module at...

据说它没有代码签名证书。
因此,请按照下面的网址进行操作:

【macOS 12 Monterey】コード署名証明書によるPHPモジュール有効化


启用模块。

没有权限的测试

首先启动服务器。

sudo apachectl start

然后在浏览器中打开 http://localhost:80 ,可能会出现内部服务器错误。
此时,请检查error_log(默认为 /var/log/apache2/error_log)。
如果出现以下类似记录,则表示httpd没有执行权限。

[wsgi:error] [pid 7827] (1)Operation not permitted: [client ::1:52854] mod_wsgi (pid=7827, process='', application='rikanshinnoMacBook-Pro.local|'): Could not read/compile source file ...

首先找到httpd的位置,然后赋予其完全访问磁盘的权限。

$ which httpd
/usr/sbin/httpd
スクリーンショット 2023-06-05 1.30.29.png

最终考试

最后重新启动Apache。

sudo apache restart

然后在浏览器中打开 http://localhost:80,如果使用WSGIScriptAlias / /Users/rikanshin/Desktop/flask/myapp/test1.py的话,将显示Hello World。这表明wsgi模块正常工作。如果使用WSGIScriptAlias / /Users/rikanshin/Desktop/flask/myapp/test.wsgi的话,将显示Hello, Apache! 这表明wsgi模块、python和flask都正常工作。

最终

辛苦了。
我写了很多,如果对你有帮助,我会很高兴。
我是初学者,请你指出我哪里做错了!

广告
将在 10 秒后关闭
bannerAds