Debian Apache如何支持Python
导读:Debian 上让 Apache 支持 Python 的主流做法有三种:使用 mod_wsgi 运行 WSGI 应用(推荐)、使用 CGI 方式运行脚本、以及使用已不推荐但仍有历史遗留的 mod_python。下面给出可直接落地的步骤与要点...
Debian 上让 Apache 支持 Python 的主流做法有三种:使用 mod_wsgi 运行 WSGI 应用(推荐)、使用 CGI 方式运行脚本、以及使用已不推荐但仍有历史遗留的 mod_python。下面给出可直接落地的步骤与要点。
方案一 使用 mod_wsgi 部署 WSGI 应用(推荐)
- 安装组件并启用模块
- 安装 Apache、Python3 与 WSGI 模块:
sudo apt update & & sudo apt install apache2 python3 python3-pip libapache2-mod-wsgi-py3 - 启用模块:
sudo a2enmod wsgi
- 安装 Apache、Python3 与 WSGI 模块:
- 准备应用与 WSGI 入口
- 示例应用文件 /var/www/yourapp/app.py:
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello, World from Flask via mod_wsgi" if __name__ == "__main__": app.run() - 生成 WSGI 入口 /var/www/yourapp/wsgi.py:
import sys sys.path.insert(0, "/var/www/yourapp") from app import app as application # 对象名必须为 application
- 示例应用文件 /var/www/yourapp/app.py:
- 配置虚拟主机
- 新建 /etc/apache2/sites-available/yourapp.conf:
< VirtualHost *:80> ServerName yourdomain.com WSGIDaemonProcess yourapp python-home=/var/www/yourapp/venv python-path=/var/www/yourapp WSGIProcessGroup yourapp WSGIScriptAlias / /var/www/yourapp/wsgi.py < Directory /var/www/yourapp> Require all granted < /Directory> ErrorLog ${ APACHE_LOG_DIR} /error.log CustomLog ${ APACHE_LOG_DIR} /access.log combined < /VirtualHost> - 启用站点并重启:
sudo a2ensite yourapp.conf & & sudo systemctl restart apache2
- 新建 /etc/apache2/sites-available/yourapp.conf:
- 说明
- 使用虚拟环境时,将 python-home 指向虚拟环境目录(如 /var/www/yourapp/venv),将应用目录加入 python-path。
- 若使用旧版 .egg 包,需设置 PYTHON_EGG_CACHE 目录并确保可写。
方案二 使用 CGI 运行 Python 脚本(简单脚本场景)
- 启用 CGI 模块并准备脚本
- 启用模块:
sudo a2enmod cgi - 脚本示例 /usr/lib/cgi-bin/hello.py:
#!/usr/bin/env python3 print("Content-Type: text/html") print() print("< html> < body> Hello, World from CGI< /body> < /html> ") - 赋权:
sudo chmod +x /usr/lib/cgi-bin/hello.py
- 启用模块:
- 配置站点
- 在 /etc/apache2/sites-available/000-default.conf 的 VirtualHost 中加入:
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ < Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI AddHandler cgi-script .py Require all granted < /Directory> - 重启:
sudo systemctl restart apache2
- 在 /etc/apache2/sites-available/000-default.conf 的 VirtualHost 中加入:
- 验证:
curl http://localhost/cgi-bin/hello.py
方案三 使用 mod_python(历史方案,不推荐新项目使用)
- 安装与启用
- 安装:
sudo apt-get install libapache2-mod-python libapache2-mod-python-doc - 启用:
sudo a2enmod python
- 安装:
- 测试与示例
- 测试句柄(完成后请移除,避免安全风险):
< Location /mpinfo> SetHandler mod_python PythonHandler mod_python.testhandler < IfModule mod_authz_core.c> Require all granted < /IfModule> < /Location> - 简单处理器示例 /var/www/py/hello.py:
from mod_python import apache def handler(req): req.content_type = 'text/html' req.send_http_header() req.write('< html> < body> Hello World from mod_python< /body> < /html> ') return apache.OK - 配置目录(在站点配置中):
< Directory /var/www/py> AddHandler mod_python .py PythonHandler hello PythonDebug On < /Directory>
- 测试句柄(完成后请移除,避免安全风险):
- 说明
- mod_python 将解释器嵌入 Apache,性能优于传统 CGI,但项目维护与兼容性不如 WSGI 生态,官方与社区已转向 WSGI。
常见问题与排错要点
- 服务与语法检查
- 检查状态:
sudo systemctl status apache2 - 语法检查:
sudo apache2ctl configtest - 查看日志:
tail -f /var/log/apache2/error.log
- 检查状态:
- 权限与路径
- CGI 脚本需可执行:
chmod +x;WSGI 目录需 Require all granted。 - 确认 python-home/python-path 与 WSGIScriptAlias 路径正确,且 WSGI 入口对象名为 application。
- CGI 脚本需可执行:
- 虚拟环境与依赖
- 在虚拟环境中
pip install -r requirements.txt;如使用 .egg 包,设置可写的 PYTHON_EGG_CACHE。
- 在虚拟环境中
- 防火墙与端口
- 如有防火墙,放行 HTTP/HTTPS:
sudo ufw allow 'Apache Full'(或放行 80/443)。
- 如有防火墙,放行 HTTP/HTTPS:
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Debian Apache如何支持Python
本文地址: https://pptw.com/jishu/772927.html
