之前寫過一篇使用 centos7+nginx 部署 django 項目的博文,此項目因為是前後端不分離的模式,一些靜態文件需要使用 nginx 代理才能訪問,沒有使用到 docker。
原文連接:https://blog.csdn.net/qq_39253370/article/details/106454587
如果是前後端分離的話,後端只需要提供接口就行,另外加一些權限控制,部署起來也相對簡單。
有兩個文件需要注意一下:
pip.conf:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
start.sh
uwsgi --ini /var/www/html/mysite1/uwsgi.ini
可任意放在一個目錄下面:
這裡放在: /home/{
xx}/data/project下面
如圖:
# 建立 python3.7 環境
FROM python:3.7
# 鏡像作者
MAINTAINER xx
# 設置 python 環境變量
ENV PYTHONUNBUFFERED 1
# 設置pip源為國內源
# 我這裡運行時報錯,暫時就沒管,可根據自己服務器路徑來配置
# COPY /home/yufuxiao/data/project/gongyequ/pip.conf /root/.pip/pip.conf
# 在容器內/var/www/html/下創建 mysite1文件夾
# 注意:這裡就是在容器裡面具體操作,run起來之後會新建下面的目錄
RUN mkdir -p /var/www/html/mysite1
# 設置容器內工作目錄
WORKDIR /var/www/html/mysite1
# 將當前目錄文件加入到容器工作目錄中(. 表示當前宿主機目錄)
# 就是將/home/{xx}/data/project下面所有的文件都會加入到容器裡面,這裡我們只放了我們的項目文件
ADD . /var/www/html/mysite1
# 利用 pip 安裝依賴
# 安裝依賴
# RUN python3.7 -m pip install -r /home/yufuxiao/data/project/gongyequ/requirements.txt
# Windows環境下編寫的start.sh每行命令結尾有多余的\r字符,需移除。
# 啟動項目
RUN sed -i 's/\r//' /var/www/html/mysite1/gongyequ/start.sh
# 設置start.sh文件可執行權限
RUN chmod +x /var/www/html/mysite1/gongyequ/start.sh
sudo docker build -t docker_django_img:v1 .
-t:打標簽
.:上下文目錄,當前項目和dockerfile在一個目錄下可以使用點,如果不在一個目錄下,就要指定目錄
sudo docker images
查看構建好的鏡像,如下圖:
刪除鏡像:sudo docker rmi 鏡像id -f參數:強制刪除
運行:
sudo docker run --name 自己起個名稱 -p 宿主機端口:容器端口 鏡像名稱。
示例:sudo docker run --name gongyequ -p 10418:8000 django_docker_img:v1
查看是否啟動成功:sudo docker ps
查看所有容器運行狀態:sudo docker ps -a
重啟容器:sudo docker restart 容器名稱或id
刪除容器:sudo docker rm 容器名稱或id -f 參數:強制刪除
sudo docker exec -it 容器id或名稱 /bin/bash
另外一種進入容器的方法:docker attach [OPTIONS] CONTAINER
安裝所有的依賴包:pip install -r requirements.txt
安裝 uwsgi :pip install uwsgi
啟動項目:python manager.py runserver 0.0.0.0:8000
如果啟動成功,說明到這裡算是完成一大半了。
在上述我們使用了Django了自帶的runserver命令啟動了測試服務器,但是只能用戶本地調式開發用,但實際生成環境中你應該需要使用支持高並發的uwsgi服務器來啟動Django服務。
[uwsgi]
# 項目名稱
project=mysite
# 項目路徑
base=/var/www/html
# 指定項目的目錄,在app加載前切換到當前目錄,這個一定要注意,是app目錄
# gongyequ:app名稱
chdir=/var/www/html/mysite1/gongyequ
# 指定項目的application,加載指定的python WSGI模塊(模塊路徑必須在PYTHONPATH裡)
# 這裡就是 django 項目裡面的 wsgi.py 文件
# nsproject:django項目名
module=nsproject.wsgi:application
# 啟動一個master進程來管理其他進程
master=True
# 進程數,如果把主進程 master 那麼子進程也會kill掉
processes=2
# 用nginx的時候就配socket , 直接運行的時候配 http
# 指定IP端口 // 直接外部訪問
http=0.0.0.0:8000
# 設置用於uwsgi包解析的內部緩存區大小。默認是4k 最大64
buffer-size=65536
# 超時時間
harakiri=60
# 設置後台運行
daemonize=uwsgi.log
執行此文件:uwsgi uwsgi.ini
外部可訪問說明部署成功。
此問題一般是 uwsgi.ini 中配置沒有寫對,請重新檢查,最容易出錯的地方是路徑配置:
# 指定項目的目錄,在app加載前切換到當前目錄,這個一定要注意,是app目錄
# gongyequ:app名稱
chdir=/var/www/html/mysite1/gongyequ
# 指定項目的application,加載指定的python WSGI模塊(模塊路徑必須在PYTHONPATH裡)
# 這裡就是 django 項目裡面的 wsgi.py 文件
# nsproject:django項目名
module=nsproject.wsgi:application
在容器中難免編輯文件,需要安裝vim,Ubuntu 下安裝vim:
apt-get update && apt-get install apt-file -y && apt-file update && apt-get install vim
查看端口是否開啟:
apt-get update && apt-get install net-tools
容器內部如有訪問 redis 請把 bind 改為 0.0.0.0 或直接注釋 bind
https://www.jianshu.com/p/07458e99198a
https://www.runoob.com/docker/docker-command-manual.html
Django 是一個 Web 框架,框架的作用在於處理 request 和 reponse,其他的不是框架所關心的內容。所以怎麼部署 Django 不是 Django 所需要關心的。
Django 所提供的是一個開發服務器,這個開發服務器,沒有經過安全測試,而且使用的是 Python 自帶的 simple HTTPServer 創建的,在安全性和效率上都是不行的
而uWSGI 是一個全功能的 HTTP 服務器,他要做的就是把 HTTP 協議轉化成語言支持的網絡協議。比如把 HTTP 協議轉化成 WSGI 協議,讓 Python 可以直接使用。
uwsgi 是一種 uWSGI 的內部協議,使用二進制方式和其他應用程序進行通信。
參考:https://blog.csdn.net/mnszmlcd/article/details/78819237
uwsgi 總體概括:
首先客戶端請求過來------發送給uwsgi做處理(封裝、處理數據)------中間件----路由----試圖函數-----數據庫操作或者模板渲染
相關文章推薦:https://blog.csdn.net/qq_39253370/article/details/104620553