python+django+虚拟环境(virtualenv[wrapper])+nginx+uwsgi在linux中的安装配置

编译安装python3

安装依赖

sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev

 sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev

  sudo apt-get install -y wget build-essential libreadline-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev

  sudo apt-get install libffi-dev
  sudo apt-get install libssl-dev
  sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev

以上有重复的,本人使用第一行,安装成功。

源代码编译安装软件的步骤:

1.下载软件的源代码

wget https://www.python.org/ftp/python/3.8/Python-3.8.3.tar.xz

3.解压缩软件源代码

xz -d python-3.8.3.tar.xz

tar -xf python-3.8.3.tar

4.切换到root: sudo i,并切换进入源代码目录

cd /opt/python-3.8

5. ./configure释放编译文件,make 编译,make install 编译安装

./configure --prefix=/opt/python38/    #注意提示,可能需要根据提示添加参数  会生成makefile文件

make && make install   # 这两部走完,才会生成创建上面的文件夹

6.检查安装路径是否正确

/opt/python38

查看python38下的bin目录,python3的执行文件都在这里

7.配置软连接,快捷启动配置软连接,快捷启动。或者直接把pthon38/bin写入环境变量(如下,尽量用这一步)5354 ln -s /opt/python38/bin/python3 /usr/bin/python355 ln -s /opt/python38/bin/pip3 /usr/bin/pip356 

8.配置系统环境变量,配置PATH,加入python3的目录

#尽量用这一步

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/python347/bin/
#这一步尽量别用了
PATH=$PATH:/opt/python347/bin/
#配置环境变量需谨慎,如果配错了,你的其他命令也会丢失!
9.写入个人配置文件,永久生效/etc/profile
vim /etc/profile #编辑个人配置文件,写入PATH
PATH=$PATH:/opt/python38/bin/
source /etc/profile #读取一下配置文件,生效配置。
编译安装python3.8.3

检查安装情况

cd /opt/python38/bin

./python3 -V    #返回python3.8.3正确,如果不加./就会根据环境变量中的路径,执行系统自带的python3.5的命令

./pip3 -V

升级pip

./pip3 install --upgrade pip

设置软链接,保留系统自带的版本软链接,增加一个python38,以后就用python38操作。

ln -s /opt/python38/bin/python3 /usr/bin/python38

ln -s /opt/python38/bin/pip3 /usr/bin/pip38  

python3+虚拟环境+django安装中的遇到的坑(持续更新。。。)

1.升级或新安装Python3, runserver 运行Python3项目时出现:No module named '_sqlite3'错误

  sqlite3   #可以启动,但这个是启动的老版本python里的sqlite

  python383  # 进入新安装的python383

  import sqlite3    #错误

原因:

  装了多个版本的python,而该链接库默认安装在系统版本上

解决方法:

  执行以下命令:

  [root@localhost]# find / -name _sqlite3.so

  发现在安装的/opt/python383/lib/python3.8/lib-dynload/这个路径下没找到_sqlite3.so

  但是在/usr/lib64/python2.7/lib-dynload/_sqlite3.so是有这个的;

  记住千万不要把python2.7下的_sqlite3.so复制到python3下,是用不了的!

  1.下载编译安装sqlite3

    1.下载sqlite3

      https://www.sqlite.org/download.html  下载
      或者 

      wget https://www.sqlite.org/2018/sqlite-autoconf-3320300.tar.gz
    2.解压:tar -xvzf sqlite-autoconf-3320300.tar.gz

    3.进入目录:cd /download/sqlite-autoconf-3320300/

    4.编译:./configure --prefix=/opt//sqlite

    5.安装 :make -j4&&sudo make install

  2.重新编译安装python3

    进入python3安装目录 :

    [root@localhost]# cd /download/Python-3.8.3/    # 下载后解压的目录,里面有安装文件setup.py,相当于重新安装一次。

    修改setup.py

    [root@localhost Python-3.8.3]# vim setup.py

    查找" sqlite_inc_paths" 

     sqlite_inc_paths=[

        ‘/usr/include’,
        ‘.......’,
        '/opt/sqlite/include',   
        '/opt/sqlite/include/sqlite3',

        # 加入以上两行
    ]

    保存退出;执行命令:

    [root@localhost Python-3.8.3]# ./configure --perfix=/opt/python383 --enable-loadable-sqlite-extensions  #加入编译扩展sqlite

    [root@localhost Python-3.8.3]# make &&  make install

    安装完执行以下命令查看_sqlite3.so情况

    [root@localhost Python-3.8.3]# find / -name _sqlite*.so

    发现python3 多了

    ../Python-3.8.3/build/lib.linux-x86_64-3.8/_sqlite3.cpython-38m-x86_64-linux-gnu.so

    /opt/python383/lib/python3.8/lib-dynload/_sqlite3.cpython-38m-x86_64-linux-gnu.so

  3.把编译好的so文件改名后拷贝到python3.8相应目录
    python383   #进入python3环境

    import sys

      print(sys.path)

      找到与_sqlite3.so类似的目录,如:/opt/python383/lib/python3.8/lib-dynload/

    接下来我们在执行:

    # 根据个人目录情况确定
    cp /opt/python383/lib/python3.8/lib-dynload/_sqlite3.cpython-38m-x86_64-linux-gnu.so
       /usr/local/python3/lib/python3.6/lib-dynload/_sqlite3.so     再次进入python环境     执行命令import sqlite3已经可以正常了。  

2.安装django后使用django-admin生成项目失败解决办法

  django-admin startproject testsite 

  # 出现未发现django-admin错误

 原因:

  /opt/python383/Lib/site-packages/django/bin   未在环境变量echo $PATH中,可能是安装多个版本的python问题
 解决方法:

  1.把django/bin目录加入环境变量

  2.给django-admin设置软连接(推荐)

    ln -s /opt/python383/bin/django-admin /usr/bin/django-admin

 

安装配置启动django(在系统环境中)

1.安装django

pip3 install django==2.1.8   # 在系统环境中安装指定版本的django
#查看django安装情况
  1.python3 # 进入python环境
  2.import django # 引入django
  3.print(django.VERSION)
    (2,1,8, 'final', 0)

2.创建django项目

django-admin startproject website

3.配置启动django

#修改django setting.py配置文件

ALLOWED_HOSTS=['*']

#进入项目目录,启动django

python3 manage.py runserver 0.0.0.0:8000

4.可能碰到的问题

#无法访问站点

  iptables -F     # 清空防火墙规则

  setenforce 0  # 关闭防火墙

#提示pip找不到

pip3 install --upgrade pip

在虚拟环境中安装配置多个django版本(virtualenv+virtualenvwrapper)

1.virtualenv虚拟环境虚拟python安装环境,必须在root中的系统环境中安装

  1.为什么需要安装虚拟环境?

       开发中需要多个django版本,怎样解决?

       在系统环境中,一个python环境下,无法同时安装两个django版本。

  2.安装使用virtualenv

    #安装virtualenv
    pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv

    #创建虚拟环境  venv
    virtualenv --no-site-packages --python=python3   venv
      以上命令创建了一个虚拟环境venv。
      这个虚拟环境是虚拟了一个python解释器环境。
    #激活虚拟环境
    source /data/django2.1.8-python/venv/bin/activate
    #激活进入虚拟环境后,你的环境变量已该表,自动在最前面添加了虚拟环境中的bin目录,可以查看echo $PATH
    #在虚拟环境中安装需要的django版本
    pip3 install django==2.1.8
    django-admin startpreject website
    #退出虚拟环境
    deactivate
安装使用virtualenv

如果已经配置了/etc/apt/sources.list为国内源

直接pip38 install virtualenv  安装即可

2.安装使用虚拟环境扩展管理工具virtualenvwrapper,必须在root中的系统环境中安装配置,可以切换到个人用户中使用

在系统环境下安装virtualenvwrapper,解决virtualenv使用不便,需要来回切换的问题。

  1.系统环境下安装virtualenvwrapper
  pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenvwrapper

  2.配置用户配置文件,使得virtualenvwrapper每次开机就加载

  vim ~/.bashrc   #打开这个文件,写入以下信息(根据自己目录结构修改参数)
    export WORKON_HOME=~/Envs   #设置virtualenv的统一管理目录
    export VIRTUALENVWRAPPER_PYTHON=/opt/python38/bin/python3  #赋值一个变量
    source /opt/python38/bin/virtualenvwrapper.sh   #安装virtualenvwrapper后会在python目录生成一个virtualenvwrapper.sh 脚本,在这里加入启动执行。
  3.读取virtualenvwrapper的环境变量,使得每次开机就加载

  source ~/.bashrc

      使用mkvirtualenv创建虚拟环境时,报错如下:

      ERROR: virtualenvwrapper could not find virtualenv in your path
      提示virtualenv 不在环境中,需要在配置文件添加virtualenv的路径进去,具体配置如下:

     # Python Virtualenv Settings

      export WORKON_HOME=~/Envs
      export VIRTUALENVWRAPPER_PYTHON=/opt/python38/bin/python3
     # 指定virtualenv的路径
      export VIRTUALENVWRAPPER_VIRTUALENV=/opt/python38/bin/virtualenv
      source /opt/python38/bin/virtualenvwrapper.sh

     读取加载
     source ~/.bashrc 
     
     环境变量的另一种处理方法
     用~/.bashrc 只能在一个用户的家目录中的.bashrc中配置,只能当前用户使用,为了能让虚拟目录配置在所有用户下使用,可以把配置加在全局环境中
     sudo vim /etc/profile
     切换root后,执行source /etc/profile

  4.此时,virtualenvwrapper就会自动创建一些管理命令,用来管理虚拟环境

    #创建一个虚拟环境,默认会激活进入当前这个虚拟环境
    mkvirtualenv django2.1.8
    mkvirtualenv django2.2
    #切换不同的虚拟环境
    workon django2.2

    workon django2.1.8
    #停止退出虚拟环境
    deactivate
  5.其他virtualenvwrapper管理命令

  #删除虚拟环境,需要先退出

  rmvirtualenv django2.1.8

  #列举所有虚拟环境

  lsvirtualenv

  #进入当前虚拟环境目录

  cdvirtualenv

  #进入当前虚拟环境site-packages目录中

  cdsitepackages

  #显示site-packages目录中的内容

  lssitepackages 
安装使用虚拟环境扩展管理工具virtualenvwrapper

如果已经配置了/etc/apt/sources.list为国内源

直接pip38 install virtualenvwrapper  安装即可

3.项目部署到服务器的环境准备

#确保开发环境和部署环境的一致性

  1.假设在本地开发环境,准备好了项目+依赖包环境

  2.现在需要把项目上传到服务器,上线发布

  3.那么就要保证服务器的python环境一致性

 

#解决方案

  1.在开发环境中导出当前项目环境所有依赖包

  pip3 freeze > requirements.txt

  会创建一个requirements.txt文件,包含了所依赖的所有包信息

  可以通过pip3 list查看

  2.把requirements.txt上传到服务器,在部署环境中安装依赖包

  pip3 install -r requirements.txt  # 会按顺序读取文件中的依赖包信息,在服务器部署环境中安装。
  
  3.安装到指定目录

  
pip38 install -r requirements.txt --target=/opt/envs/django2.1.8/lib/python3.8/site-packages
  4.如果在联网环境下这样很方便,如果在内网环境,需要下载包,然后上传到服务器安装,这个将在另外一篇中单独介绍。
    
https://www.cnblogs.com/yanjidong/articles/13214639.html

  5.注意事项
     有时候由于多个python版本共存的环境变量问题,会造成依赖包安装到系统环境目录中去的情况,这时候要手动指定虚拟环境安装目录,进行依赖包安装。
    如果发现无法正确安装,那是因为没有调用到虚拟环境中的pip安装程序,可以手动进入虚拟环境中的python里的bin尝试用pip list ,如果显示的是没有安装好的依赖包数量,说明是正确的。
    这时候,你就可以重新用pip批量安装依赖包,但必须要指定虚拟环境的目录,比如:
    pip38 install -r requirements.txt --target=/opt/envs/django2.1.8/lib/python3.8/site-packages   
    (此问题会造成在pycharm中的项目因为虚拟环境中没有安装依赖包而无法使用,具体表现设置--项目:zqswoa--Project Interpreter--(python3.8(django2.1.8)--只有少量包,缺少依赖包)

      mysqlclient和pymysql的比较,可以参考网上意见。这里在用requirements批量安装时会出现mysqlclient无法安装的问题。
    解决方法:到pypi.org下载mysqlclient对应的whl包,创建安装目录执行 pip38 install mysqlclinetxx.whl,手动安装。

 编译安装nginx

最好使用编译安装,可以自己配置安装路径、环境变量等

1.解决依赖包

yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

2.下载源码包

wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
3.解压缩源码
tar -zxvf nginx-1.12.0.tar.gz

4.切换进入解压目录,配置,编译安装

./configure --prefix=/opt/nginx1-12/ 

make && make install

5.操作nginx

进入sbin目录,找到nginx启动命令

#进入nginx主目录,所有东西都在这了

cd /opt/nginx1-12      

#进入可执行命令目录
cd sbin       #里面有一个nginx脚本

./nginx #启动 ,检查端口和进程

./nginx -s stop #关闭

./nginx -s reload #重新加载ngix配置文件,不重启nginx ,提前,你的nginx必须得启动

./nginx -t      #检测nginx.conf语法是否正确

6.nginx软件目录结构
conf
|------nginx.conf 修改nginx主配置文件
sbin 
|------nginx 启动命令
html 
|------index.html 存放网页根目录
nginx编译安装步骤
location / {
  ......
  client_max_body_size 100M;                       //上传文件大小
}



以上用来配置nginx上传大文件,否则超过1M会提示错误。

 

我的nginx配置文件内容

server {
    listen 80;
    server_name 76.20.82.107;
    location / {
         client_max_body_size 100m; //上传文件大小
        # nginx自带ngx_http_uwsgi_module模块,起到nginx和uwsgi交互作用
        # 通过uwsgi_pass设置服务器地址和协议,将动态请求转发给uwsgi处理
        include     /etc/nginx/uwsgi_params;
        uwsgi_pass  76.20.82.107:9000;
              root        html;
              index      index.html   index.htm;
}
      #nginx处理静态页面原               
      location /static {
        alias 、/opt/myProjects/static/django;

}
      location /media{
         alias /opt/myProjects/zqswoa/media;
}
       error_page    500 502 503 504     /50x/html;
       location = /50x.html  {
               root    html;
}






}

 

 

nginx启动,停止,重启

启动   nginx     或者    nginx  -c   /ect/ngnix/nginx.conf   #-c是指定配置文件,不然用默认的配置,后面的文件路径最好从根目录开始,不然会有一个默认目录,试一下就知道了

停止  nginx -s stop

重启  nginx -s reload

 

平滑升级安装nginx

1、下载需要升级的版本
nginx.org/en/download.htm    #页面右侧有安全补丁链接
保存到nginx-1.20.1目录
2、解压
解压完后在nginx-1.20.1目录
tar -zxvf nginx-1.20.1.tar.gz
3.编译
#可以用nginx -V查看当前版本的安装参数信息
进入目录
./configure --prefix=/opt/myAPP/nginx(或/usr/local/nginx) --with-pcre       #可以根据需要的功能加入相应的参数  --with等。。。
回车执行后,用echo $? 查看编译是否成功,0为成功。
成功后执行make,不要加& install
执行后,再用echo $?查看是否成功
4、把编译好的nginx启动文件替换旧的文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old  #/usr/local/nginx 是老的nginx启动文件目录
把新编译的文件拷贝过去
cp /opt/nginx-1.20.1/objs/nginx /usr/local/nginx/sbin/nginx
5、平滑升级
方法1:kill -USR2 'cat /var/run/nginx.pid'
          kill -QUIT 'cat /var/run/nginx.pid.oldbin'
方法2:ps -ef|grep nginx
kill -USR2 3550   #pid号执行新的主进程(新版本)和新的工作进程,依次启动新的主进程和新的工作进程,现在新,旧版本的nginx实例会同时运行,共同处理请求
kill -WINCH 3550 #旧版本主进程号,发送WINCH信号给旧版主进程,旧版主进程就开始从容关闭

# 我的升级经验:如果不是太重要的应用,旧的ngaix改名备份,编译后的新nginx复制到位后,手动关闭nginx后重启。
 

在需要的环境(系统或者虚拟环境)中安装uwsgi 

# 在虚拟环境中安装 

进入虚拟环境venv,安装uwsgi
(venv) [root@hostname IP /opt]$pip3 install uwsgi
检查uwsgi版本
(venv) [root@hostname IP /opt]$uwsgi --version
2.0.17.1
#检查uwsgi python版本
uwsgi --python-version

3.8.3

可能出现的坑:

uwsgi --python-version 报错

  原因:uwsgi 自动绑定到了系统自动的python版本,没有和安装的python3.8.3关联
  解决:

    1.下载tar.gz包,解压安装,然后手动指定软链接

      wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz

    2.解压:
       tar zxvf uwsgi-latest.tar.gz
       cd uwsgi-2.0.19.1/
    3.编译:
       python38 uwsgiconfig.py --build
    这里的python38即指定uwsgi项目运行的python环境,在这之前,我做了软链接指向了我的python3环境
    4.安装:
       python38 setup.py install
    5.然后进行软链接、系统便能够识别uwsgi命令
      ln -s /opt/uwsgi-2.0.19.1 /usr/bin/uwsgi
      uwsgi --python-version 返回 2.0.19.1 正常

 # uwsgi配置

1.配置简单.py文件

  # test.py,进入myprojects目录touch(vim) test.py,

  def application(env, start_response):

    start_response('200 OK', [('Content-Type','text/html')])
     return [b"Hello World"] # python3
  # 运行
   uwsgi --http :8001 --wsgi-file /opt/myprojects/test.py

  或者uwsgi --http :8000 --chdir /home/yixiang/Practice/Python/nginx_django/test_project --module test_project.wsgi   #运行python项目

2.uwsgi测试运行django项目

  uwsgi --http :8000 --module zqswoa.wsgi
  module zqswoa.wsgi:加载指定的wsgi模块 

  生产环境uwsig+nginx配合时,启动参数http一定要换成 socket
  uwsgi --socket :9000 --module zqswoa.wsgi


 # 通过uwsgi.ini启动

进入到项目目录/opt/myProjects/zqswoa

启动 uwsgi -d --ini uwsgi.ini            #  -d表示后台执行

停止 uwsgi --stop uwsgi.pid           #  这个uwsgi.pid是uwsgi.ini中指定的文件,运行后存的是uwsgi进程的pid

重启 uwsgi --reload uwsgi.pid

我的uwsgi.ini配置
[uwsgi]
#http=0.0.0.0:9000
socket = 0.0.0.0:9000
chdir=/opt/myProjects/zqswoa
#wsgi-file=zqswoa.wsgi
module=zqswoa.wsgi
master=true
process=4
threads=4
pidfile=uwsgi.pid
daemonize=/opt/myProjects/zqswoa/uswgi.log

=====================================

网上分享的生产环境配置及说明

 1 # 前面6个根据实际修改,其他的可以不用改 
 2 [uwsgi]
 3 # 项目目录
 4 chdir=/Users/wsl/App/dev/recovery/recovery
 5 # 设置日志目录
 6 daemonize=/Users/wsl/App/dev/recovery/uwsgi.log
 7 # 静态文件的配置,配合static_url使用,前面的static是static_url中的字段
 8 static-map = /static=/Users/wsl/App/dev/recovery/recovery/static
 9 # 指定项目的wsgi模块
10 module=recovery.wsgi
11 # 指定IP端口       
12 http=127.0.0.1:8888
13 # 指定sock的文件路径    配合nginx需要使用socket   
14 socket=/Users/wsl/App/dev/recovery/recovery/uwsgi.sock
15 # 指定pid文件
16 pidfile=/Users/wsl/App/dev/recovery/recovery/uwsgi.pid
17 # 启用主进程
18 master=true
19 # 进程个数       
20 workers=3
21 # 在每个worker而不是master中加载应用
22 lazy-apps=true 
23 # 每个进程最大的请求数
24 max-request = 1000
25 # 启动uwsgi的用户名和用户组
26 uid=root
27 gid=root
28 # 自动移除unix Socket和pid文件当服务停止的时候
29 vacuum=true
30 # 启用线程
31 enable-threads=true
32 # 设置自中断时间
33 harakiri=30
34 # 设置缓冲
35 post-buffering=4096
36 #设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
37 reload-mercy = 8

 

https://www.linuxidc.com/Linux/2017-03/141785.htm    --- 

uWSGI+Django+Nginx的工作原理流程与部署过程

 

posted on 2020-06-25 22:09  东门乱弹琴  阅读(887)  评论(0编辑  收藏  举报

导航