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 #读取一下配置文件,生效配置。
检查安装情况
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
如果已经配置了/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
如果已经配置了/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 存放网页根目录
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的工作原理流程与部署过程