用户访问网站时Python程序无法加载的问题求助
解决你的Flask部署问题
首先得说,你现在用PHP exec()启动Flask的方式有几个关键问题,导致应用没正常跑起来:
为什么当前方法失效?
- 每个
exec()都是独立进程:你写的每一行exec()都是单独启动一个子进程,所以cd ~、source teamingit/bin/activate这些操作只在各自的进程里生效,完全不会影响后续的python __init__.py命令。比如激活虚拟环境的操作,只在那个exec('source ...')的进程里有用,下一行的python还是用的系统默认版本,不是虚拟环境里的。 - Flask默认只绑定本地地址:即使你成功启动了Flask,它默认会跑在
127.0.0.1:5000,这个地址只有服务器本地能访问,外部浏览器根本连不上。 - PHP启动的进程不稳定:虚拟主机的web服务器(比如Apache/Nginx)会管理PHP进程,用
exec()启动的Flask进程很容易被系统杀死,或者因为超时终止,根本没法长期运行。
正确的部署方案(生产环境推荐)
虚拟主机部署Flask最靠谱的方式是用WSGI协议,比如配合Apache的mod_wsgi(大部分虚拟主机都支持),步骤如下:
- 创建WSGI入口文件
在你的public_html目录下新建app.wsgi,内容如下(替换yourusername为你的服务器用户名):
import sys import os # 激活虚拟环境(Python 2.7用execfile) activate_this = os.path.expanduser("/home/yourusername/teamingit/bin/activate_this.py") execfile(activate_this, dict(__file__=activate_this)) # 把项目目录加入Python路径 sys.path.insert(0, os.path.expanduser("/home/yourusername/public_html")) # 导入你的Flask应用(注意__init__.py里的app对象要叫application,或者这里改名字) from __init__ import app as application
- 配置Apache的.htaccess文件
同样在public_html目录下新建或修改.htaccess,告诉Apache用WSGI运行你的应用:
# 定义WSGI守护进程,指定虚拟环境的Python路径 WSGIDaemonProcess myapp python-path=/home/yourusername/teamingit/lib/python2.7/site-packages:/home/yourusername/public_html WSGIProcessGroup myapp # 把根路径映射到你的wsgi文件 WSGIScriptAlias / /home/yourusername/public_html/app.wsgi # 授权访问项目目录 <Directory /home/yourusername/public_html> Require all granted </Directory>
- 调整Flask应用的启动代码
打开你的__init__.py,确保app.run()只在命令行运行时才执行,避免WSGI服务器重复启动开发服务器:
from flask import Flask app = Flask(__name__) # 你的路由、数据库操作等代码... # 只有直接运行这个文件时才启动开发服务器 if __name__ == '__main__': app.run(host='0.0.0.0')
做完这些,重启Apache(如果虚拟主机允许的话,或者等服务器自动加载配置),访问你的域名就能看到Flask应用了。
临时测试方案(不推荐生产环境)
如果只是想临时验证应用能跑,你可以把所有命令合并成一个exec(),确保环境和路径正确,同时让Flask绑定公网地址:
<?php // 替换yourusername为你的服务器用户名,端口选虚拟主机允许的(比如8080) $command = "/bin/bash -c 'cd /home/yourusername/public_html && source /home/yourusername/teamingit/bin/activate && python __init__.py --host=0.0.0.0 --port=8080 > flask.log 2>&1 &'"; echo exec($command); ?>
然后访问http://你的域名:8080就能看到应用,但这个方法只能临时用,进程很容易被杀死,不适合长期运行。
内容的提问来源于stack exchange,提问作者Glenn
相关产品推荐
相关产品推荐

