在ubuntu18.04、apache2.4、python3环境中部署flask
用python写了一个小网页,部署的过程中踩了坑,在这里记录一下。
1、安装apache2
首先可以检查一下有没有安装apache2
which apache2
如果安装了的话,应该会输出
/usr/sbin/apache2
没有安装的话就没有任何输出,可以使用命令安装
sudo apt install apache2
检查apache版本
xiaopihai@ubuntu:~$ apachectl -v
Server version: Apache/2.4.29 (Ubuntu)
Server built: 2019-04-03T13:22:37
2、安装python3
sudo apt install python3
安装成功后输入python3
Python 3.7.0 (default, Jun 28 2018, 13:15:42)
[GCC 7.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
会有上方类似的输出,我用的anaconda,所以显示是这样的。
3、安装python虚环境
输入命令安装虚环境
pip3 install virtualenv
之后进入
cd /var/www
#可能会遇到权限问题,该加sudo加sudo,可以考虑chown或chmod
mkdir myflask
cd myflask
virtualenv --no-site-packages testenv
source testenv/bin/activate
上面的命令敲完就建立并进入了一个名字为testenv的python虚环境
这个时候应该是这样的
(testenv) xiaopihai@ubuntu:/var/www/myflask$
之后安装flask
(testenv) xiaopihai@ubuntu:/var/www/myflask$ pip install flask
这个时候在python环境中就安装好了flask
退出这个模式可以输入
(testenv) xiaopihai@ubuntu:/var/www/myflask$ deactivate
4、安装mod_wsgi
sudo apt-get install libapache2-mod-wsgi-py3
sudo a2enmod wsgi
这里有个坑,如果按照网上的教程,这里是输入
sudo apt-get install libapache2-mod-wsgi
这个命令安装的wsgi适用python2,python3不行
至此,准备工作就做好了。
5、配置站点
- 在/var/www/myflask目录下添加hello.py和hello.wsgi
其中hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
其中hello.wsgi
import sys
from hello import app as application
这个文件其实写这个就够了,不用写的很麻烦
- 禁用默认的Apache虚拟主机
sudo a2dissite 000-default.conf
- 在/etc/apache2/sites-available目录下创建一个myflask.conf文件
其中myflask.conf
<VirtualHost *:80>
ServerName www.myflask.com
ServerAlias *.myflask.com
WSGIDaemonProcess hello python-path=/var/www/myflask:/var/www/myflask/testenv/lib/python3.7/site-packages
WSGIScriptAlias / /var/www/myflask/hello.wsgi
DocumentRoot /var/www/myflask/
#下面这两行不是必须的,记录日志的
ErrorLog /var/www/myflask/logs/error.log
CustomLog /var/www/myflask/logs/access.log combined
<Directory /var/www/myflask>
WSGIProcessGroup hello
WSGIApplicationGroup %{GLOBAL}
Require all granted
</Directory>
</VirtualHost>
如果添加了上面记录日志的两行,必须要执行下面这条语句,不添加不用管
sudo mkdir /var/www/myflask/logs
apache2.2这样写
Order allow,deny
Allow from all
由于用的是apache2.4,要这样写
Require all granted
要指明python-path=/var/www/myflask:/var/www/myflask/testenv/lib/python3.7/site-packages
否则会报如下错误,错误日志在/var/log/apache2/error.log查看
[Sun Apr 21 01:38:00.031450 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] mod_wsgi (pid=9558): Target WSGI script '/var/www/myflask/hello.wsgi' cannot be loaded as Python module.
[Sun Apr 21 01:38:00.031487 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] mod_wsgi (pid=9558): Exception occurred processing WSGI script '/var/www/myflask/hello.wsgi'.
[Sun Apr 21 01:38:00.031542 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] Traceback (most recent call last):
[Sun Apr 21 01:38:00.031561 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] File "/var/www/myflask/hello.wsgi", line 11, in <module>
[Sun Apr 21 01:38:00.031564 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] from hello import app as application
[Sun Apr 21 01:38:00.031569 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] File "/var/www/myflask/hello.py", line 1, in <module>
[Sun Apr 21 01:38:00.031571 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] from flask import Flask
[Sun Apr 21 01:38:00.031581 2019] [wsgi:error] [pid 9558:tid 140057708324608] [remote 127.0.0.1:48444] ModuleNotFoundError: No module named 'flask'
启用这个站点
sudo a2ensite myflask.conf
- 至此,基本上就没问题了,重启apache2之前可以先进行语法检查
sudo apache2ctl configtest
之后就可以重启了
sudo service apache2 reload
6、验证效果
在浏览器中输入127.0.0.1可以看到Hello World!
直接输命令也行
xiaopihai@ubuntu:~$ curl 127.0.0.1
Hello World!xiaopihai@ubuntu:~$
备注
Apache2中启用和禁用网站和模块
1.启用和禁用网站:
xxx.conf是/etc/apache2/sites-available/里的文件
sudo a2ensite xxx.conf
sudo a2dissite xxx.conf
2.启用和禁用模块
sudo a2enmod 模块配置文件名
sudo a2dismod 模块配置文件名