我正在使用带有 Flask 框架的 python。您可能知道,当您运行脚本时,它将在前台运行。像这样:
python hello.py
* Running on http://localhost:5000/
如何像 Apache Web 服务器那样运行 Python Web 服务器以在后台运行 Python 脚本。
谢谢
最佳答案
如果您只想让 Web 服务器进程与您的终端分离,以便您可以继续使用终端,那么只需将它发送到后台(就像任何其他命令一样):
python hello.py &
或者使用更详细的输出重定向:
python hello.py > /dev/null 2>&1 &
但请注意(正如 Fask 文档中所述)Flask 的默认 Web 服务器不是为生产而编写的,而是用于开发的。建议将其他 WSGI 服务器(如带有 mod_wsgi 的 Apache、Gunicorn 等)用于生产环境。
Apache 在生产服务器上更易于管理,因为大多数发行包都提供脚本来启动/停止/监控 Apache 进程。所以你需要做的就是安装/启用 mod_wsgi
和 configure运行您的应用程序的服务器。
Gunicorn很容易start with .
我将包含使用 Gunicorn 和 Apache 运行相关应用程序的示例,但请注意,这些示例并不是生产环境的最佳配置。
unicorn
假设您有 hello.py 文件模块,并且 Flask 对象存储在名为 app
的变量中,您可以通过运行以下命令来运行应用程序:
sudo pip install gunicorn
gunicorn --daemon --workers 4 --bind 0.0.0.0:8000 hello:app
现在这个进程与您的终端分离(--daemon 选项)。 上面的命令启动 gunicorn 监听非特权端口 (8000)。如果你想监听一个特权端口(比如 80),你可以放弃工作进程的特权:
sudo gunicorn --daemon --workers 4 --bind 0.0.0.0:80 --user www-data --group www-data hello:app
但是,如果您需要对流程进行更多控制,可以使用像 Supervisord 这样的流程管理工具。或 Perp可以提供帮助。
Apache mod_wsgi
如果您使用 Apache 更方便,请安装并启用 mod_wsgi
,然后添加一个 VirtualHost 以指向您的应用程序。
这是应用程序的示例配置和运行它的 Apache 配置。
假设我们有 hello.py
,我们有 Flask 应用程序,所以将它保存到适当的位置(并提供适当的权限)。例如,这里我们使用 /var/www/myapp 但这只是为了简单。
# file: /var/www/myapp/hello.py
from flask import Flask
application = Flask(__name__)
@application.route("/")
def index():
return "Hello!"
请注意,Flask 对象存储在 application
变量中,因为 mod_wsgi
在指定模块中查找名为 application
的 WSGI 应用程序对象。
然后安装并启用 mod_wsgi
,以 Ubuntu 为例:
sudo apt-get install apache2 libapache2-mod-wsgi
sudo a2enmod wsgi
现在添加一个 VirtualHost 以指向您的 WSGI 应用。
# file: /etc/apache2/sites-available/101-myapp.conf
<Directory /var/www/myapp>
Order allow,deny
Allow from all
</Directory>
<VirtualHost *:80>
ServerName myapp.local
ServerAdmin webmaster@localhost
DocumentRoot /var/www/myapp
WSGIDaemonProcess www-data processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup www-data
WSGIScriptAlias / /var/www/myapp/hello.py
ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
</VirtualHost>
现在启用主机:
sudo a2ensite 101-myapp
sudo service apache2 reload
请注意,在上面的示例中,我使用 myapp.local 作为 ServerName,因此您需要将其更改为可以使用 DNS 解析的名称(或添加 myapp.local )。本地到你的/etc/hosts,如果你在你的devbox上测试)。
flask 部署 documentation提供有关安装所需模块或使用 virtualenv 运行应用程序的更多详细信息。
参见 mod_wsgi文档以获取更多详细信息。
上述两种解决方案都可用于运行其他 WSGI 应用程序,而不仅仅是使用 Flask 的应用程序。
关于python - 运行 Python Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33362035/