編譯安裝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的工作原理流程與部署過程