zoukankan      html  css  js  c++  java
  • [python]逆水行舟不进则退(1)

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

    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/ 

      实例公网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的朋友可以加我,我们一起交流。

  • 相关阅读:
    numpy通用函数
    机器学习之随机森林
    机器学习之支持向量机
    机器学习之逻辑回归
    机器学习之决策树
    机器学*之K*邻
    机器学习之线性回归
    模型之各个指标
    模型之信息熵
    模型之决策树
  • 原文地址:https://www.cnblogs.com/xueweihan/p/4852906.html
Copyright © 2011-2022 走看看