部署地址:123.56.7.181 (已失效)
Ubuntu+Flask+Nginx+uWSGI+Mysql搭建阿里云Web服务器
首先,在部署之前,要知道各个技术都是用来做什么的,以及他们在Web服务器系统中的位置。
参考结构图:
自底向上分析,浏览器从用户输入域名访问网站开始,与网站进行交互操作,到最后离开网页,浏览器一直在发送请求、返回响应。
当浏览器的请求到达Web服务器时,Web服务器接收 HTTP 请求并返回响应。常见的Web服务器有 Nginx,Apache,IIS等,我们在阿里云的Ubuntu环境下搭建Web服务器选择Nginx,选择Nginx的理由?
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝
反向代理是什么?有什么用?
客户端本来可以直接通过HTTP协议访问某网站应用服务器,在中间加上一个Nginx服务器,客户端请求Nginx,Nginx请求应用,然后将结果返回给客户端,此时Nginx就是反向代理服务器。
作用:
1.安全,客户端对Web服务器的访问需要先经过反向代理服务器。这样可以防止外部程序对Web服务器的直接攻击。
2.负载均衡,反向代理服务器可以根据Web服务器的负载情况,动态地把HTTP请求交给不同的Web服务器来处理,前提是要有多个Web服务器。
3.提升Web服务器的IO性能。一个HTTP请求的数据,从客户端传输给服务器,是需要时间的,例如N秒,如果直接传给Web服务器,Web服务器就需要让一个进程阻塞N秒,来接收IO,这样会降低Web服务器的性能。如果使用反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提升Web服务器的性能。还有一些静态文件的请求,可以直接交给反向代理来处理,不需要经过Web服务器。
接着就到了WSGI:
WSGI,Python用于Web开发的通信协议;
uWSGI,充当Web服务器或中间件的程序:如果架构是Nginx+uWSGI+Flask,uWSGI是一个中间件;如果架构是uWSGI+Flask,uWSGI是一个服务器;
uwsgi,是uWSGI程序实现的一个自有的协议;
选择uWSGI的理由?
Web协议出现顺序:
CGI -> FCGI -> WSGI -> uwsgi
uwsgi,比FCGI和WSGI都快,主要特征是采用二进制来存储数据,之前的协议都是使用字符串,所以在存储空间和解析速度上都优于字符串型协议.
总结一次网站请求响应的流程:
浏览器:用户向我发送了一个请求,我将这个请求转达给Web服务器Nginx。
Nginx:Hey,WSGI,我刚收到了一个请求,我需要你作些准备,然后由Flask来处理这个请求。
WSGI:OK,Nginx。我会设置好环境变量,然后将这个请求传递给Flask处理。
Flask:Thanks WSGI!给我一些时间,我将会把请求的响应返回给你。
WSGI:Alright,那我等你。
Flask:Okay,我完成了,这里是请求的响应结果,请求把结果传递给Nginx。
WSGI:Good job!Nginx,这里是响应结果,已经按照要求给你传递回来了。
Nginx:Cool,我收到了,我把响应结果返回给客户端。
浏览器:接收Nginx返回响应,加载页面,等待用户下一次发送请求
以上部分的参考资料:
http://blog.csdn.net/lihao21/article/details/52304119
http://www.cnblogs.com/Xjng/p/aa4dd23918359c6414d54e4b972e9081.html
接下来该部署服务器了,阿里云购买学生ECS服务器,Ubuntu14.04系统(自带了Python2.7)
如果本机是ubuntu,服务器也是ubuntu就方便了,直接用scp命令把本地Flask程序拷贝到服务器上,scp命令:
scp -r 本地目录 用户名@IP地址 : 服务器上的目录,需要输入服务器的用户密码
接下来先从阿里云进入服务器控制台
1. 更新apt-get sudo apt-get update sudo apt-get upgrade 2. 安装SSH sudo apt-get install ss
阿里云提供的控制台比较简陋,我们可以在本地使用SSH命令远程连接服务器,本地的Terminal用起来更方便,ssh命令: ssh 用户名@IP地址,需要输入服务器的用户密码
连接成功后开始配置环境,先从MySQL开始
1. 安装 sudo apt-get install mysql-server 2. 配置 2.1 数据库初始化: sudo mysql_install_db 2.2 运行数据库Mysql安全配置向导(根据提示操作即可) sudo mysql_secure_installation
然后安装pip、env
1.安装python-dev包 sudo apt-get install python-dev 2.安装pip sudo apt-get install python-pip
3.安装配置VirtualEnv
VirtualEnv可以管理多个开发环境,VirtualEnvWrapper使得VirtualEnv变得更好用
sudo pip install virtualenv virtualenvwrapper
安装完成以后,需要在环境变量中加入一些配置:
echo "export WORKON_HOME=~/Env" >> ~/.bashrc
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc
source ~/.bashrc
然后就可以开始建立一个虚拟环境:
mkvirtualenv first
你会发现,提示符变成(first)user@hostname:~$,表示现在已经进入first的虚拟环境,在此环境下进行的pip等操作,只会在当前环境下生效
退出当前的虚拟环境:
deactivate
安装uWSGI、Nginx
sudo pip install uwsgi
sudo apt-get install nginx
配置uWSGI、Nginx:
uWSGI在项目目录下新建config.ini,配置参数在此填写
Nginx在/etc/nginx/sites-available/default,配置参数在此填写
配置完毕后
sudo service nginx restart
sudo service uwsgi restart
启动后终端处于监控状态,此时打开浏览器访问网站,有
1、Nginx欢迎界面:检查配置文件,是否目录填写错误
2、502错误:看上去是代理服务器的问题,多数情况下一般是Flask程序的问题,服务器运行和本地运行的代码并非完全一样,注意检查启动代码
3、网站主页:虽然这时算是配置成功了,但仍然可能出现若干问题,比如数据库字符集/账户问题,查看服务器上uWSGI监控的日志排除错误。
参考资料:
https://segmentfault.com/a/1190000007262187
http://www.jianshu.com/p/84978157c785
http://www.cnblogs.com/Ray-liang/p/4173923.html?utm_source=tuicool&utm_medium=referral