温馨提示×

Debian Apache如何支持Python

小樊
37
2025-12-15 22:05:13
栏目: 编程语言

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
  • 准备应用与 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
      
  • 配置虚拟主机
    • 新建 /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
  • 说明
    • 使用虚拟环境时,将 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
  • 验证: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-pathWSGIScriptAlias 路径正确,且 WSGI 入口对象名为 application
  • 虚拟环境与依赖
    • 在虚拟环境中 pip install -r requirements.txt;如使用 .egg 包,设置可写的 PYTHON_EGG_CACHE
  • 防火墙与端口
    • 如有防火墙,放行 HTTP/HTTPS:sudo ufw allow 'Apache Full'(或放行 80/443)。

0