00 工作笔记(ubuntu开发环境项目 部署到 红旗linux的工作环境)

在ubuntu16.4开发, 系统迁移到红旗linux上,遇到了一些情况。

问题一: 红旗linux上,找不到pip

明明安装过了python3, python3自带pip,输入pip为什么找不到?

原因:没有做link

pip -V 

参考:https://www.cnblogs.com/belic/p/python3_install.html

分析: 安装源码程序编译时,

./configure prefix=/usr/local/python3

make & makefile

源码的安装一般由3个步骤组成:配置(configure)、编译(make)、安装(make install),具体的安装方法一般作者都会给出文档,这里主要讨论配置(configure)。Configure是一个可执行脚本,
它有很多选项,使用命令./configure –help 个人认为,你可以忽略其他的一切,但请把—prefix加上为了以后的维护方便,如果没有用这个选项,安装过程结束后,该软件所需的软件被复制到不同的系统目录下,很难弄清楚到底复制了那些文件、
都复制到哪里去了—基本上是一塌糊涂了,—prefix选项的另一个好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;
移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)

 

目的是把可执行程序放在特定的目录。如果不指定prefix,可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc。其它的资源文件放在/usr /local/share

解决:

#ln -s /usr/local/python3/bin/python3 /usr/bin/python3

#ln -s /usr/local/python36/bin/pip3 /usr/bin/pip

#pip  install -U pip

 验证:

#whereis pip3 , 则会显示来自于 /usr/bin/python3

其实,安装完python3后,应该把旧版本的python也一起替换掉。参考:https://blog.csdn.net/lukabruce/article/details/82186534

问题二:安装完pip后,安装visualenv的问题

在pip install virtualenv后直接用 “virtualenv my_new_env” 来创建虚拟环境(my_new_env为虚拟环境的目录名)会提醒command not found
这是因为/usr/bin/中还没有创建软连接。

方法1:去原来的安装路径目录下执行,但太麻烦:  /usr/local/python3/bin/virtualenv env

如果不知道路径的可以通过 “find / -name virtualenv” 查找

方法2:创建链接

ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv

然后任意目录下都可以执行了。

virtualenv  new_env

 

 

 

问题二: pip install xxx 特别慢,下载东西的速度只有 10k/秒 左右

 

生成requirements.txt文件在开发环境ubuntu上:

(1)pip freeze > requirements.txt

(2)拷贝到红旗linux环境

(3)pip install -r requirements.txt   特别特别慢

解决:更换pip源泉,我换的清华源

    阿里云 https://mirrors.aliyun.com/pypi/simple/
  中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  豆瓣(douban) http://pypi.douban.com/simple/
  清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
  中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

1.临时安装替换: pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple

2.永久替换:修改 ~/.pip/pip.conf (没有就创建一个), 内容如下:

[global]

index-url = https://pypi.tuna.tsinghua.edu.cn/simple

 

 

 

 

 windows:
直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下

[global]

index-url = https://pypi.tuna.tsinghua.edu.cn/simple

 参考https://blog.csdn.net/chenghuikai/article/details/55258957

 

 问题三 django can't find new sqlite version? (SQLite 3.8.3 or later is required (found 3.7.17))

启动django时候报上述错误 :python3 manage.py runserver


sqlite版本太老,下载安装新版本,并修改配置链接。

参考:https://qiita.com/rururu_kenken/items/8202b30b50e3bfa75821

下载,解压
$ wget https://www.sqlite.org/2019/sqlite-autoconf-3280000.tar.gz $ tar xvfz sqlite-autoconf-3280000.tar.gz
$ cd sqlite-autoconf-3280000
安装,路径为/usr/local
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
$ sudo find /usr/ -name sqlite3 【find 路径 -name 要找的内容】

上述指令,找到一大堆结果
/usr/bin/sqlite3  #老版本sqlite
/usr/lib64/python2.7/sqlite3 #目录
/usr/lib64/python3.7/sqlite3 #目录
/usr/local/bin/sqlite3  #刚刚安装编译的新版本sqlite
删除垃圾
$ rm sqlite-autoconf-3280000.tar.gz
$ rm -rf ./sqlite-autoconf-3280000

确认版本
$ /usr/local/bin/sqlite3 --version
  3.28.0 2019-04-16
$ /usr/bin/sqlite3 --version
  3.7.17 2013-05-20
切换版本
$ sudo mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
$ sudo ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3

# 因为sqlite3会依赖并使用第三方库,所有要设置共享库
# vi ~/.bashrcし,追加下面一行,

$ export LD_LIBRARY_PATH="/usr/local/lib"
使配置文件生效:
# source ~/.bashrc   
共享库知识参考: https://www.cnblogs.com/wainiwann/p/4210343.html

#用python确认sqlite版本
#python
>>> import sqlite3
>>> sqlite3.sqlite_version
'3.28.0'
>>> exit()
可以启动django了
python3 manage.py runserver

最后,启动django服务或batch

(1)virtualenv 下, 启动 #source activate

 

 

(2)出现 (venv)目录标记

在这个标记下,切换目录,到django工程目录,也就是manage.py所在的目录

启动web: python manage.py runserver 0.0.0.0:8000

启动batch: python manage.py xxxxx(batch file)

 

 

==========以下是网友的在内网机部署python心得体会=============

这里以内网机VMware虚拟机里centos7.3安装mitmproxy为例:

1.首先,你得有一个外网机,跟内网机要装的系统一样,最好干净一点

2.外网机安装好mitmproxy:

    查看pip3 list,记录下来

    pip3 install mitmproxy

3.生成依赖清单

    pip3 freeze >requirements.txt

    从requirements.txt中去除第2个步骤中使用pip3 list查看得到的安装包

4.下载依赖包(创建一个/home/packet目录,进入该目录下执行以下命令)

    pip3 download ./ -r ../requirements.txt

这样子安装mitmproxy所需要的依赖包都在/home/packet目录下了

5.安装

目前我没有找到解决依赖的好方法,我是暴力安装的,反复循环装每一个包,谁先装上就说明这个包要先安装。然后列个安装顺序,再到内网机上安装


========外文网站的建议,对于============

2020年3月上旬,构筑项目,在单位虚机环境创建python3.6.8+django2.2环境

参考手册

https://www.cnblogs.com/klsw/p/11106166.html

https://www.django.cn/article/show-4.html  2个手册结合做。

CentOS7 安装Python3.6.8,centos和redhat asiaux都是yum系,基本一样。

1. 安装依赖环境
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

注意:(1)没啥事别瞎找网上其他资料,他们和你的场景不同,瞎弄,后期会有错误,如no module named _sqlite3,是因为没安装sqlite-devel包,导致python3不能读取sqlite.o动态库。 (2)手欠,不考虑工期,想换个python3.7,结果python3.7下,pip安装很多包,都出现 “No module named ‘_ctypes’”, 据说是缺少libffi-devel包,但这个包,你的linux也装不上啊
在准备安装python3和pip3时,请先安装依赖环境:yum install -y libffi-devel 和上面一大堆包,一定要先装!不然会出现如下例一连串连锁反应的bug

2、下载Python3.6.8 新建个/usr/local/python3文件夹 mkdir /usr/local/python3  在python3文件夹下下载安装包 (进入/usr/local/python3 ) wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz 解压文件 tar -xvf Python-3.6.8.tar.xz 3、安装Python3 创建安装文件的路径 mkdir /usr/local/python3 4、编译(在解压的文件夹下 /usr/local/python3/python3.6.8) ./configure --prefix=/usr/local/python3 #指定生成的lib bin conf等存放文职 5、安装(在解压的文件夹下 /usr/local/python3/python3.6.8) make make install # 先make再make install 6、创建新版本的软链接 创建新的软连接   ln -s /usr/local/python3/bin/python3 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
注意:
原来系统自带的 /usr/bin/python 是python2.6, 这个不能动,因为yum 安装指令是基于python2的,/usr/bin/python动了,yun就不好用了。
检查python的版本 python -V

 

继续写填坑记录

 

我是按照 https://www.django.cn/article/show-4.html#banqian  , 来一步一步不熟nginx + uwsgi + django 的, 原文虽好,但未必适合你的环境,所有也会遇到很多坑。

下面就说说。

一、环境 python3.6.8, django 2.2

   sqlite.版本忘记了,好像是3.8.20,开始报错版本低,已经升级到了最新版本。

  启动django服务, python3 manage.py runserver 报错

  File "/system/Django/django/db/backends/sqlite3/base.py", line 198, in get_new_connection
    conn = Database.connect(**conn_params)
sqlite3.NotSupportedError: URIs not supported

 解决办法:

主要参考:https://blog.csdn.net/weixin_43883625/article/details/100708649

 找到你的虚拟环境。例如,去编辑 vim /www/env/mysite/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py

找到第198行, 在vim下, :set nu可以显示行号,帮助定位。把uri由True改为False

:set nu

 

也可以参考:  https://www.cnblogs.com/shaowentao/p/10193878.html

二、

nginx:安装报错

安装出错, ./configure   error: the http rewrite module requires the pcre library 

安装缺失的东西。

yum -y install pcre-devel

然后 ./configure

make

make install

nginx: (98: Address already in use)

提示 nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) ,一般原因是nginx端口被占用了。

解决方案参考:https://www.cnblogs.com/bruceshu/p/9705462.html

1、查看端口占用情况:

sudo netstat -apn | grep 80

 

 

查看占用端口的进程:

ps -ef | grep 3345

通过结果可知,80端口是Nginx本身占用了,可以杀掉进程,重新启动Nginx

sudo kill -9 3345

sudo netstat -apn | grep 80

成功杀掉进程后,启动Nginx

2、Nginx的启停:参考

https://www.cnblogs.com/codingcloud/p/5095066.html

讲解非常好

3、nginx 502 Bad Gateway 错误解决办法

遇到这个问题,本来以为是nginx自身有问题,还参考了csdn等,都是让扩充资源数量。

结果,是uwsgi配置不对,django服务起不来造成的。

uwsgi配置好,这个问题自然解决。

 

4、uwsgi: invalid option -- 'x'

一路走来,到处是坑,又头大了。 

uwsgi -x mysite.xml

执行上述指令时候,遇到错误,

解决方案,参考:https://blog.csdn.net/weixin_30652897/article/details/99783145

原因:centos(redhat内核相似,属于yum系)下,在没有安装libxml2时,pip安装的uwsgi无法支持xml格式的配置文件
解决:
yum install libxml*
pip uninstall uwsgi
pip install uwsgi

结果还是不行(事后我想,当时只重装了virtualenv环境,没安装系统环境, uwsgi都是每个环境安装,要2遍)

有时安装libxml2后由于pip缓存编译结果,导致再次安装uwsgi仍然报该异常。
可以下载uwsgi源码包后,本地手动编译后安装即可。

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

我用python3.6.8编译

tar zxvf uwsgi-latest.tar.gz

cd uwsgi-2.0.11.1/

python uwsgiconfig.py --build

python setup.py install

 

然后,去virtualenv环境

(venv) python setup.py install   #注意,目录要切换到uwsgi-2.0.11.1 目录,才能找到setup.py,安装到虚拟环境

执行 uwsgi -x general.xml成功

general.xml是我项目的uwsgi配置文件。

 系统运行,找不到静态文件

通过如下 1 和2 解决

1、nginx.conf配置

第一行很重要。 默认的化,是没有权限访问静态文件的。

user root;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        server_name  172.20.27.1;
        charset utf-8;
        location / {
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:8002;
           uwsgi_param UWSGI_SCRIPT general.wsgi;
           uwsgi_param UWSGI_CHDIR /home/emic/kaohe/;
           
        }
        location /static/ {
        alias /home/emic/kaohe/static/;
        }
    }
}

 

2、chmod  -R 777 static (静态文件目录)

 

Deploy Python virtualenv on no internet machine with different system

 

For anyone dealing with the same problem: The quickest way for me was to:
  1. Create a VirtualBox with the target system on the internet machine
  2. Download wheel files using pip download
  3. Migrate to the target machine
  4. Install with pip install --no-index --find-links pip_libs/ requests

 

程序更新升级后,不必启动nginx,重启uwsgi就可以

#查看Uwsgi进程
ps -ef|grep uwsgi 
#用kill方法把uwsgi进程杀死,然后启动uwsgi
killall -9 uwsgi
#启动方法
uwsgi -x mysite.xml

#Nginx平滑重启方法
/usr/local/nginx/sbin/nginx -s reload
posted @ 2019-12-02 10:45  花生与酒  阅读(294)  评论(0编辑  收藏  举报