Linux里python,Django,uwsgi,Nginx等生产环境搭建

1.依赖:
  汇总:yum -y install python-devel openssl-devel bzip2-devel zlib-devel expat-devel gdbm-devel ncurses-devel sqlite-devel gdbm-devel xz-devel tk-devel readline-devel gcc 
        yum -y groupinstall "Development tools"
2.将安装包发送给linux 解压 (注意版本,python2都可以如果是python3必须是3.5.2再高的话,和uwsgi版本不兼容.)
  tar -zxvf Python-3.5.2.tgz
3.cd 到解压目录中,执行:"./configure --prefix=/usr/local/python3.5.2 --enable-optimizations"
  其中"--enable-optimizations"会保证有10%左右的性能优化
4.安装完毕后,在解压目录下执行:"make"
5.在解压目录下:"make install"
6.环境变量:
  vi /etc/profile 在最后一行后面添加:
    export python_home=/usr/local/python3.5.2
    export PATH=$PATH:$python_home/bin
  保存后,执行:source /etc/profile
7.[root@zhj bin]# python3 -m venv py9
  [root@zhj bin]# source py3/bin/acticate 激活虚拟环境
  (py9) [root@zhj bin]# deactivate 退出虚拟环境
  此步选做!!!
8.更改python3为系统默认版本
  1>把 /usr/bin 下为python3添加链接即可
    ln -s /usr/local/python3.5.2/bin/python3 /usr/bin/python
  2>注意:在做1>时,要注意/usr/bin中已有python,所以要把之前的改名
          而且在yum的文件:/usr/bin/yum中要修改:"#!/usr/bin/python:" 为 "#!/usr/bin/python2.6" 防止yum不能使用
9.更新pip
  pip3 install --upgrade pip
10.mysql安装:
  yum install mysql-server
11.安装依赖
  yum install mysql-devel
12.安装mysql驱动
  pip install mysqlclient
=======================================Part2:Django安装=============================================
13.安装django和uwsgi
  13.1 pip install django
        测试 django 是否正常,运行:
        django-admin startproject demosite
        cd demosite
        python manage.py runserver 0.0.0.0:8002
        在浏览器内输入:http://127.0.0.1:8002,检查django是否运行正常。
=======================================Part3:uWSGI安装============================================
14.WSGI服务器的选择很多,包括uWSGI和gunicorn。
  它们都可以处理所有的请求,包括确实应该由python对象处理的,
  也包括不该python对象处理的,比如静态的图像,css,js等文件。
  所以理论上你可以把整个动态网站都用WSGI服务器承载起来,也就是整个应用完全跑在Application服务器上。
15.WSGI是一种Web服务器网关接口。
  它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
  ops:就是为python-web应用的发布定制的规范,应用中能写什么,服务器能识别什么,都遵循统一的规范。
      比如中间件机制,就在规范之内
  ops:WSGI使得 Server 和 App 解耦 ,中间连接的是WSGI协议,即当Server收到请求后,将信息按照WSGI协议
      交给App,App识别信息,得知该执行哪些行为,并将执行结果内容按照WSGI协议描述并发送给Server,
      Server在去识别并响应
  ops:除非你想写一个新的pyton-web框架,否则不用关心WSGI;真正需要关系的是,如何配置和部署app
16.uWSGI

    uWSGI旨在为部署分布式集群的网络应用开发一套完整的解决方案。主要面向web及其标准服务。由于其可扩展性,能够被无限制的扩展用来支持更多平台和语言。uWSGI是一个web服务器,实现了WSGI协议,uwsgi协议,http协议等。
    uWSGI的主要特点是:

    超快的性能
    低内存占用
    多app管理
    详尽的日志功能(可以用来分析app的性能和瓶颈)
    高度可定制(内存大小限制,服务一定次数后重启等)
    uWSGI服务器自己实现了基于uwsgi协议的server部分,我们只需要在uwsgi的配置文件中指定application的地址,
    uWSGI就能直接和应用框架中的WSGI application通信。

17. 安装依赖:yum -y install python-devel (不用再安装,已经在第一步安装)
18. 安装uWSGI:(uWSGI是python的一个模块)
        1>解压:tar -zxvf uwsgi-2.0.17.tar.gz
        2>切到解压目录:make
        3>ln -s /usr/local/uWSGI/uwsgi-2.0.17/uwsgi /usr/bin/uwsgi 链接便于执行
        4>uwsgi --version    # 查看 uwsgi 版本
        5>测试 uwsgi 是否正常:
            新建 test.py 文件,内容如下:
            def application(env, start_response):
                start_response('200 OK', [('Content-Type','text/html;charset=utf-8')])
                return [bytes('你好啊!!','utf-8'),b'zhjzhj']
            然后在终端运行:
            uwsgi --http :8001 --wsgi-file test.py
            在浏览器内输入:http://ip:8001,查看是否有"Hello World"输出,若没有输出,请检查你的安装过程。
19.部署django项目
  *注意,项目中 debug=false,allow_hosts=['*' 或者 uwsgi服务器主机ip]
  简单测试:uwsgi --http 192.168.x.x:8989 --wsgi-file /usr/local/fruit/fruit/wsgi.py --chdir /usr/local/fruit
            但此时静态资源无法访问
20.uWSGI配置:
    [uwsgi]
    http = 192.168.x.x:9000 # 服务器访问地址
    #the local unix socket file than commnuincate to Nginx
    socket = 192.168.x.x:8001
    # the base directory (full path)
    chdir = /usr/local/django_projects/fruit  #项目所在目录
    # Django's wsgi file
    wsgi-file = fruit/wsgi.py #基于项目目录的相对路径
    # maximum number of worker processes
    processes = 4
    #thread numbers startched in each worker process
    threads = 2
    #monitor uwsgi status
    stats = 192.168.x.x:9191
    # clear environment on exit
    vacuum = true
    pidfile = /usr/local/django_projects/uwsgi9090-fruit.pid
    #daemonize-run ,file-to-record-log
    daemonize = /usr/local/django_projects/uwsgi9090-fruit.log
    #static file url like "/static/...." will go to the dir for file
    static-map =/static=/usr/local/django_projects/fruit/static9  #http://ip:port/static/...请求会进入该目录找资源
21.uWSGI操作:在此之前,建议先做静态资源处理(见步骤22)
    启动uwsgi:uwsgi --ini uwsgi.ini
    停止uwsgi:uwsgi --stop uwsgi9090-fruit.pid #uwsgi9090-fruit.pid是相对路径写法
    重新加载配置:uwsgi --reload uwsgi9090-fruit.pid #uwsgi9090-fruit.pid是相对路径写法
22.静态文件访问不到处理:
    1>*在settings中:
            STATIC_ROOT = os.path.join(BASE_DIR,'static999') #运行 python manage.py collectstatic时会自动创建static
       部署前先执行:
            python manage.py collectstatic. 会将project下所有app的static目录内容汇总到BASE_DIR/static9下
       有了如上操作,在project下就有了所有静态文件
      *在uwsgi的ini中static-map =/static=/usr/local/django_projects/fruit/static999即可
      *然后启动uwsgi即可
    2>在template中使用的都是{%static 'xx/xx/logo02.png'} ==> /static/xx/xx/logo02.png
      加之settings中的STATIC_URL = '/static/' 所以 /static/xx/xx/logo02.png==>查找静态资源xx/xx/logo02.png
      而django会自动在app下的static目录中去查找静态资源,即 app_dir/xx/xx/logo02.png
      最终定位静态资源
    3>在uwsgi运作过程中过程类似,首先浏览器看到的静态资源路径为  /static/xx/xx/logo02
      此时在uwsgi的ini配置中添加:static-map =/static=/usr/local/django_projects/fruit/static9
      即请求url中以"/static"开头的请求会路由到/usr/local/django_projects/fruit/static9路径中查找文件
      如:/static/a/b/c.png 会查找 /usr/local/django_projects/fruit/static9/a/b/c.png
    4>即在django中:STATIC_URL = '/static/' 使请求  /static/xx/xx/logo02.png 到app下static目录中找资源
        在uwsgi中:static-map=.... 使请求 /static/xx/xx/logo02.png 去/usr/local/django_projects/fruit/static9中找资源
补充:uwsgi负载监控
    1>pip install uwsgitop 安装工具
=======================================Part4:nginx安装============================================
23.解压nginx1.11.tar
24.安装依赖:yum install gcc pcre-devel  zlib-devel
25.在解压目录下:./configure
26.在解压目录下:make && make install 即可安装完毕,安装路径默认为/usr/local/nginx
27.为了方便执行:ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
28.nginx 开启
   nginx -s stop 关闭
   nginx -s reload 重启
29.访问:http://ip:80 即可访问到nginx首页
30.nginx的配置文件位置:/usr/local/nginx/conf/nginx.conf,在此处添加自己的配置信息
31.配置nginx:
    upstream django99 {
        server 127.0.0.1:8001; # uwsgi的配置中指定的
    }
    server {
        # the port your site will be served on
        listen      8000;
        # the domain name it will serve for
        server_name .example.com; # substitute your machine's IP address or FQDN
        charset     utf-8;
        
        # max upload size
        client_max_body_size 75M;   # adjust to taste
     
        # Django media
        location /media  {
            alias /path/to/your/mysite/media;  # your Django project's media files - amend as required
        }
     
        location /static {
            alias /path/to/your/mysite/static; # your Django project's static files - amend as required
        }
     
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
        }
    }
    *其中uwsgi_params文件可以在nginx的安装目录中找到,将其放到项目目录下
    *至此,nginx+uwsgi+django 部署完毕 而且已经做了动静分离
     http://ip:9000/xxxx 只经过uwsgi
     http://ip/xxx 经过nginx
=======================================Part5:Ngins补充============================================
1、【alias】——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,
    指向【alias】配置的路径。如:
    location /test/   
    {   
        alias/first/second/img/;   
    }  
即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/1.jpg。
2、【root】——根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,
    指向【root】配置的路径,并把location配置路径附加到其后。如:
    location /test/   
    {   
        root /first/second/img/;   
    }  
即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/test/1.jpg,
相较于alias,使用root会把/test/附加到根目录之后。
3、【proxy_pass】——反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到【proxy_pass】配置的URL,是否会附加location配置路径与【proxy_pass】配置的路径后是否有"/"有关,有"/"则不附加,如:
    location /test/   
    {   
        proxy_pass http://127.0.0.1:8080/;   
    }  
即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/1.jpg(未附加/test/路径)。
    upstream tomcat-serversZHJ {
            server 192.168.0.103:8989;
            server 192.168.0.103:8990;
        }
    location / {
         proxy_pass http://tomcat-serversZHJ; #多个主机,形成集群,并可以负载均衡
    }

你可能感兴趣的:(linux)