前言:用户上网的过程可以简单地理解为客户端(一般是浏览器)从服务端获取网站的信息,然后经过渲染呈现给用户。
Web服务器是运行在物理服务器或者云服务器上的一个后台服务程序,通过HTTP协议与客户端进行通信。当web服务器接收到请求时,会根据不同的请求进行对应的业务逻辑处理并生成相应的响应。如下图。
在这里,Web服务器可以是uWSGI服务器,它实现了server与application通信的WSGI协议,也包括了与客户端通信的HTTP协议。在Flask和Django这样的python web框架中,也集成了简单的WSGI服务器,一般用于服务器调试,但在生成环境中还是选择uWSGI服务器,可用于小规模网站。但为了网站的稳定性,一般需要引入更强大的web服务器,这里选择Nginx服务器,它支持高并发,支持百万级的TCP连接,部署简单,内存消耗低,而且是免费的。但Nginx是反向代理服务器,需要结合web应用服务器uWSGI使用,作用是将动态请求传递给uWSGI进行具体的应用逻辑处理,可以实现并发处理、安全、日志等强大的功能。
本次使用的是购买的阿里云轻量应用服务器,ubuntu系统,自带python2.7和3.5,使用的是python3.5。使用ECS服务器实践也可以。
1.创建项目文件夹
先创建一个项目文件夹my_flask
mkdir my_flask
再进入my_flask文件夹
cd my_flask
2.创建虚拟环境
安装python虚拟环境virtualenv,它可以隔离项目环境和系统全局环境,避免造成多个项目的环境混乱和冲突。
pip install virtualenv
现在已经在my_flask文件夹里,安装完后直接创建虚拟环境。
virtualenv venv
其中venv是新建虚拟环境包的名称,可以任意起名。
启动虚拟环境
source venv/bin/activate
检查一下环境是否切换到虚拟环境
pip –V
注意:如果发现路径不是指向新建的虚拟环境,而是系统环境,这可能是虚拟环境包被 移动过,导致路径变了。这时只需把原来的虚拟环境包删掉,重新创建虚拟环境包,再进入虚拟环境。
3.项目部署
1)通过支持SSH的FTP工具把flask项目project上传到my_flask项目文件夹中。
Project项目:
2)安装flask环境
pip install flask
pip install flask-script
安装完后在本地电脑中创建mange.py,再上传到my_flask文件夹中,用于管理flask项目。
写一个简易的mange.py:
from flask_script import Manager
from project.app import app
manager = Manager(app)
if __name__ == "__main__":
manager.run()
详细的用法可以参考http://flask-script.readthedocs.org/en/latest/
4.uWSGI服务器部署
1)安装uWSGI
虚拟环境下执行pip install uwsgi
如果安装出错,可以尝试以下链接的解决方法。
参考:
2)启动uWSGI
测试uWSGIuwsgi --version
如果启动出现uwsgi: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory,意思是找不到libpcre.so.1这个模块,而导致启动失败。
参考:
配置文件启动:
在本地创建config.ini配置文件,再上传到my_flask文件夹中,内容如下:
[uwsgi]
# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8001
# 指向网站目录
chdir = /home/my_flask/
# python 启动程序文件
wsgi-file = /home/my_flask/manage.py
# python 程序内用以启动的 application 变量名
callable = app
# 处理器数
processes = 4
# 线程数
threads = 2
#状态检测地址
stats = 127.0.0.1:9191
# 虚拟环境目录
home = /home/my_flask/venv
启动命令:
uwsgi config.ini
注意:目前的环境是虚拟环境,路径是my_flask文件夹下。
Ctrl+C关闭服务器。
5.Nginx服务器部署
1)安装Nginx
sudo apt-get install nginx
安装好后可以检验一下是否安装成功
检验命令:sudo nginx
浏览器访问:阿里云公网IP,即xx.xxx.xxx.xx
可以看到:
2) 创建配置文件flask_nginx.conf,上传到my_flask文件夹中,内容:
server {
listen 80; #监听端口
server_name X.X.X.X; #服务器公网IP
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8001; # 指向uwsgi 所应用的内部地址,所有请求将转发给uwsgi 处理,8001对应uWSGI启动的端口
uwsgi_param UWSGI_PYHOME /home/my_flask/venv; # 指向虚拟环境目录
uwsgi_param UWSGI_CHDIR /home/my_flask; # 指向网站根目录
uwsgi_param UWSGI_SCRIPT manage:app; # 指定启动程序
}
}
3)链接配置文件并重新启动Nginx
#建立链接:
sudo ln –s /home/my_flask/flask_nginx.conf /etc/nginx/conf.d/
#重启服务:
sudo service nginx restart
#关闭服务:
sudo service nginx stop
#启动服务
sudo service nginx start
4)测试
通过命令uwsgi config.ini启动uWSGI就可以在浏览器用公网IP:xx.xx.xx.xx访问到网页了。
测试可以访问之后,Ctrl+C关掉uwsgi,进行下一步。
如果无法访问,可以检查一下uWSGI的启动情况。下面是启动正常,可访问的状态。
6.supervisor进程管理工具部署
Supervisor是一个用Python写的进程管理工具,可以很方便的用来启动,重启,关闭进程。在项目运行中,可以将uWSGI托管给supervisor,实现uWSGI后台服务运行。
1)安装
如果在虚拟环境中,请退出环境,使用命令deactivate。在外部环境安装:
pip install supervisor
在外部环境安转,是为了方便维护管理,不用每次都要进入虚拟环境,而且不会造成环境冲突。
2)添加配置文件
Supervisor的配置文件在/etc/supervisor/,如果找不到,我们需要使用命令产生配置文件supervisord.conf。如果找到了,直接跳到d步骤
a. 先在/etc/下创建文件夹supervisor
b. 执行命令 echo_supervisord_conf > /etc/supervisor/supervisord.conf
c. 在/etc/supervisor/中找到supervisord.conf,并创建文件夹conf.d
d. supervisord.conf文件,通过FTP工具下载并打开,在文件最下面添加两行:
意思是supervisor服务启动时加载该配置文件,同时加载conf.d文件夹里所有后缀为.conf的配置文件。所以不需要修改原配置文件,只需在conf.d文件夹里添加配置文件即可。
e. 在本地创建配置文件flask_supervisor.conf,上传到/etc/supervisor/conf.d/,内容如下:
[program:my_flask]
# 启动命令入口
command=/home/my_flask/venv/bin/uwsgi /home/my_flask/config.ini
# 命令程序所在目录
directory=/home/my_flask
#运行命令的用户名
user=root
#自启动
autostart=true
#自重启
autorestart=true
#日志地址
stdout_logfile=/home/my_flask/logs/uwsgi_supervisor.log
stderr_logfile=/home/my_flask/logs/uwsgi_supervisor-err.log
[supervisord]
因为supervisor不会自动创建文件夹,所以要回到my_flask文件夹中,创建logs文夹,用于储存supervisor日志文件。
3) 启动supervisor服务
supervisord -c /etc/supervisor/supervisord.conf
如出现:
Unlinking stale socket /var/run/supervisor.sock
输入:
sudo unlink /var/run/supervisor.sock
其他命令:
#修改/增加配置文件后更新配置
supervisorctl update
#重启
supervisorctl reload
#关闭
supervisorctl shutdown
4) 测试
查看是否运行
ps aux | grep supervisord
ps aux | grep uwsgi
客户端查看项目是否成功托管
supervisorctl
浏览器访问阿里云公网IP即可访问到网页。
至此,整个配置已经完成,项目结构如下:
小白实践…