[python]逆水行舟不进则退(1)

时间:2022-03-02 10:51:08

  工作后迎来的第一个长假期,打算在家休息一下,看看书之类的。但是不写点东西,不做点东西,感觉有些浪费时间。同时也想通过做点东西检验下自己这段时间的收获。其实在我开始写这篇文章的时候心里还是很没底的~交代完背景。开始撸!(干货在最后总结部分)

1.做点什么?

  这个时候脑子里就回想起一个问题(原来每次师父,一神问我这个问题的时候,我都一脸茫然。):

     用户在浏览器输入网址之后,到看到网站内容的过程中,都发生了什么?

  我不知道你们看到这个问题的时候,得到的答案是什么。但是这个问题包含的知识点,很多。说简单也可以,往深了讲也可以说的很深因为牵扯到网站的架构方面。我的意思是:这个问题用来检验我的学习成果是一个十分好的命题。

  ok,问题有了。下面开始一步步的分析下这个问题:

  问题拆解之后主要是这几个方面:a.缓存

                 b.dns

                 c.http协议

                 d.服务器

  服务器原来对我来说是一个黑盒子,现在我要证明我是否真的懂了。那么最好的办法就是自己做一个黑盒子!目标就是:从0搭建一个网站,结构nginx+flask(待定)+uwsgi+mysql。重点是这个网站是干嘛的!我不想写一个博客。。。因为如果要是写一个博客,我肯定写完就再也不去碰它了。没有优化下去的欲望。那么待定吧!(有好的建议也可以留言讨论)

  十一结束的时候上线我的网站!

2.准备工作  

  服务器环境总概览:
  1:Nginx 1.4.4
  2:python 2.7.10
  (包括下列python库/工具)
  2.1:Pip
  2.2:Virtualenv
  2.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/ 

[python]逆水行舟不进则退(1)

  实例公网ip:云服务器ECS——实例——在实例列表找到你当时选的地区——就看到了公网ip了

  密码:点击更多——重置密码——重置完密码,更多里面重启下——等待重启完就可以通过ssh链接你的服务器了

  [python]逆水行舟不进则退(1)

现在服务器上什么都没有,我们需要搭建开发环境

  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版本

  #vi /usr/bin/yum
 将文件头部的
 #!/usr/bin/python
 改成
 #!/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

[python]逆水行舟不进则退(1)

  安装需要的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

    [python]逆水行舟不进则退(1)

  环境已经搭建好了。下面配置一些文件。

  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:;
} uwsgi配置如下
[uwsgi]
socket = 127.0.0.1: #socke和uwsgi_pass一样
chdir = /root/pywork/ #这里是文件所在目录
wsgi-file =test.py # 这里是文件名
processes =
enable-threads=true
socket-timeout=
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:

[python]逆水行舟不进则退(1)

总结:这个过程遇到问题最多的还是启动脚本的问题。在这里我没有安装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的朋友可以加我,我们一起交流。