[python]逆水行舟不进则退(1)
工作后迎来的第一个长假期,打算在家休息一下,看看书之类的。但是不写点东西,不做点东西,感觉有些浪费时间。同时也想通过做点东西检验下自己这段时间的收获。其实在我开始写这篇文章的时候心里还是很没底的~交代完背景。开始撸!(干货在最后总结部分)
1.做点什么?
这个时候脑子里就回想起一个问题(原来每次师父,一神问我这个问题的时候,我都一脸茫然。):
用户在浏览器输入网址之后,到看到网站内容的过程中,都发生了什么?
我不知道你们看到这个问题的时候,得到的答案是什么。但是这个问题包含的知识点,很多。说简单也可以,往深了讲也可以说的很深因为牵扯到网站的架构方面。我的意思是:这个问题用来检验我的学习成果是一个十分好的命题。
ok,问题有了。下面开始一步步的分析下这个问题:
问题拆解之后主要是这几个方面:a.缓存
b.dns
c.http协议
d.服务器
服务器原来对我来说是一个黑盒子,现在我要证明我是否真的懂了。那么最好的办法就是自己做一个黑盒子!目标就是:从0搭建一个网站,结构nginx+flask(待定)+uwsgi+mysql。重点是这个网站是干嘛的!我不想写一个博客。。。因为如果要是写一个博客,我肯定写完就再也不去碰它了。没有优化下去的欲望。那么待定吧!(有好的建议也可以留言讨论)
十一结束的时候上线我的网站!
2.准备工作
服务器环境总概览:1:Nginx 1.4.42:python 2.7.10(包括下列python库/工具)2.1:Pip2.2:Virtualenv2.3:uWSGI 2.0.10(应用服务器)2.4: Bottle 0.12.5(web框架)2.5: Cheetah 2.4.4(模版框架)安装过程如遇到问题请参考:http://www.cnblogs.com/xiongpq/p/3381069.html
如果说程序员门槛高,或者拒人千里之外的一点就是布置环境(剃牦牛!)。这个过程简直了!牢骚发完,“吹过的nb哭着也要实现!”——我们公司创始人的名言
a.服务器:阿里云免费十五天(http://free.aliyun.com/)——后面是我的推荐码为EG8RBO,貌似你们要花钱我才有钱。本着研究的精神看看这个是什么鬼
我选的是centos,不懂得话就跟我选一样,下面配置服务的时候方便
链接你的服务器教程:https://docs.aliyun.com/
实例公网ip:云服务器ECS——实例——在实例列表找到你当时选的地区——就看到了公网ip了
密码:点击更多——重置密码——重置完密码,更多里面重启下——等待重启完就可以通过ssh链接你的服务器了
现在服务器上什么都没有,我们需要搭建开发环境
b.搭建环境
1.把自带的是python2.6.6我们升级成2.7.10:
先要安装依赖的库!
yum -y install gcc automake autoconf libtool make gcc-c++ patch byacc bison wget unzip
yum -y install boost-devel db4-devel openssl-devel readline-devel gdbm-devel pcre-devel nc xmlto libevent-devel
yum -y install jasper-devel libjpeg-devel libpng-devel libtiff-devel freetype-devel unixODBC-devel
yum -y install subversion git-core vim libxslt-devel libxml2-devel
yum -y install sqlite-devel
之后参考教程安装:http://blog.csdn.net/my2010sam/article/details/12156821(把里面所有的2.7.3改成2.7.10)就ok啦
编译安装时注意: ./configure --prefix=/usr/local/python27 -with-zlib=/usr/include
解决系统 Python 软链接指向 Python2.7 版本后,因为yum是不兼容 Python 2.7的,所以yum不能正常工作,我们需要指定 yum 的Python版本
1 #vi /usr/bin/yum 2 将文件头部的 3 #!/usr/bin/python 4 改成 5 #!/usr/bin/python_old
2.安装pip
在远程机(阿里云服务器)输入:
wget https://bootstrap.pypa.io/ez_setup.py -O - | python (安装setuptools)
然后按照:http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa/ (安装pip)
最后:ln -s /usr/local/python27/bin/pip /usr/bin/pip (建立软链接,就是快捷方式,你可以在任何地方输入‘pip’)
安装virtualenv
建立virtualenv环境:/usr/local/python27/bin/virtualenv pywork
激活成功:(下面的操作都需要在虚拟环境中进行操作)如下图我的叫虚拟环境叫:xueweihan
安装需要的web框架和模版框架:
pip install Bottle==0.12.5
pip install Cheetah==2.4.4
到目为止,python的环境搭配好了,下面需要安装nginx(web服务器)
3.安装nginx
1.下载nginx:wget http://nginx.org/download/nginx-1.4.7.tar.gz(我用的是1.4.7版本)
2.安装教程:http://www.cnblogs.com/lixiuran/p/3545669.html(注意安装前提)
3.启动脚本问题:http://www.01happy.com/centos-nginx-shell-chkconfig/
4.安装uWSGI(应用服务器,解决python多线程效率底的问题)
pip install uWsgi==2.0.10
安装完成之后,看一下到现在为止都安装了什么东西:pip freeze
环境已经搭建好了。下面配置一些文件。
c.配置服务器
请参考教程: http://www.cnblogs.com/xiongpq/p/3381069.html
这里我把我的nignx和uwsgi的配置贴出来。如果自己看完上面的教程还是有问题的话,可以留言。我会尽快答复,帮你解决。前提是请仔细看上面的教程。
需要注意的部分:uwsgi_pass的地址要和uwsgi监听的地址和端口一样 nginx主要配置部分: location / { include uwsgi_params; uwsgi_pass 127.0.0.1:9090; } uwsgi配置如下 [uwsgi] socket = 127.0.0.1:9090 #socke和uwsgi_pass一样 chdir = /root/pywork/ #这里是文件所在目录 wsgi-file =test.py # 这里是文件名 processes = 1 enable-threads=true socket-timeout=30 daemonize=/data/log/uwsgi.log #日志所在位置,方便以后查看日志
pidfile = /var/run/uwsgi.pid #存放的是进程的id
需要写一个demo,用于测试环境搭配成功!
test.py文件内容如下
coding:utf-8 from bottle import Bottle, route, run, default_app @route('/') def index(): return 'hello world xueweihan!' if __name__=='__main__': run(host='localhost', port=8080) else: application = default_app() # 注意这里
准备工作完成!
测试一下,在浏览器输入公网ip:
总结:这个过程遇到问题最多的还是启动脚本的问题。在这里我没有安装mysql的过程,现在不装也可以,网上的教程很多。我就不重复再写了。我这篇文章有些地方不是很详细,只是贴出了教程的链接。如果在认真看完教程之后有任何问题(确定认真看了教程),都可以留言,我看到会第一时间回复大家。我知道配置环境是一个十分痛苦的过程,所以我会尽我最大的努力解决大家的问题。然后,我也希望你是认真的看完提出的问题。
到目前为止,我的服务器搭建完成了。Nginx+uWSGI 这两个都是服务器,一个是web服务器,一个是应用服务器。
Nginx主要用途是监听80(http协议默认端口),然后有请求就调用uWSGI服务器。这里用到的是uwsgi协议(注意大小写,全小写诗协议名字,uWSGI是服务器名字,诡异吧)。然后通过uWSGI服务器来启动application,应用。
当然Nginx服务器也可以直接调用应用,但是为什么要用uWSGI服务器来启动应用呢?这里,如果的uwsgi.ini 文件中配置多个进程的话。然后通过ps命令查看进程。你就会发现:有很多个uwsgi进程。这是因为,uWSGI是master——worker 并发模型的服务器,用来解决并发问题。主要原因是python这个语言,他的多线程中有个大家耳熟能详的缩写GIL这个东西限制了python多线程的效率,也就是为什么python的多线程回比单线程还慢!所以uWSGI就是分别建立好多个相对独立的环境,多个uwsgi进程(这里表达的有些不好,希望大家可以给一个更好的说法),然后通过这个方式,解决并发的问题!
总而言之,Nginx是用来解决负载均衡,uWSGI用来解决并发问题。当然现在我们不需要考虑这么多,只是了解一下。
好了回到最开始的问题:
用户在浏览器输入网址之后,到看到网站内容的过程中,都发生了什么?
你就会发现原来说的,可以回答的很简单。也可以说的很深,所以这个问题,面试的时候很多人会问。。。看你的知识面
我在今天做这些东西的时候,我就想起我原来看过的一个系列的文章。我打算跟做写一写,或许会对服务器更加的理解。
一起写个web服务器:http://web.jobbole.com/82360/
哎呦不错哦!
还想到原来很多好玩的东西,但是一直没时间实验,动手一写一写。那么我先把建设网站的事情放下来。去玩点有意思的,或许会在这个过程中发现些好的点子。写出一个有意思的网站。(其实还是对自己一个人写一个网站心里没底。。。。还需要多学习!)
----以上内容,如有欠妥的地方,告诉我,我会虚心接受(改不改再考虑。。。)
老样子留下我的个人微信:xueweihan(我是男的!)喜欢python的朋友可以加我,我们一起交流。
作者:削微寒
扫描左侧的二维码可以联系到我
本作品采用署名-非商业性使用-禁止演绎 4.0 国际 进行许可。