python項目部署


項目開發完畢后,需要將代碼放到服務器上,這樣用戶才能訪問。接下來我們一步一步來進行一波部署操作

打包上傳代碼

項目開發完畢,在部署之前需要再配置文件中將 ALLOWED_HOSTS配置設置為:當前服務器IP或*,如:

ALLOWED_HOSTS = ["*",]

這個配置就是允許別人通過哪個ip訪問你,*表示所有ip

上線時還要將配置中的DEBUG改為False

不同系統如何傳代碼

windows: 
    yum install lrzsz
    壓縮zip包,拖進來。
mac:
    scp /home/xx/s8day145.zip  root@192.11.11.11:/data/

在真正的線上環境應該從git上拖代碼

安裝Python3

a. 下載Python:https://www.python.org/ftp/python/3.5.4/
b. 解壓 tar -xvf Python-3.5.4.tgz
c. cd Python-3.5.4
d. 先裝依賴:
    - yum install openssl-devel
    - yum install sqlite-devel
e. 編譯安裝
    - ./configure
    - make 
    - make install 
    
    /usr/local/bin python3 
f. 安裝django 
 pip3 install django==1.11.7

第一版本上線:簡單粗暴

進入python程序目錄

python3 manage.py runserver 0.0.0.0:8000

uwsgi

Django框架運行依賴wsgi(本質提供socket服務端),眾多模塊實現了wsgi規范,而django框架中默認使用wsigiref模塊來實現,他由於性能比較低,所以用於本地開發和測試,而線上部署時需要使用uwsgi來代替

在服務器上安裝uwsgi

pip3 install uwsgi

單文件使用uwsgi

在服務器上編寫一個Python文件app.py:

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

在服務器上執行命令啟動Web服務器:

uwsgi --http :9001 --wsgi-file app.py
#
uwsgi --http :9002 --wsgi-file app.py --master --processes 4  # 啟動4個進程

PS: flask需要再加 --callable app

uwsgi --http :9002 --wsgi-file app.py  --callable app

django程序

方式一

uwsgi --http :9003 --chdir /data/s8day145/ --wsgi-file s8day145/wsgi.py  # chdir進入后面的項目目錄 然后wsgi-file找到項目中的wsgi.py文件

方式二

可以看到上面的方法參數很多,我們可以將參數寫到一個文件中

s8day145_uwsgi.ini
    [uwsgi]
    http = 0.0.0.0:9005
    chdir = /data/s8day145/
    wsgi-file = s8day145/wsgi.py
    processes = 4  # 進程數
    static-map = /static=/data/s8day145/allstatic  # 靜態文件的目錄

啟動時

uwsgi --ini s8day145_uwsgi.ini

此時訪問時,會出現找不到靜態文件的錯誤。

想要uwsgi處理靜態文件,需要先將django的靜態文件收集到制定目錄,然后再設置對應關系。

收集django靜態文件

  • 在django的配置文件中添加:STATIC_ROOT = os.path.join(BASE_DIR,"allstatic")
  • 執行 python3 manage.py collectstatic 命令,至此django項目所有相關靜態文件都會收集到制定目錄。

設置uwsgi靜態文件對應關系

  • uwsgi --http :9005 --chdir /data/oldboy/ --wsgi-file oldboy/wsgi.py --master --processes 4 --static-map /static=/data/oldboy/allstatic

第三版本上線:uwsgi + nginx 

nginx作用:
- 處理靜態文件
- 反向代理
- 負載均衡(LVS、haproxy)
uwsig作用:
- 處理動態請求

nginx配置文件

user root;
worker_processes 4;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    upstream django {
        server 127.0.0.1:8001; 
        server 127.0.0.1:8002; 
    }
    server {
        listen      80;

        charset     utf-8;

        # max upload size
        client_max_body_size 75M;

        location /static {
            alias  /data/s8day145/allstatic; 
        }

        location / {
            uwsgi_pass  django;
            include     uwsgi_params;
        }
    }
}

uwsgi配置:/data/s8day145/

s8day145_uwsgi_8001.ini 
    [uwsgi]
    socket = 127.0.0.1:8001
    chdir = /data/s8day145/
    wsgi-file = s8day145/wsgi.py
    processes = 1
    
    
s8day145_uwsgi_8002.ini 
    [uwsgi]
    socket = 127.0.0.1:8002
    chdir = /data/s8day145/
    wsgi-file = s8day145/wsgi.py
    processes = 1

啟動

nginx:
    /etc/init.d/nginx start 
    /bin/systemctl restart nginx.service
    /bin/systemctl start nginx.service
    /bin/systemctl stop nginx.service

uwsgi:
    uwsgi --ini s8day145_uwsgi_8001.ini &
    uwsgi --ini s8day145_uwsgi_8002.ini & 

如果進程掛了,supervisor幫助你自動將服務重新啟動

supervisor是一個對進程管理的軟件,可以幫助我們啟動uwsgi並維護(uwsgi進程關閉時,自動將其啟動起來)

安裝

yum install supervisor

配置/etc/supervisord.conf

[program:s8day145]
command=/usr/local/bin/uwsgi --ini /data/s8day145/s8day145_uwsgi_8001.ini ;命令
priority=999                ; 優先級(越小越優先)
autostart=true              ; supervisord啟動時,該程序也啟動
autorestart=true            ; 異常退出時,自動啟動
startsecs=10                ; 啟動后持續10s后未發生異常,才表示啟動成功
startretries=3              ; 異常后,自動重啟次數
exitcodes=0,2               ; exit異常拋出的是0、2時才認為是異常
stopsignal=QUIT             ; 殺進程的信號
stopwaitsecs=10             ; 向進程發出stopsignal后等待OS向supervisord返回SIGCHILD 的時間。若超時則supervisord將
使用SIGKILL殺進程
user=root                 ; 設置啟動該程序的用戶
log_stdout=true             ; 如果為True,則記錄程序日志
log_stderr=false            ; 如果為True,則記錄程序錯誤日志
logfile=/var/log/cat.log    ; 程序日志路徑
logfile_maxbytes=1MB        ; 日志文件最大大小
logfile_backups=10          ; 日志文件最大數量

啟動

systemctl start supervisord.service

公司正式上線流程

公司中的部署步驟及負責人:
- 開發提交代碼
- 測試人員開始測試
- 運維人員進行上線
    使用軟件:jenkins+自己寫腳本,運維人員點點點。
        - 從git上啦代碼到一個服務器,在該服務器上對代碼進行編譯(c/vue/java)
        - 通過以下工具 將代碼同步到每台服務器上
            - saltstack
            - ansible
        - 執行命令啟動程序

 

 

 

 


免責聲明!

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



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