本文用一臺安裝了centos7.5系統的裸奔Linux機器(固然是虛擬機)詳細講解從無到有部署django項目的過程。html
至於什麼是yum源你們請自行百度,本人用的是阿里雲的yum源,所以須要在裸機上配置一下:python
cd /etc/yum.repos.d/
ls -l
1.好習慣,備份yum源mysql
mkdir repo_bak
mv *.repo repo_bak/
wget http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all
yum makecache
yum install -y epel-release
推薦利用編譯的方式安裝Python3。linux
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 -y
須要注意的是,Linux系統的第三方軟件都約定俗成的安裝在/opt目錄下~所以咱們須要把這個包下載到/opt目錄下nginx
cd /opt
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
解壓sql
tar -zxvf Python-3.6.5.tgz
configure數據庫
進入解壓出出來的Python-3.6.5目錄,裏面有一個綠色的可執行文件configure~django
這一步通常用來生成 Makefile,爲下一步的編譯作準備,你能夠經過在 configure 後加上參數來對安裝進行控制,好比代碼:vim
./configure --prefix=/opt/py365
上面的意思是將該軟件安裝在 /opt/py365 下面,執行文件就會安裝在 /opt/py365/bin (而不是默認的 /usr/local/bin),資源文件就會安裝在 /usr/share(而不是默認的/usr/local/share)。windows
同時一些軟件的配置文件你能夠經過指定 --sys-config= 參數進行設定。有一些軟件還能夠加上 --with、--enable、--without、--disable 等等參數對編譯加以控制,你能夠經過容許 ./configure --help 察看詳細的說明幫助。
——我這裏沒有加後面的參數,直接執行 ./configure,默認安裝在了/usr/local/bin中~
make
這一步就是編譯,大多數的源代碼包都通過這一步進行編譯(固然有些perl或python編寫的軟件須要調用perl或python來進行編譯)。
若是 在 make 過程當中出現 error ,你就要記下錯誤代碼(注意不只僅是最後一行),而後你能夠向開發者提交 bugreport(通常在 INSTALL 裏有提交地址),或者你的系統少了一些依賴庫等,這些須要本身仔細研究錯誤代碼。
make 的做用是開始進行源代碼編譯,以及一些功能的提供,這些功能由他的 Makefile 設置文件提供相關的功能,好比 make install 通常表示進行安裝,make uninstall 是卸載,不加參數就是默認的進行源代碼編譯。
make 是 Linux 開發套件裏面自動化編譯的一個控制程序,他經過藉助 Makefile 裏面編寫的編譯規範進行自動化的調用 gcc 、ld 以及運行某些須要的程序進行編譯的程序。通常狀況下,他所使用的 Makefile 控制代碼,由 configure 這個設置腳本根據給定的參數和系統環境生成。
make install
這條命令來進行安裝(固然有些軟件須要先運行 make check 或 make test來進行一些測試),這一步通常須要你有 root 權限(由於要向系統寫入文件)
我本身以前總結過兩篇相關的博客(原創哦~23333):
linux下虛擬環境模塊virtualenv及管理工具virtualenvwrapper的使用
windows與mac下virtualenv與Pycharm的結合使用
nginx的安裝也推薦編譯安裝!
因爲本文用的是一個裸機,若是你們以前用yum安裝了nginx,請卸載yum安裝的nginx!!!
yum remove nginx -y
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
我這裏用的是淘寶的Tengine——在原始nginx上擴展了許多功能~很強大~
須要注意的是,Linux系統的第三方軟件都約定俗成的安裝在/opt目錄下~所以咱們須要把這個包下載到/opt目錄下
cd /opt
wget http://tengine.taobao.org/download/tengine-2.3.1.tar.gz
解壓tengine包:
tar -zxvf tengine-2.3.1.tar.gz
進入源碼目錄:
cd tengine-2.3.1/
裏面有一個綠色的可執行文件configure
這裏咱們指定將tengine安裝在/opt/tngx231這個目錄下:
./configure --prefix=/opt/tngx231/
而後進行編譯安裝:
make && make install
結束後~咱們能夠看到新生成了一個/opt/tngx321目錄~
安裝好的nginx放在了 /opt/tngx231/sbin/ 這個目錄下了~
安裝完成後須要每次用/opt/tngx231/sbin/ 這個目錄加上nginx才能操做,很煩躁,咱們能夠經過修改環境變量,之後只須要執行nginx就能夠啓用nginx的操做了~
echo $PATH #/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
vim /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/tngx231/sbin"
source /etc/profile
在沒有修改環境變量以前,咱們須要進入nginx的安裝目錄(本文是在 /opt/tngx231/sbin/ )這樣執行:
./nginx #啓動 ./nginx -s stop #關閉 ./nginx -s reload #從新加載
修改了環境變量後能夠直接這樣執行:
nginx #啓動 nginx -t #查看nginx狀態 nginx -s stop #關閉 nginx -s reload #從新加載
測試nginx的服務
安裝完成後別忘了檢測一下nginx的服務
netstat -tunlp |grep 80
curl -I 127.0.0.1
結果以下:
#關防火牆 systemctl disable firewalled setenforce 0
利用virtualenvwrapper工具建立虛擬環境
mkvirtualenv whw_dj1
建立完虛擬環境後直接會進入這個虛擬環境。
在這個環境中安裝項目須要的包,安裝過程略(直接用pip安裝便可),結果以下:
這裏須要記錄一下uwsgi的執行路徑以及虛擬環境的目錄,後面要用:
uwsgi的執行路徑
特別注意:若是在虛擬環境中運行的話,後面執行uwsgi命令須要用絕對路徑的時候必定是虛擬環境中的這個絕對路徑!
(補充說明一點:若是虛擬環境中沒有安裝uwsgi模塊的話會顯示外部環境中的位置,所以必定要記得在虛擬環境中安裝uwsgi模塊!)
(whw_di1) [root@bogon opt]# which uwsgi /root/Envs/whw_di1/bin/uwsgi
虛擬環境的目錄
特別注意:若是在虛擬環境中運行的話,後面uwsgi的配置文件必定要寫當前虛擬環境下的uwsgi的絕對路徑!
(whw_di1) [root@bogon opt]# cdvirtualenv
(whw_di1) [root@bogon whw_di1]# pwd
/root/Envs/whw_di1
將項目傳到服務器的/opt目錄~進入項目的二級目錄,配置一下里面的settings文件,這裏只寫與部署相關的配置
# 線上部署必定要記得把DEBUG改爲False
DEBUG = False
# 94這個ip是個人云服務器的Ip,通常狀況下是這樣配置 # ALLOWED_HOSTS = ['localhost','94.191.41.167','0.0.0.0:8000','127.0.0.1' ] # 本身測試的話直接allow全部的ip就行了 ALLOWED_HOSTS = ['*' ] # sqllit數據庫的配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # 靜態文件配置 # 第一個參數是將靜態文件copy到服務器的目錄的位置 STATIC_ROOT='/opt/whw_static/' STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR,'staticfiles'), ] ## mysql的配置——本文用的是sqllit,所以這個配置註釋掉 #DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.mysql',#引擎,選mysql # 'NAME':'whw1',#要鏈接的數據庫,鏈接前須要建立好 # 'USER':'root',#鏈接數據庫的用戶名 # 'PASSWORD':'123',#鏈接數據庫的密碼 # 'HOST':'127.0.0.1',#鏈接主機,默認本本機 # 'PORT':3306,#端口 默認3306 # #Django中設置數據庫的嚴格模式 # 'OPTIONS':{ # 'init_command':"set sql_mode='STRICT_TRANS_TABLES' ", # } # } # }
因爲uwsgi不能處理項目的靜態文件,咱們須要用nginx來處理,所以須要將項目的靜態文件copy到STATIC_ROOT參數對應的位置:
python3 /opt/whw/manage.py collectstatic
whw是個人項目的第一層目錄,就是個人項目的名字。
提醒一點:須要提早在虛擬環境中安裝好uwsgi包~~
配置uwsgi以前須要新建一個uwsgi.ini文件。
因爲每一個項目對應一個uwsgi.ini文件,這裏建議你們將這個文件建立在本身項目的第一層目錄中:
cd /opt/whw/
touch uwsgi.ini
而後編輯這個文件
vim uwsgi.ini
文件中的配置以下:
[uwsgi] # Django-related settings # the base directory (full path) #項目的絕對路徑,定位到項目的第一層 chdir = /opt/whw # Django's wsgi file # 找到項目第二層的wsgi文件 module = whw.wsgi # the virtualenv (full path) # 找到虛擬環境的絕對路徑~注意最後不要加/ home = /root/Envs/whw_di1 # process-related settings # master # 主進程 master = true # maximum number of worker processes # 開啓uwsgi的多進程數,根據cpu核數來定義 processes = 16 # the socket (use the full path to be safe # 基於socket連接運行項目,只有與nginx結合的時候,才使用socket形式 socket = 0.0.0.0:8000 # 當你沒用nginx,調試項目的時候,使用http形式 #http = 0.0.0.0:8000 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true
# 記錄pid與日誌的文件 pidfile=uwsgi.pid daemonize=uwsgi.log
進入項目的第一層目錄,這裏有寫好的uwsgi.ini文件,執行這個文件:
uwsgi --ini uwsgi.ini
特別注意,這裏用的都是相對路徑~真正的執行命令實際上是這樣的:
/root/Envs/whw_di1/bin/uwsgi --ini /opt/whw/uwsgi.ini
——這樣的執行結果是在前臺運行的,咱們的終端會夯住,若是關掉這個終端uwsgi的進行也會關掉,須要咱們再打開一個終端進行下一步的操做~
——讓uwsgi後臺執行的話~只須要在命令裏面加上-d參數就行了:
uwsgi -d --ini uwsgi.ini
nginx的配置文件是 /opt/tngx231/conf/nginx.conf 。
# 這裏須要說明一下: 若是安裝的是nginx不是tengine,且沒有指定安裝目錄,那麼它的配置文件默認是 /etc/nginx目錄中的nginx.conf文件
編輯這個文件
vim /opt/tngx231/conf/nginx.conf
咱們只配置第一個server裏面的參數:
server { listen 80; server_name localhost; location / {
# 支持uwsgi的配置 include uwsgi_params;
# ip與端口是uwsgi服務器的ip與端口~本例兩者在一個機器裏所以用環回地址 uwsgi_pass 127.0.0.1:8000; #root html; #index index.html index.htm; }
# 存放靜態文件的配置 location /static{ alias /opt/whw_static; } # xxxxxxxxxxxxxxx }
nginx配置完後啓動nginx服務:
nginx
若是中途修改了nginx.conf的參數的話,保存完後須要重啓nginx服務,記得在重啓前-t一下查看nginx的狀態:
(whw_di1) [root@bogon whw]# nginx -t nginx: the configuration file /opt/tngx231//conf/nginx.conf syntax is ok nginx: configuration file /opt/tngx231//conf/nginx.conf test is successful (whw_di1) [root@bogon whw]# (whw_di1) [root@bogon whw]# nginx -s reload
至此,項目部署的配置就這麼多了。
(1)用戶發起請求
(2)訪問IP(或者訪問域名www.whw.com) 請求走到nginx這一層代理
(3)nginx直接轉發(uwsgi_pass)給後端django的地址
(4)django處理完畢
(5)響應給nginx
(6)nginx返回結果給瀏覽器界面
看到最後,聰明的你確定看出端倪來了:數據庫用的是sqllit!爲何不用實際生產環境中經常使用的MySQL呢?
這是由於Red Hat Enterprise Linux/CentOS 7.0發行版已將默認的數據庫從 MySQL 切換到 MariaDB,實際中,咱們既能夠進行配置,讓數據庫在MySQL與MariaDB之間切換,也能夠將默認的MariaDB卸載掉安裝純淨版的MySQL。關於二者有什麼差異我還沒怎麼學習。
關於數據庫的相關配置會在另一篇文章中具體寫一下~