我在Flask框架中使用python。您可能知道,当您运行脚本时,它将在前台运行。像这样:
python hello.py
* Running on http://localhost:5000/
如何运行python Web服务器在后台运行python脚本,就像Apache Web Server一样。
由于
答案 0 :(得分:5)
如果您想要的只是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和Apache包含样本来运行相关应用程序,但请注意,这些样本不是生产环境的最佳配置。
假设您有hello.py文件模块,并且Flask对象存储在名为app
的变量中,您可以通过运行以下命令来运行该应用程序:
sudo pip install gunicorn
gunicorn --daemon --workers 4 --bind 0.0.0.0:8000 hello:app
现在,此进程已与终端分离(--damon选项)。 上面的命令启动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
,然后添加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。本地到您的 / etc / hosts ,如果您正在devbox上进行测试。)
Flask部署documentation提供了有关安装所需模块或使用 virtualenv 运行应用程序的更多详细信息。
有关详细信息,请参阅mod_wsgi文档。
上述两种解决方案都可用于运行其他WSGI应用程序,而不仅仅是使用Flask的应用程序。
答案 1 :(得分:2)
[编辑] 我误解了这个问题。我以为你想要一个生产就绪的服务器,但是如果你还处于测试阶段,我通常会使用screen(这里是a tutorial)。在任何情况下,学习屏幕都非常好,因为它会在许多与服务器相关的任务中派上用场。 [/编辑]
我只是使用this tutorial使用nginx和uwsgi设置了生产服务器。假设您使用的是Ubuntu 14.04,它基本上就是:
首先安装nginx:
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install nginx
通过转到浏览器中的ip-address并检查是否看到nginx欢迎屏幕来检查nginx是否正在运行。
然后安装uwsgi:
sudo apt-get install build-essential python python-dev
pip install uwsgi
删除默认的nginx配置:
sudo rm /etc/nginx/sites-enabled/default
为您的网站创建一个名为yourwebsite_nginx.conf的nginx配置文件(调整指向您网站文件夹的路径):
server {
listen 80;
server_name localhost;
charset utf-8;
client_max_body_size 75M;
location / { try_files $uri @yourapplication; }
location @yourapplication {
include uwsgi_params;
uwsgi_pass unix:/var/www/yourwebsite/yourwebsite_uwsgi.sock;
}
}
符号链接此文件并重新启动nginx:
sudo ln -s /var/www/yourwebsite/yourwebsite_nginx.conf /etc/nginx/conf.d/
sudo service nginx restart
配置uwsgi以创建您在nginx配置(/var/www/yourwebsite/yourwebsite_uwsgi.sock
)中指向的.sock文件。在/var/www/yourwebsite/yourwebsite_uwsgi.ini
中为此创建一个文件,其中包含:
[uwsgi]
#application's base folder
base = /var/www/yourwebsite
#python module to import
app = yourappfile # yourappfile should have the name of the file in which you do the `app = Flask(__name__)`
module = %(app)
home = %(base)/venv # This should point to your virtualenv python install
pythonpath = %(base)
#socket file's location
socket = /var/www/yourwebsite/%n.sock
#permissions for the socket file
chmod-socket = 666
#the variable that holds a flask application inside the module imported at line #6
callable = app # This is normally `app`
开始uwsgi:
uwsgi --ini /var/www/yourwebsite/yourwebsite_uwsgi.ini
简而言之。但是请查看我上面链接的教程,它以更慢,更简单的步骤解释事情。
答案 2 :(得分:1)
您可以使用Apache和mod_wsgi查看Flask documentation以部署您的应用程序。另外还有一个snippet,有人写道,他们提到Flask文档对他们来说并不完美。