Django打造大型企業官網-項目部署
一、准備工作
1、在開發機上的准備工作
1)確認項目沒有bug。
2)打開終端,進入虛擬環境,再 cd 到項目根目錄下,執行命令:pip freeze > requirements.txt,將當前環境的包導出到`requirements.txt`文件中,方便在部署的時候安裝。
3)將項目上傳到服務器上的`/srv`目錄下。這里以`git`的形式為例。
我們使用第三方代碼托管平台 -碼雲 Gitee
選擇碼雲作為代碼托管平台的原因是因為在碼雲上傳項目代碼,即使是私有項目也不會被收費。
碼雲官網:https://gitee.com/
將項目上傳到服務器上:
3.1)在服務器中新建倉庫/項目:
3.2)將本地項目代碼提交到服務器中:
git 相關操作:
# 本地項目代碼 → 本地 git 倉庫 → 服務器倉庫 git init # 初始化本地倉庫 git remote add origin xxx.git # 關聯遠程倉庫,xxx.git:分為兩種:SSH跟HTTPS,建議使用第一種方式 git add . # 將本地項目的所有文件都預集合在一起,類似於打包 git commit -m "first commit !" # 將本地代碼添加到倉庫,與 "git add ." 結合執行 git pull origin master --allow-unrelated-histories # 從遠程(服務器)的 master 中拉取代碼下來,如果不是第一次拉代碼,可以不用加后面的參數 git push origin master # 確定沒問題后,將本地倉庫代碼上傳到服務器項目倉庫中 git status # 查看狀態
如果在拉取遠程代碼或提交代碼到遠程時報錯:
在 git Bash 中執行下述命令:
1.輸入命令:git fsck -.-lost-found,可以看到好多“dangling commit”
2.清空他們:git gc # 可以直接執行這行代碼
2、在服務器上的准備工作
本文介紹的服務器為 Ubuntu
2.1、 Ubuntu 開啟 root 用戶
# 如果是新裝的機子,開啟root用戶采用下述指令 > sudo passwd root > 然后輸入root 用戶密碼 # 如果已有 root 用戶 ,直接進入 > su - 或 su root 都能進入root 用戶
2.2、為了方便Xshell 連接服務器,建議安裝 OpenSSH(一般雲服務器上都已經安裝好的)
xshell 連接服務器方式介紹:https://www.cnblogs.com/Eric15/articles/9459329.html
> sudo apt install openssh-server openssh-client # 安裝 openssh > service ssh restart # 重啟 openssh
2.2.1、安裝 vim:
sudo apt install vim
2.3、安裝`MySQL`服務器和客戶端:
sudo apt install mysql-server mysql-client
sudo apt-get install libmysqld-dev
MySQL 安裝及相關操作參考鏈接:https://www.cnblogs.com/Eric15/articles/9198777.html
MySQL簡單操作指令:
#linux/ubuntu mysql的啟動關閉 # 一、 啟動方式 1、使用 service 啟動:service mysql start 2、使用 mysqld 腳本啟動:/etc/inint.d/mysql start 3、使用 safe_mysqld 啟動:safe_mysql& # 二、停止 1、使用 service 啟動:service mysql stop 2、使用 mysqld 腳本啟動:/etc/inint.d/mysql stop 3、mysqladmin shutdown # 三、重啟 1、使用 service 啟動:service mysql restart 2、使用 mysqld 腳本啟動:/etc/inint.d/mysql restart # 客戶端連接MySQL 服務端 # 1.遠程連接: mysql -h host -u user -p # 2.本地客戶端連接: mysql -uroot -p # 回車后輸入密碼即可
2.4、安裝 memcached
> sudo apt install memcached
操作 memcached :
telnet 127.0.0.1 11211
2.5、安裝 python
# Linux/Ubuntu 默認裝有 python2 python3 # 安裝python2 、pip: > sudo apt install python > sudo apt install python-pip # 安裝python3 、pip3: > sudo apt install python3 > sudo apt install python3-pip # 設定python默認執行版本為python3: sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
# 如果提示 pip 版本過低,執行下述命令更新pip:
pip install --upgrade pip
pip 與 pip3 區別:
pip和pip3的區別:
pip是python的包管理工具,pip和pip3版本不同,都位於Scripts\目錄下:
如果系統中只安裝了Python2,那么就只能使用pip。
如果系統中只安裝了Python3,那么既可以使用pip也可以使用pip3,二者是等價的。
如果系統中同時安裝了Python2和Python3,則pip默認給Python2用,pip3指定給Python3用
2.6、安裝虛擬環境 :virtualenv 、virutalenvwrapper
虛擬環境參考博文:https://www.cnblogs.com/Eric15/articles/9517232.html
# 安裝 virtualenv > pip install virtualenv # python2版本的virtualenv > pip3 install virtualenv # python3版本 # 使用指定 python 版本創建 virtualenv 虛擬環境 > virtualenv -p C:\Python36\python.exe virtualenv-name # 安裝 virtualenvwrapper > pip install virtualenvwrapper # python2版本 > pip3 install virtualenvwrapper # python3版本 # 使用指定 python 版本創建 virtualenvwrapper虛擬環境 ,如python2 、python3均存在,創建虛擬環境時默認使用的解釋器是python2版本,如果要使用python3版本,則需指定python版本 > mkvirtualenv --python==C:\Python36\python.exe virtualenv-name # Windows
> mkvirtualenv --python=/usr/bin/python3 py3scrapy # linux/Ubuntu
# 注意點: # 1. 直接安裝 virtualenvwrapper 時,會一同安裝 virtualenv # 2.當只安裝python2版本 或 python3版本的 virtualenvwrapper時,創建 virtualenvwrapper虛擬環境 使用的就是對應的python版本
配置文件配置:
# 使用 vim 進入 /.bashrc 文件中做以下改動: export WORKON_HOME=$HOME/.envs #虛擬環境都保存到 .envs文件夾中 VIRTUALENVWRAPPER_PYTHON='/usr/bin/python3' #指定創建 virtualenvwrapper 虛擬環境時默認采用 python3版本的解釋器 ,針對使用 pip3 安裝的virtualenvwrapper ,如是pip(python2)安裝的virtualenvwrapper,默認是python2解釋器,不需要添加此行代碼 source /usr/local/bin/virtualenvwrapper.sh #啟動文件路徑 使用pip/pip3 安裝 virtrualenvwrapper虛擬環境時,會生成virtualenvwrapper.sh並放置到python的bin目錄下,找到該路徑下的bin/virtualenvwrapper.sh文件並指定為默認的啟動文件 # 然后重啟 /.bashrc 文件: > source ~/.bashrc
如果安裝過慢,可以采用豆瓣源安裝的方式:
sudo pip install -i http://pypi.douban.com/simple/ virtualenvwrapper
2.7、安裝 git :
sudo apt install git
拉取遠程代碼到本地:
# Linux/Ubuntu # 目錄:/home/nan/pro_python/xfz > git init # git 初始化xfz文件夾為git倉庫 > git remote add origin https://gitee.com/chenjiongnan/xfz.git # 與遠程倉庫關聯 > git pull origin master # 將遠程倉庫的代碼拉取到本地,回車后需要輸入賬號密碼 # 驗證通過后,等待系統將項目代碼拉取到本地就可以了
如果以后開發機上有修改/更改項目代碼,直接將代碼 push 到遠程倉庫,再在服務器上 pull 遠程代碼下來即可:
git push origin master
git pull origin master
3、數據遷移等准備
3.1、安裝 requirements.txt 中的所有包
進入虛擬環境中,然后進入到項目所在目錄,執行命令:`pip install -r requirements.txt`,安裝好相應的包
pip install -r requirements.txt
3.2、在 MySQL 數據庫創建相應的數據庫
> mysql -uroot -p # 進入數據庫 > 輸入密碼 # 進入數據庫后 ,創建我們需要的數據庫: create database xfz charset utf8; # 退出 數據庫 > exit;
關於數據庫數據遷移,可參考博文:https://www.cnblogs.com/Eric15/articles/9704522.html
3.3、django 表數據 文件遷移
進入項目主目錄下(有 manage.py文件的目錄下),執行`python manage.py migrate`命令,將遷移文件,映射到數據庫中,創建相應的表
python manage.py migrate
注意:由於項目部署前,在開發機上工作時我們已經生成了遷移腳本,因此不需要先運行 'python manage.py makemigrations' ,直接運行 'python manage.py migrate' 即可
3.4、設置`ALLOW_HOST`為你的域名(服務器域名),以及ip地址 ,同時設置`DEBUG=False`,避免如果你的網站產生錯誤,而將錯誤信息暴漏給用戶
DEBUG = False ALLOWED_HOSTS = ["192.168.*.*",] # ALLOWED_HOSTS 填的是服務器的域名或ip
3.5、試啟動項目
# 執行啟動項目命令: python manage.py runserver 0.0.0.0:8000 # 在網頁中輸入 http://服務器的ip地址:8000/ ,訪問該網站 > http://192.168.1.145:8000
3.6、靜態文件收集
收集靜態文件是為了將靜態文件提供給 Nginx ,這樣用戶如果只是請求靜態文件,就可以從Nginx中獲取,而不需要進入服務端獲取了
在settings.py 中設置 STATIC_ROOT:
# settings.py STATIC_ROOT = os.path.join(BASE_DIR, "static_dist") # static_dist:新建的文件夾,用於收集靜態文件 # 然后將代碼推到遠程倉庫,再在服務器中將遠程代碼拉取下來 # 在服務端執行以下命名,收集所有靜態文件,也可以在處理Nginx 時再收集靜態文件: python manage.py collectstatic
四、Nginx + uwsgi + Django 項目部署
Nginx + uwsgi + Django 生產部署環境參考博文:https://www.cnblogs.com/Eric15/articles/9484762.html
1、Nginx
1.1 Nginx 安裝
nginx是一個web服務器,用來加載靜態文件和接收http請求的。通過命令`sudo apt install nginx`即可安裝。
sudo apt install nginx
1.2 Nginx 常用命令
service nginx start # 啟動nginx service nginx stop # 關閉nginx service nginx restart # 重啟nginx
在網頁訪問服務器ip + 80端口 (http://192.168.1.101:80) , 如果能成功訪問則表示Nginx 安裝成功且已啟動
1.3 編寫 Nginx 配置文件
在`/etc/nginx/conf.d`目錄下,新建一個文件,叫做`xfz.conf`,文件名可以任意取,建議以項目名命名,然后將以下代碼粘貼進去保存:
upstream xfz { # 項目名 server unix:///home/nan/pro_python/xfz/xfz.sock; # Nginx配置的server路徑要與uwsgi 的server路徑保持一致(位置:項目xfz目錄下的xfz.sock),xfz.sock不需要手動創建,但Nginx與uwsgi 通信時會自動創建 } # 配置服務器 server { # 監聽的端口號 listen 80; # 域名 server_name 192.168.0.101; # 服務器ip 、域名等 charset utf-8; # 最大的文件上傳尺寸 client_max_body_size 75M; # 靜態文件訪問的url location /static { # 靜態文件地址 alias /home/nan/pro_python/xfz/static_dist; # STATIC_ROOT 靜態文件的路徑 } # 最后,發送所有非靜態文件請求到django服務器 location / { uwsgi_pass xfz; # 與上面upstream對應 # uwsgi_params文件地址 include /etc/nginx/uwsgi_params; } }
寫完配置文件后,為了測試配置文件是否設置成功,運行命令:`service nginx configtest`,如果不報錯,說明成功
service nginx configtest
每次修改完了配置文件,都要記得運行`service nginx restart`。
service nginx restart
2、uwsgi
2.1 概述
uwsgi是一個應用服務器,非靜態文件的網絡請求就必須通過他完成,他也可以充當靜態文件服務器,但不是他的強項。uwsgi是使用python編寫的,因此通過`pip install uwsgi`就可以了。(uwsgi建議安裝在系統級別的Python環境中,不要安裝到虛擬環境中) ,如果安裝在虛擬環境中,則每次啟動uwsgi ,必須先要進入虛擬環境,再進入項目目錄下,才能啟動。
2.2 安裝
# 安裝 pip install uwsgi pip3 install uwsgi
2.3 啟動 django 項目
# 啟動 uwsgi > uwsgi --http :8000 --module xfz.wsgi --vritualenv=/home/.envs/xfz # 服務器網址為 :http://[服務器ip]:8000 # xfz.wsgi :前綴為項目名稱 # virtualenv : 后面為項目所在的虛擬環境文件夾地址
輸入網址: http://服務器地址/news:8000 :訪問本項目新聞首頁,如果能訪問成功,說明uwsgi啟動成功
2.4 編寫 uwsgi 配置文件
在項目的根目錄下面,創建一個文件叫做`xfz_uwsgi.ini`的文件,然后填寫以下代碼:
[uwsgi] # Django相關的配置 # 必須全部為絕對路徑 # 項目的路徑 chdir = /home/nan/pro_python/xfz # Django的wsgi文件 module = xfz.wsgi # 項目xfz 下的wsgi.py文件 # Python虛擬環境的路徑 home = /home/nan/.envs/xfz # 進程相關的設置 # 主進程 master = true # 最大數量的工作進程 processes = 10 # socket文件路徑,絕對路徑 socket = /home/nan/pro_python/xfz/xfz.sock # 與 Nginx server 對應 # 設置socket的權限 chmod-socket = 666 # 退出的時候是否清理環境 vacuum = true
寫完 uwsgi 的配置文件,以后通過uwsgi 啟動 Django項目時,就可以通過啟動uwsgi 配置文件的方式啟動:
# 進入項目根目錄下:/home/nan/pro_python/xfz(根目錄下有xfz_uwsgi.ini 文件),然后執行下行命令: uwsgi --ini xfz_uwsgi.ini
3、supervisor
3.1 概述
supervisor 可以用來管理 uwsgi ,在uwsgi發生意外的情況下,可以自動讓其重啟。除了重啟,也可以執行其他操作,如關閉、啟動、重新啟動 uwsgi 等。
3.2 安裝
在系統級別的python環境下進行安裝:
pip install supervisor
pip3 install supervisor
3.3 編寫 supervisor 配置文件
在項目的根目錄下創建一個文件叫做`xfz_supervisor.conf` ,將下述代碼粘貼到里面:
# supervisor的程序名字 ,可任取 [program:xfz] # supervisor執行的命令:啟動uwsgi command=uwsgi --ini zlkt_uwsgi.ini # 項目的目錄 directory = /home/nan/pro_python/xfz # 開始的時候等待多少秒 startsecs=0 # 停止的時候等待多少秒 stopwaitsecs=0 # 自動開始 autostart=true # 程序掛了后自動重啟 autorestart=true # 輸出的log文件 , 需要提前先到項目根目錄下新建log 文件夾 ,否則運行時會報錯 stdout_logfile=/home/nan/pro_python/xfz/log/supervisord.log # 輸出的錯誤文件 stderr_logfile=/home/nan/pro_python/xfz/log/supervisord.err [supervisord] # log的級別 loglevel=info [inet_http_server] # supervisor的服務器 port = :9001 # 用戶名和密碼 username = admin password = 123 # 使用supervisorctl的配置 [supervisorctl] # 使用supervisorctl登錄的地址和端口號 serverurl = http://127.0.0.1:9001 # 登錄supervisorctl的用戶名和密碼 username = admin password = 123 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
然后使用命令`supervisord -c xfz_supervisor.conf`運行就可以了:
# 在項目根目錄下運行 supervisord -c xfz_supervisor.conf
使用supervisord 成功運行后,以后如果想要啟動或關閉`uwsgi`,就可以通過命令`supervisorctl -c xfz_supervisor.conf`進入到管理控制台,然后可以執行相關的命令進行管理:
# 客戶端操作 supervisor ,相當於mysql客戶端操作服務端一樣 supervisorctl -c xfz_supervisor.conf # 從客戶端啟動supervisor ,前提需開啟supervisord ,且進入項目根目錄下執行 # 可執行的相關命令: * status # 查看狀態 * start program_name #啟動程序 ,即啟動uwsgi ,因supervisor 中command配置的就是啟動uwsgi 的命令,所以啟動supervisor的同時就是啟動uwsgi * restart program_name #重新啟動程序 * stop program_name # 關閉程序 * reload # 重新加載配置文件,即xfz_supervisor.conf * quit # 退出控制台,即退出 supervisorctl
注:program_name:為 supervisor 的程序名:
進入到 supervisorctl 時,輸入 'help' ,可查看 supervisor 相關的一些操作:
3.4 關系圖
使用 supervisor 管理 uwsgi ,而不管理 Nginx 的原因是:Nginx 自身是守護進程,當程序掛了會自動重啟 ,而 uwsgi 自身不是守護進程 ,程序掛了就掛了。使用 supervisor 來管理 uwsgi ,相當於給uwsgi 起了個守護進去,當 uwsgi 程序掛了會自動給重啟。
* Nginx 與 uwsgi 都安裝及配置好配置文件后,啟動項目:
# 1. 沒有 [supervisor] ,啟動步驟 ↓: # 1)啟動 Nginx service nginx start/restart # 2)啟動 uwsgi ,項目根目錄下啟動 uwsgi --ini xfz_uwsgi.ini # ============================================= # 2. [supervisor]管理 uwsgi ,啟動步驟 ↓: # 1)啟動 Nginx service nginx start/restart # 2)由 supervisor 啟動 uwsgi ,項目根目錄下啟動 supervisord -c xfz_supervisor.conf
溫馨提醒:
1、在 copy 或編寫 Nginx 、uwsgi 、supervisor 配置文件時 ,記得把注釋都刪掉
2、放在服務器上的開發項目,建議放置在/srv 目錄下(在根目錄'/' 下新建 srv 目錄)