Flask作为一个Web框架虽然自带Web服务器,但其Web服务器主要用于开发阶段的测试,在生产环境中应该选择更专业的Web服务器。当然在Web框架和Web服务器之间还需要一个实现了WSGI协议的容器协助Web框架和Web服务器之间通信。
常用的WSGI协议容器有Gunicorn和uWSGI,当然也可以使用Tornado(还需要配合其它异步框架)。
常用的Web服务器有Nginx、Apache等,服务器主要用来处理HTTP协议和一些静态内容。
最终选择了Gunicorn+Nginx的组合,因为Nginx的配置文件书写和Gunicorn的命令行启动方式都相对要简单一些。
下面是完整的步骤的部署步骤:
1. 在本机上利用PyCharm完成代码的开发。注意,开发环境最好是在python的虚拟环境中进行,因为后面要将项目部署到服务器上,服务器上也需要下载一遍项目中用到的各种库。虚拟环境中的库是保证项目正常运行的最少内容,因此到时候从服务器上根据虚拟环境的requirments.txt下载对应的库就可以了,不用下载额外的没有必要的内容。
2. 代码开发完毕后,点击Pycharm下方的Terminal进入终端,从项目目录继续venv/Scripts目录,调用activate进入虚拟环境,然后输入:
pip freeze > 路径/requirments.txt
会将开发时虚拟环境中的各种库以及依赖库的名称版本都输出到指定路径处的requirments.txt文件中。注意:requirments.txt名字可以任意起。
3. 利用
mysqldump -u用户名 -p密码 数据库名称 > 路径/my.sql
该命令将开发时使用的数据库内容全部导出为sql文件,到时候在服务器上运行该sql文件就可以将开发环境中的数据库内容“复制”到服务器的数据库中。
4. 通过以上三步就完成了本地的所有工作,接下来进行服务器端的配置。本人使用的阿里云主机,选择的镜像为CentOS7.4 + Python 3.6.4 + MySQL 5.7,所以只要安装一个Nginx服务器和Gunicorn容器即可。
5. 正式安装Nginx之前需要先保证CentOS上有必要的依赖内容,要安装gcc gcc-c++等内容,使用CentOS的yum命令进行安装:
yum -y install gcc gcc-c++ openssl-devel pcre-devel httpd-tools
6. 从Nginx官网选择下载tar文件(我下载的是1.15.3版本)并进行解压,然后进入到解压目录中,进行安装前的设置和模块检测:
useradd nginx
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
首先在CentOS中增加一个nginx用户,然后进行适当的设置(比如安装路径为/usr/local/nginx),然后进行必要的模块检测,需要有需要可以添加更多,例如需要播放mp4的话可以添加--with-http_mp4_module等。
7. 通过检测后,进行编译和安装
make && make install
安装完毕后建立软连接:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
启动nginx服务:
nginx
检查nginx服务状态:
netstat -ap | grep nginx
因为目前只是初次安装,默认时nginx应该运行在80端口。在浏览器上输入网址会看见nginx的欢迎画面。
7. 将requirments.txt,sql文件上传到服务器进行项目库的下载和数据库的建立。
项目库的下载使用pip install命令安装,可以选择源为国内的源,比如豆瓣:
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com -r requirments.txt
进入mysql创建和开发环境一样的数据库,use数据库后执行导入sql文件的命令:
source my.sql
根据my.sql中的指令,会在服务器上创建出和开发环境一样内容的数据库。
8. 安装Gunicorn容器:
pip install gunicorn
9. 在Nginx中配置Gunicorn:
修改Nginx安装目录下的配置文件 /usr/local/nginx/conf/nginx.conf,将server段做简单的修改:
server {
listen 80;
server_name xx.xx.xx.xx;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://0.0.0.0:9999;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
其中server_name的内容为主机的地址(可以是域名也可以是ip地址,我使用的是ip地址)
location中的相关内容就是为了将80端口的访问转发到9999端口。而9999端口将是Gunicorn运行Flask的端口。
改动配置文件后,可以输入如下指令检测下配置文件修改是否正确:
nginx -t
如果修改正确可以重启一下Nginx服务(停止再启动即可):
nginx -s stop #停止nginx服务
nginx #启动nginx服务
netstat -ap | grep nginx #检测nginx监听端口
10. 利用Gunicorn装载Flask启动
将本地项目完整上传到服务器后,进入项目的根目录,我的项目目录结构为:
进入movie目录后执行启动Gunicorn的命令:
gunicorn -w 4 -b 0.0.0.0:9999 manager:app
端口为9999,后面是模块名称:Flask实例名称。
注意,在本地开发时,manager.py为启动文件,Flask在启动文件中的常规写法有直接使用app.run配置端口的,或者利用flask_script的Manager,利用命令行runserver的,比如我的manager.py使用的就是Manager,在本地开发时利用runserver并设置端口号的方式启动项目:
但是一旦使用了Gunicorn之后,一切主机地址和端口号设置全部由Gunicorn接管,只需要提供模块:Flask实例名称即可。
11. 至此,服务器端设置完毕。打开浏览器输入域名或主机地址,即可以看见项目首页。