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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM