美文网首页
记一次django+uwsgi aliyun环境搭建

记一次django+uwsgi aliyun环境搭建

作者: a9b854aded01 | 来源:发表于2019-09-26 06:54 被阅读0次

    主要的安装流程参考原文地址:https://blog.csdn.net/xing851483876/article/details/84306953

    使用XShell工具 上传和下载文件 安装

    yum -y install lrzsz
    或者
    apt install lrzsz
    

    如果rz上传失败请尝试

    $ rz -are --o-sync
    

    1、虚拟环境(virtualenv)的安装

    1、安装virtualenv

    sudo pip install virtualenv
    sudo pip install virtualenvwrapper #安装虚拟环境管理工具
    

    2、在home下创建虚拟环境安装目录

    mkdir .virtualenvs
    

    3、为virtualenv配置环境变量,打开.bashrc文件

    sudo vim ~/.bashrc
    
    在末尾添加两行代码
    export WORKON_HOME=$HOME/.virtualenvs  # 所有虚拟环境存储的目录
    source /usr/local/bin/virtualenvwrapper.sh
    

    使配置生效

    source ~/.bashrc
    

    如果有Python2 Python3两个环境请加入环境变量

    if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    
           export WORKON_HOME=$HOME/.virtualenvs
    
           export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
    
           source /usr/local/bin/virtualenvwrapper.sh
    
    fi
    

    如果遇到" command not found: shopt "的 "~/.bashrc" 配置问题 说明使用的是zsh shell
    将所需配置修改写入~/.zshrc
    执行 source ~/.zshrc
    或者zsh切换bash

    chsh -s /bin/bash
    

    bash切换zsh

    chsh -s /bin/zsh
    

    4、创建虚拟环境,默认命令创建的是python2的虚拟环境,指定创建python3.6的虚拟环境可以使用以下命令

    mkvirtualenv -p /usr/bin/python3.6 XX #XX是虚拟环境的名字,创建python3.5的虚拟环境

    其他命令:
    workon xx #进入虚拟环境XX
    deactivate #退出虚拟环境

    2、在虚拟环境中安装相应的工具包

    我们在本地写django项目肯定是安装了一堆相应的包,需要把他们移植到阿里云上。首先在本地ubuntu进入虚拟环境,在项目根目录下,执行以下命令收集安装的包,就是生成一个包的清单文件plist.txt。

    pip freeze > requirment.txt
    

    然后用xftp把这个requirment.txt文件上传到阿里云项目的根目录,然后进入虚拟环境test(test是我新建的虚拟环境的名字)

    workon test    #进入虚拟环境test
     
    cd到plist.txt所在目录
    pip install -r requirment.txt  #安装txt文件上的包
    

    3、Mysql数据库的安装和数据的迁移
    安装Mysql:输入以下命令,安装过程会设置密码,设置成和原来本地一样的,就不用在setting中修改了。

    sudo apt-get update
    sudo apt-get install mysql-server 
    sudo apt-get install mysql-client
    

    创建数据库:先登录数据库, 然后创建数据库v1,数据库名字也创建成和原来本地一样的,我的叫v1。

    create database v1;
    

    数据的迁移:把本地数据库中的数据复制到阿里云上的数据库中。先在本地生成备份文件,v1是要备份的数据库,v1.sql是生成的备份文件。然后用Xftp把v1.sql文件上传到阿里云。

    mysqldump -u root -p v1 >v1.sql
    

    数据还原:阿里云终端 cd到v1.sql所在目录,输入以下命令

    mysql -u root -p v1<v1.sql
    

    mysql配置:找到mysqld.cnf文件注释掉bind-address这一行

    /etc/mysql/mysql.conf.d/mysqld.cnf   #配置文件路径
     
    #bind-address       = 127.0.0.1   #注释掉这一行
    

    4、修改django的setting文件:

    DEBUG = False
    ALLOW_HOSTS=['XXXXXX'] #改成阿里云的公网IP
    

    USWGI配置
    三、nginx、uWSGI的安装

    在安装前先了解下这几个是什么东西:WSGI、uWSGI、nginx。

    WSGI:PythonWeb服务器网关接口(Python Web Server Gateway Interface),这是一种协议规范,用于规范web server(比如uWSGI)和web application(Flask、Django等)之间的通信方式。这种协议其实是将我们和更加底层的HTTP、TCP等协议分隔开来,使我们在开发的时候可以不用自己去实现这些协议的处理,只关注于更高层次的逻辑处理,实现面向对象的编程。

    uWSGI:uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。它本身可以作为一个服务器单独使用,但是也可以和nginx组合使用。一般Django部署都是用的nginx+uWSGI,可以理解为这种组合性能更优。

    nginx:这是一个高性能的web服务器/反向代理,类似Apache。什么叫反向代理,客户端通过一个代理去访问服务器,这样的代理叫正向代理;同样的服务器前加一个代理和客户端通信,这样的代理叫反向代理。nginx就是用来放在uWSGI前做反向代理。

    image.png
    我们在本地开发的时候没有安装过以上服务器,但是也可以python manage.py runserver运行项目,那是因为Django等框架自带了WSGI服务器,性能不强,可以用于调试。
    转自:https://blog.csdn.net/xing851483876/article/details/84306953

    nginx安装:

    sudo apt-get update
    sudo apt-get install nginx
    

    安装成功后,用浏览器访问你的阿里云IP地址,可以看到以下提示 :
    nginx常用命令:

    service nginx start   #启动
    service nginx stop    #停止
    service nginx reload  #重启
    

    nginx配置:打开配置文件default,路径/etc/nginx/sites-available/default,设置以下内容。一个是server_name后面换成你的阿里云公网IP,有的文章说不换也行。关键是下面2个location,第一个location是设置的和uWSGI的关联。第二个location /static是设置的静态文件的路径。如果你的项目还有media文件夹,那还要加一个location /media,把路径设置上。注意:location 和alias后面有空格。

    server_name 47.106.84.245;
            
            location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            # try_files $uri $uri/ =404;
            include  uwsgi_params;
                    uwsgi_pass  127.0.0.1:8000;  
        }
            location /static {
                   alias /home/myweb/static;
    }
    

    上面nginx配置静态文件有一个问题,就是上面的目录/root/xxx/xxx/static只是我们自己的静态文件的目录,你登录admin后发现admin页面的样式都丢失了。因为django自带的admin的静态文件路径没有导入。所以就需要新建一个文件夹,我的是/root/xxx/xxx/nginx/static,然后执行命令把整个项目的所有静态文件都收集到这个目录下,再修改下上面的配置。
    第一步:新建文件夹 /root/xxx/xxx/nginx/static
    第二步:修改setting.py文件,增加STATIC_ROOT

    STATIC_ROOT='/home/myweb/nginx/static/'    #添加收集静态文件的目录
    STATIC_URL = '/static/'
    STATICFILES_DIRS=(
    os.path.join(BASE_DIR,'static'),   
    

    第三步:执行以下代码收集静态文件

    python manage.py collectstatic
    

    第四步:修改nginx的配置

     location /static {
                   alias /root/xxx/xxx/nginx/static;
    }
    

    uWSGI安装:

    这个是安装在虚拟环境中,先workon test进入虚拟环境,安装uWSGI前需要先安装依赖,输入以下命令完成安装

    apt-get install build-essential python
    apt-get install python-dev
    pip install uwsgi
    

    这里遇到问题uwsgi安装失败 异常栈信息忘了复制了 主要原因是python3还是pip3软连接出错
    我是写在python3重新安装才发现的应该安装没问题可以直接设置软连接
    Python3.6安装
    安装python3.6可能使用的依赖
    yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

    下载python3.6编译安装

    
    # wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
    # tar -xzvf Python-3.6.5.tgz -C  /tmp
    # cd  /tmp/Python-3.6.5/
    把Python3.6安装到 /usr/local 目录
    # ./configure --prefix=/usr/local
    # make
    # make install
    
    python3.6程序的执行文件:/usr/local/bin/python3.6
    python3.6应用程序目录:/usr/local/lib/python3.6
    pip3的执行文件:/usr/local/bin/pip3.6
    
    
    更改/usr/bin/python链接
    # ln -s /usr/local/bin/python3.6 /usr/bin/python 此步骤忽略
    # ln -s /usr/local/bin/python3.6 /usr/bin/python3
    # ln -s /usr/local/bin/pip3.6   /usr/bin/pip3
    

    配置uWSGI:在django项目的根目录下,新建两个文件,uwsgi.ini和run.log 。第一个是uWSGI的配置文件,第二个是日志记录文件。设置uwsgi.ini文件如下:

    [uwsgi]
    #使用nginx连接时使用,Django程序所在服务器地址
    socket=127.0.0.1:9002
    #项目目录
    chdir=/root/xxx/xxx/xxx/xxx
    #项目中wsgi.py文件的目录,相对于项目目录
    wsgi-file=wsgi.py
    # 进程数
    processes=4
    # 线程数
    threads=2
    # uwsgi服务器的角色
    master=True
    # 存放进程编号的文件
    pidfile=uwsgi.pid
    # 日志文件,因为uwsgi可以脱离终端在后台运行,日志看不见。我们以前的runserver是依赖终端的
    daemonize=run.log
    

    chdir是django项目所在目录,socket后面的地址是和上面nginx配置文件中的地址uwsgi_pass 127.0.0.1:8000对应的,规定nginx和uWSGI之间的通信端口。daemonize就是日志文件的路径。disable-logging = true 表示不记录正常信息,只记录错误信息。wsgi-file是你django项目根目录下项目同名目录中有一个wsgi.py文件的路径。pidfile是uwsgi.pid文件的路径,这个文件是uWSGI运行后自动生成的,里面记录了uWSGI的进程号,可以用来重启uWSGI。但是我的uwsgi.pid文件记录的进程号老是不对,用不了。
    ————————————————
    版权声明:本文为CSDN博主「Mars_DD」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xing851483876/article/details/84306953

    uWSGI基本命令:

    启动:uwsgi --ini uwsgi.ini
    停止:uwsgi --stop uwsgi.pid
    重启:uwsgi --reload uwsgi.pid
    

    注:uwsgi启动命令在自己构建的虚拟环境中启动

    然后再外部重启uwsgi服务 这样我们就可以看到启动的进程了

    root      8754  0.0  1.8 131516 37820 ?        S    Sep22   0:03 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
    root      8956  0.0  2.4 224040 49292 ?        Sl   Sep22   0:01 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
    root      8957  0.0  2.2 221896 46744 ?        Sl   Sep22   0:00 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
    root      8958  0.0  2.3 222400 47404 ?        Sl   Sep22   0:00 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
    root      8959  0.0  1.5 205248 31108 ?        Sl   Sep22   0:00 /root/.virtualenvs/xx/bin/uwsgi --iniuwsgi.ini
    
    

    通过外网访问阿里云地址就可以看到nginx代理成功

    如果遇到mysql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
    参考https://blog.csdn.net/lmss82/article/details/4414178

     1.#ps -A|grep mysql
       显示类似:
      1829 ?        00:00:00 mysqld_safe
       1876 ?        00:00:31 mysqld
      2.#kill -9 1829
      3.#kill -9 1876
      4.#/etc/init.d/mysql restart
      5.#mysql -u root -p
    

    uwsgi是运行的virtualenvs 虚拟环境中的程序如果启动在系统中如/user/local/bin是访问不到服务的所以要kill 掉错误的uwsgi进程重新启动虚拟环境中的uwsgi


    image.png

    相关文章

      网友评论

          本文标题:记一次django+uwsgi aliyun环境搭建

          本文链接:https://www.haomeiwen.com/subject/qwdpuctx.html