设为首页 收藏本站
查看: 748|回复: 0

[经验分享] [python]逆水行舟不进则退(1)

[复制链接]
累计签到:29 天
连续签到:1 天
发表于 2015-11-29 12:26:25 | 显示全部楼层 |阅读模式
  工作后迎来的第一个长假期,打算在家休息一下,看看书之类的。但是不写点东西,不做点东西,感觉有些浪费时间。同时也想通过做点东西检验下自己这段时间的收获。其实在我开始写这篇文章的时候心里还是很没底的~交代完背景。开始撸!(干货在最后总结部分)
  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/ 
   DSC0000.png
    实例公网ip:云服务器ECS——实例——在实例列表找到你当时选的地区——就看到了公网ip了
    密码:点击更多——重置密码——重置完密码,更多里面重启下——等待重启完就可以通过ssh链接你的服务器了
DSC0001.png
  
  现在服务器上什么都没有,我们需要搭建开发环境
  
  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
DSC0002.png
  安装需要的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(注意安装前提)
  4.安装uWSGI(应用服务器,解决python多线程效率底的问题)
     pip install uWsgi==2.0.10
  安装完成之后,看一下到现在为止都安装了什么东西:pip freeze
DSC0003.png
  环境已经搭建好了。下面配置一些文件。
  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:
DSC0004.png
  
  总结:这个过程遇到问题最多的还是启动脚本的问题。在这里我没有安装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的朋友可以加我,我们一起交流。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-144912-1-1.html 上篇帖子: Python初体验之基础语法(三) 下篇帖子: Python中类的属性的访问控制
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表