在 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因为它太占用空间,可以参考以下链接:
或者
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...
据说它没有代码签名证书。
因此,请按照下面的网址进行操作:
启用模块。
没有权限的测试
首先启动服务器。
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
最终考试
最后重新启动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都正常工作。
最终
辛苦了。
我写了很多,如果对你有帮助,我会很高兴。
我是初学者,请你指出我哪里做错了!