linux生产环境搭建

安装方式(linux-mysql)

(这里是在主目录下安装:)

  • yum install -y mysql-server #yum安装,需要外网环境
  • 将rpm文件,传送给linux,然后,通过rpm指令完成安装
    • rpm -ivh perl-*.rpm #安装所有perl依赖
    • rpm -Uvh mysql-libs-5.1.73-7.el6.i686.rpm #更新mysql的类库
    • rpm -ivh mysql-5.1.73-7.el6.i686.rpm mysql-server-5.1.73-7.el6.i686.rpm #安装mysql主服务

启动mysql服务

  • service mysqld start/stop/restart/status
    登陆mysql表:mysql -u root -p123456
  • 选择库 (show databases);
  • 选择表(show tables)
  • 查询表(select * from tables where …….)

远程权限

  • 到mysql库的user表中
  • update user set host=’%’,password=password(‘123456’) where host=’127.0.0.1’; #添加可以远程访问的账号
  • flush privileges; #刷新权限,保证新添加的账号可用
  • 关闭linux的防护墙,保证3306可以访问//关闭防火墙方法:service iptables stop

防止mysql本地客户端数据乱码

/etc/my.cnf 中添加如下配置,即可
[client]
default-character-set=utf8

如上配置只作用客户端,要保证程序中数据不乱码:建库,建表时指定统一的字符集即可

mysql卸载

  • rpm -e mysql-server #只需卸载主服务即可
  • rm -rf /var/lib/mysql #删除所有mysql的数据

root密码找回

  • 到 /etc/my.cnf下添加配置
    [mysqld]
    ...
    skip-grant-tables   #注意,建议在拆除网线的情况下添加  (而且添加配置后,需要重启mysqld服务)(mysqld service restart)
    #skip-grant-tables(跳过mysql访问table的权限==不需要密码)
    
  • mysql -u root -p即可登录mysql
  • update user set password=password(‘123’) where host=%;//修改密码
    flush privileges;即可(用来刷新权限)
  • 将my.cnf的配置删除或注释

myql安装

  • 安装过程 略
  • 安装依赖:yum install mysql-devel
  • 安装驱动:pip install mysqlclient

python安装

  • yum -y install python-devel openssl-devel bzip2-devel zlib-devel expat-devel ncurses-devel sqlite-devel gdbm-devel xz-devel tk-devel readline-devel gcc
  • yum -y groupinstall “Development tools”
  • 如上两步,汇总安装了python生产环境的各种第三方依赖包
  • 正式安装,从下一步开始
  • 将python的tar包发送给linux (建议位置:/usr/local/xx)
    //所谓的usr/local下的目录是把所有公共共享的资源存放在一个目录下的设置
  • 解压tar包:tar -zxvf Python-3.5.2.tgz ,会在当前目录下,出现解压目录
  • cd到解压目录中配置:./configure –prefix=/usr/local/python3.5.2 –enable-optimizations
    目的:检测环境中依赖是否完整,设置python的安装位置,
    同时生成一个编译文件,用于进行python编译:make
    
  • cd 到解压目录中:先 make 编译 然后 make install 安装
    安装后的日志如下
    ....
    Collecting setuptools
    Collecting pip
    Installing collected packages: setuptools, pip
    Successfully installed pip-8.1.1 setuptools-20.10.1
    
  • 设置环境变量:/etc/profile中添加配置 // /etc/profile 用来设置环境变量的文件
    在文件末尾追加,不要改动文件的其他内容!!!!!!!
    export python_home=/usr/local/python3.5.2
    export PATH=$PATH:$python_home/bin
    
    注意,设置好后,为了让环境变量生效:source /etc/profile,然后 python3即可进入python3的环境 (source /etc/profile)让环境变量生效
    注意,此时系统自带的python2 依然是默认python解释器
  • 将python3 设置为系统默认python解释器
    • 将/usr/bin下的python文件删除或改名
    • 将python3的执行文件链接到 /usr/bin/python
      ln -s /usr/local/python3.5.2/bin/python3 /usr/bin/python
      
    • 由于yum用python2编译执行,所以需要单独为yum设置为python2,找到/usr/bin/yum文件,修改文件头:#!/usr/bin/python2.6
  • 更新pip
    • pip3 install –upgrade pip

Django 安装

  • pip install django==”2.0.2”
  • 测试使用:
    • django-admin startproject testproj 在当前目录下创建一个project:”testproj”
    • cd到testproj目录下的testporj目录下settings.py 修改配置:ALLOWED_HOSTS = [“*”]
    • 启动django内置的web服务器。cd到testproj目录下,执行:python manage.py runserver ip:port
    • 在浏览器中访问:ip:port

WSGI 协议

  • 一种Web服务器网关接口。是一个协议,是一个规范。
  • 一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Django框架写的程序)通信的规范
  • python-web应用的中能写什么,服务器能识别什么,都遵循统一的WSGI规范。进而保证双方的通信
  • WSGI使得 Server 和 App 解强耦合 ,中间连接的是WSGI协议

uWSGI服务器安装

WSGI协议下web服务器很多:django内置,uWSGI,gunicorn

  • 将tar发送linux
  • 解压tar:tar -zxvf uwsgi-2.0.17.tar.gz
  • cd到解压目录下,编译:make
  • 为了可以更方便的执行 uwsgi #启动uWSGI服务器 ,定制链接:
    ln -s /usr/local/uwsgi-tar/uwsgi-2.0.17/uwsgi /usr/bin/uwsgi
    则可以在任意目录下执行 uwsgi 去启动uWSGI服务器
  • 测试使用python的wsgi服务器-uWSGI
    • 在任意的一个目录中定义一个phthon脚本:hilo.py
      def application(env, start_response):
          start_response('200 OK', [('Content-Type','text/html;charset=utf-8')])
          return [bytes('你好啊!!','utf-8'),b'zhjzhj']
      
    • 启动uWSGI服务器,并部署hilo.py程序
      uwsgi –http 192.168.248.128:8001 –wsgi-file hilo.py #注意hilo.py可以写成绝对路径
    • 浏览器访问:192.168.248.128:8001

uWSGI服务器启动,并部署django项目

  • 让uwsgi项目下的django项目和mysql数据库捆绑移植
  • 首要去/etc/my.cnf下去设置mysqld的配置
  • 设置mysql的引擎默认为:innodb**
    在/etc/my.cnf的[mysqld]中添加配置:default-storage-engine=InnoDB
  • 建议设置为严格模式:
    在/etc/my.cnf的[mysqld]中添加配置 : sql_mode=STRICT_TRANS_TABLES
    • mysql> show variables where variable_name like ‘%mode%’;#可以查看mysql的配置参数
  • 在数据库中建好项目需要的database:“db9”
    • 使用Navicat创建即可,注意字符集为 utf8
  • 在Django项目的settings.py中修改配置

    DEBUG = False  #去掉开发模式
    ALLOWED_HOSTS = ["*"] #开放访问host
    DATABASES = { #合适数据库参数
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'db9',
            'USER': 'root',
            'HOST': 'localhost',
            'PORT': '3306',
            'PASSWORD': '222222'
        }
    }
    
  • 发送项目到linux并做移植
    python manage.py makemigrations
    python manage.py migrate

  • 编写uWSGI的配置文件
    随意找一个目录,定义一个文件:config.ini
    [uwsgi]
    http = 192.168.248.128:9000 # uWSGI服务器访问地址
    #uWSGI和nginx通信的port
    socket = 192.168.248.128:9001
    # the base directory (full path)
    chdir = /usr/local/django_projects/ems #项目所在目录
    # Django's wsgi file
    wsgi-file = ems/wsgi.py #基于项目目录的相对路径
    # maximum number of worker processes
    processes = 4
    #thread numbers startched in each worker process
    threads = 2
    #monitor uwsgi status  用来监控uwsgi的状态
    stats = 192.168.248.128:9002
    # clear environment on exit
    vacuum = true
    pidfile = /usr/local/django_projects/ems/uwsgi.pid #进程ID存放于此文件,位置可以自定义
    #daemonize-run ,file-to-record-log
    daemonize = /usr/local/django_projects/ems/uwsgi.log #后台启动模式,日志文件记录位置自定义
    #http://ip:port/static/...请求会进入该目录找资源,此处可以指向某个app下的static目录
    #或是将所有静态文件汇总到项目的某一个目录下,然后配置在此是更好的选择
    #汇集所有已安装app的静态资源到一个目录下,请参见后续内容
    #http://ip:port/static/a/b/c/d.png   ==>  /usr/local/xxxx/static9/a/b/c/d.png
    static-map =/static=/usr/local/django_projects/ems/static9   
    
  • 根据如上配置启动uWSGI服务器
    uwsgi –ini config.ini #注意:config.ini是一个相对路径
  • 关闭服务器
    uwsgi –stop /usr/local/django_projects/ems/uwsgi.pid #通过进程id文件
  • 部署项目技巧:静态资源管理之汇总
    • 在project的settings.py中添加配置:STATIC_ROOT = os.path.join(BASE_DIR,’static9’)
      STATIC_ROOT指向project目录下的static9目录
    • 执行汇总指令:python manage.py collectstatic
    • 这样所有的静态资源目录会在项目目录下自动生成一个static9目录
      会将所有已安装 APP下的静态资源 以及
      额外添加的静态目录 STATICFILES_DIRS 汇总到指定目录
    • 然后在uWSGI的配置文件中:static-map =/static=/usr/local/xxx/xxx ==>指定目录

安装nginx

uWSGI属于应用服务器,更适合做动态内容的执行

nginx属于web服务器,更合做静态内容的处理(js,css,image)

  • 将tar包发送的linux
  • 解压 tar -zxvf nginx-1.11.1.tar.gz
  • 安装依赖 yum install gcc zlib-devel pcre-devel 不过gcc和zlib-devel已经安装过
  • cd到解压目录:./configure #配置检测
  • cd到解压目录:make && make install #编译并安装
  • 安装完成,安装路径为/usr/local/nginx ,日志路径为 /usr/local/nginx/logs ,
    可执行文件路径为 /usr/local/nginx/sbin ,配置文件路径为 /usr/local/nginx/conf
    欢迎页面路径为 /usr/local/nginx/html
  • ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx 制作连接,便于执行nginx指令
  • nginx #启动
    nginx -s stop #关闭
    nginx -s reload #重启
    http://ip:80即可访问nginx欢迎页面

nginx配置

到配置路径中的nginx.conf (upstream)

upstream django99{
    server 192.168.180.131:9001; # uWSGI's socket = 192.168.x.x:8001
}#uwsgi 服务器的ip和port 
server {
    listen 80;
    server_name  192.168.180.131;#nginx服务器的ip和端口号
    charset utf-8;
    location / {
        uwsgi_pass  django99;
        include  /usr/local/uwsgi_params; # the uwsgi_params file you installed
    }    
    location /static {
        alias /usr/local/static; # your Django project's static files - namend as required
    }
}

配置好后,重启nginx即可

克隆虚拟环境

1.vi /etc/sysconfig/network-scripts/ifcfg-eth0
2.删除HWADDR所在行,和UUID所在行
3.删除 /etc/udev/rules.d/70-persistent-net.rules
4.reboot 重启虚拟机

负载均衡策略

搭建uWSGI集群,只需要多做积分uWSGI的配置文件,文件中设置不同的ip:port,指向不同的project,然后启动多个uWSGI即可

*默认:轮询 rr
        upstream django {
            server 192.168.0.103:8989;
            server 192.168.0.103:8990;
        }
*iphash:基于ip的负载均衡.
        upstream django {
            ip_hash;
            server 192.168.0.103:8989;
            server 192.168.0.103:8990;
        }    
*权重轮询:
        upstream django {
            server 192.168.0.103:8989 weight=1;
            server 192.168.0.103:8990 weight=2;
        }
*最小连接数:
        upstream django {
            least_conn;
            server 192.168.0.103:8989;
            server 192.168.0.103:8990;
        }

至此,一个uWSGI集群搭建完成,nginx作为反向代理服务器和web服务器接收请求,然后处理静态的部分,动态部分按照负载均衡策略转发给某一个uWSGI服务器。

至此python-web-project成功运行于 一个对高并发有更好支持,具有高可用性的系统中