該樓層疑似違規已被系統折疊 隱藏此樓查看此樓
這一篇教程,我們一起來了解如何在CentOS系統中將Django2的Web項目部署到Nginx服務器。
CentOS系統雖然和Ubuntu系統都是Linux系統,但是環境搭建和部署過程還是有一些區別。
整個流程分為幾個部分:
安裝圖形桌面與遠程登錄
安裝Python3.6及相關庫文件
安裝Django2
安裝uWSGI
安裝Nginx
配置Nginx
使用ini文件啟動uWSGI服務器
使用supervisor管理uWSGI服務器
接下來,我們就逐一完成這些步驟。
一、安裝圖形界面
在此之前大家應該先完成CentOS系統的最小化安裝。
然后,安裝我們需要的圖形界面和遠程登錄功能。
因為遠程登錄需要圖形界面支持,所以從順序上先進行圖形界面的安裝,再安裝遠程登錄。
(一)使用Gnome桌面
GNOME桌面比較耗費系統資源,在主機上我們更多是通過命令行進行操作,所以,我比較傾向于使用面向低性能硬件的Xfce桌面。
如果選擇使用Xfce桌面,大家可以略過此步驟,直接瀏覽第(二)部分。
1、安裝軟件源
執行命令:
yum install epel* -y
2、更新軟件包
執行命令:
yum -y upgrade
3、安裝桌面支持
執行命令:
yum groupinstall "X Window System" "GNOME Desktop" -y
或者:
yum -y groupinstall "Server with GUI"
4、安裝xrdp和vnc
執行命令:
yum install tigervnc-server xrdp -y
5、啟動xrdp服務,并且設置為開機啟動
執行命令:
systemctl start xrdp
(二)使用Xfce桌面
1、安裝軟件源
執行命令:
yum install epel* -y
2、更新軟件包
執行命令:
yum -y upgrade
3、安裝桌面管理器
執行命令:
yum install lightdm -y
4、安裝桌面
執行命令:
yum groupinstall xfce -y
5、安裝遠程服務
執行命令:
yum install tigervnc-server xrdp -y
6、禁用GDM桌面管理器
執行命令:
systemctl disable gdm
7、啟用LightDM桌面管理器
執行命令:
systemctl enable lightdm
8、配置Xfce為默認桌面
執行命令:
vim ~/.Xclients
在打開的文件中,寫入以下內容:
#!/bin/bash
XFCE="$(which xfce4-session 2>/dev/null)"
exec "$XFCE"
然后,執行命令,增加執行權限:
chmod +x ~/.Xclients
9、啟動或重啟遠程連接服務
執行命令:
systemctl start xrdp
或者:
systemctl restart xrdp
10、設置遠程連接為開機啟動
執行命令:
systemctl enable xrdp
二、安裝Python3.6
CentOS系統自帶的是Python2.7.5,可以通過輸入“python”命令打開。
我們安裝了Python3.6之后,需要使用命令“python3”啟動Python3.6的Shell。
1、安裝相關庫文件
執行命令:
yum -y install zlib*
yum -y install gcc
yum -y install gcc-c++
yum -y install openssl
yum -y install openssl-devel
yum -y install sqlite
yum -y install sqlite-devel
yum -y install readline readline-devel
2、安裝Python3.6與相關庫文件
(一)安裝Python3.6
首先,創建一個用于保存下載文件的文件夾,并賦予權限。
執行命令:
mkdir /home/centos/Downloads
cd /home/centos/Downloads
chmod 777 /home/centos/Downloads
然后,下載Python的源碼安裝包。
下載地址:https://www.python.org/downloads/source/
如果是通過Windows遠程登錄,可以直接復制系統中下載好的Python源碼安裝包,粘貼到CentOS系統的文件夾中。
當然,也可以在CentOS系統中通過“wget”命令進行下載。
執行命令:
wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
最后,解壓縮軟件安裝包,進入解壓縮后的目錄進行安裝。
執行命令:
tar xfz Python-3.6.5.tgz
cd Python-3.6.5
./configure --enable-shared --with-ssl=openssl
make && make install
安裝完畢后,啟動Python3.6。
執行命令:
python3
此時,可能會出現錯誤。
python3: error while loading shared libraries: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory
產生錯誤的原因是:配置文件添加了參數“ --enable-shared ”,Python3.6運行時沒有加載到文件“libpython3.6m.so.1.0 ”。
實際上我們在執行“make”命令時,已經編譯了這個文件,解決問題的方法就是把編譯好的文件復制到特定的目錄中。
執行命令:
cd /home/centos/Downloads/Python-3.6.5
cp libpython3.6m.so.1.0 /usr/local/lib64/
cp libpython3.6m.so.1.0 /usr/lib/
cp libpython3.6m.so.1.0 /usr/lib64/
(二)安裝相關庫
我們需要安裝 “python36-devel”。
這個庫沒有在系統默認源中,所以無法直接通過“yum”命令進行安裝。
我們需要先添加一個安裝源工具,通過下載rpm文件進行安裝。
但是,直接下載rpm文件進行安裝有可能會出現錯誤。
Warning: user mockbuild does not exist. using root
所以,我們需要先安裝一個依賴庫。
執行命令:
yum install mock -y
useradd -s /sbin/nologin mockbuild
然后,下載“rpmforge”的安裝文件。
可以到“http://repoforge.org/use/”進行下載,或者通過“wget”命令進行下載。
執行命令:
cd /home/centos/Downloads/
wget http://repository.it4i.cz/mirrors/repoforge/redhat/el7/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
下載完成后進行安裝。
執行命令:
rpm -ivh rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
此時,可能會出現“NOKEY”的錯誤,是因為“yum”安裝了舊版本的“GPG keys”造成的,解決辦法是導入“gpg”。
執行命令:
rpm --import /etc/pki/rpm-gpg/RPM*
接下來,就可以安裝 “python36-devel”了。
可以先通過命令,搜索python3-devel的可用版本。
執行命令:
yum search python3 | grep devel
在搜索結果中可以看到一些關于Python3.X的文件名稱,其中有一個為“Python36”。
執行命令:
yum -y install python36-devel
這樣就完成了“python36-devel”的安裝。
三、安裝Django2
Python3.6默認安裝后,需要使用命令“pip3”安裝第三方庫。
先安裝Django的依賴庫“pytz”。
執行命令:
pip3 install pytz
然后,安裝Django。
執行命令:
pip3 install django
或者,下載Django的安裝包,放入“Downloads”文件夾后進行安裝。
執行命令:
cd /home/centos/Downloads/
tar xfz Django-2.0.3.tar.gz
cd Django-2.0.3
python3 setup.py install
最后,測試一下Python3.6、Django以及Sqlite3是否能夠正常使用。
執行命令:
python3
>>>import django
>>>import sqlite3
四、安裝uWSGI
注意:不要用“yum install uwsgi”進行安裝,這樣裝完會關聯系統中的Python2.7,并且系統可能會自帶uwsgi,自帶uwsgi的啟動項在“/usr/sbin/”中,而我們通過“pip3”命令安裝uwsgi的啟動項在“/usr/local/bin/”目錄中。
執行命令:
pip3 install uwsgi
如果怕搞混,我們可以卸載系統自帶的uwsgi,然后將啟動項復制到“/usr/sbin/”目錄中。
執行命令:
yum remove uwsgi
cp -f /usr/local/bin/uwsgi /usr/sbin/
或者,我們可以將自己安裝的uwsgi啟動項復制到“/usr/sbin/”目錄中時,改名為“uwsgi3”。
執行命令:
cp -f /usr/local/bin/uwsgi /usr/sbin/uwsgi3
接下來,我們測試一下uwsgi是否能夠正常工作。
創建一個測試文件“mytest.py”。
執行命令:
vi /var/www/mytest.py
寫入內容:
# !/usr/bin/env python3 # 也可以寫成“#!/usr/bin/python3.6”。
def application(env, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
return [b'UWSGI Test...']
代碼輸入完畢,按“ESC”鍵并鍵入“:wq”回車,保存測試文件。
然后,系統中如果沒有自帶瀏覽器的話,可以安裝火狐瀏覽器。
執行命令:
yum install firefox -y
最后,進行測試。
執行命令:
cd /var/www/
uwsgi --http :8888 --wsgi-file mytest.py
此時,通過本機瀏覽器訪問“http://127.0.0.1:8888”或者“http://localhost:8888”進行測試,如果頁面中顯示“UWSGI Test…”字樣,則說明測試成功,uwsgi可以正常工作了。
五、安裝Nginx
首先,安裝Nginx的依賴庫“pcre”。
執行命令:
yum install -y pcre pcre-devel
然后,安裝Nginx。
執行命令:
yum install -y nginx*
安裝完成后,就可以通過命令控制Nginx了。
啟動命令:/usr/sbin/nginx
停止命令:/usr/sbin/nginx -s stop
退出命令:/usr/sbin/nginx -s quit
重載命令:/usr/sbin/nginx -s reload
查詢進程:ps aux|grep nginx
另外,我們還可以設置Nginx為開機自啟動。
執行命令:
vi /etc/rc.local
在打開的文件中,添加一行內容。
/usr/local/nginx/sbin/nginx
六、配置Nginx
創建配置文件,并寫入內容。
執行命令:
vi /etc/nginx/conf.d/MyWeb.conf
寫入內容:
server {
listen 80;
server_name http://www.qqtbb.com;
charset utf-8;
client_max_body_size 5M;
location /media {
alias /var/www/MyWeb/media;
}
location /static {
alias /var/www/MyWeb/static;
}
location / {
uwsgi_pass 127.0.0.1:8888;
include /etc/nginx/uwsgi_params;
}
}
提示:配置內容的詳細說明,可以參考《Django2:Web項目開發入門筆記(16)》。
內容輸入完畢(使用時請先清除注釋),按“ESC”鍵并鍵入“:wq”回車保存,并讓服務器重載配置。
執行命令:
nginx -s reload
此時,可能發生錯誤。
nginx: [error] open() “/usr/local/var/run/nginx.pid” failed (2: No such file or directory)
解決方法是找到“nginx.conf”的文件夾目錄,然后運行“nginx”命令。
例如,“nginx.conf”文件在“/etc/nginx/”目錄中。
執行命令:
nginx -c /etc/nginx/nginx.conf
nginx -s reload
如果發生80端口被占用的情況,可以先查詢占用端口的進程,通過“kill”命令關閉進程。
執行命令:
lsof -i :80
kill -9 [進程ID]
nginx -c /etc/nginx/nginx.conf
七、使用ini文件啟動uWSGI服務器
首先,使用ini文件啟動uWSGI服務器,需要安裝依賴庫。
執行命令:
yum install uwsgi-plugin-python3
然后,在項目文件夾中創建ini文件。
例如,在“/var/www/MyWeb”中存放Web項目文件。
執行命令:
vi /var/www/MyWeb/uwsgi.ini
在新建的文件中輸入內容。
[uwsgi]
socket = 127.0.0.1:8888 # 因為要接收來自Nginx的Socket,此處必須和Nginx的設置保持一致。
chdir = /var/www/MyWeb/
wsgi-file = MyWeb/wsgi.py # 完整路徑是“/var/www/MyWeb/MyWeb/wsgi.py”
processes = 3 # 注意,此處啟用了多進程,之后使用supervisor管理uWSGI時,需要增加配置項。
threads = 5
chmod-socket = 664
chown-socket = www-data
pidfile= /var/www/MyWeb/MyWeb.pid
vacuum = true
提示:配置內容的詳細說明,可以參考《Django2:Web項目開發入門筆記(16)》。
內容輸入完畢(使用時請先清除注釋),按“ESC”鍵并鍵入“:wq”回車保存,然后就可以通過配置文件啟動uWSGI服務器了。
啟動命令:
uwsgi3 --ini /var/www/MyWeb/uwsgi.ini
停止命令:
uwsgi3 --stop /var/www/MyWeb/MyWeb.pid
重載配置:
uwsgi3 --reload uwsgi.ini
再次強調:啟動時注意Python版本是否Python3.6,并且不要使用系統自帶的uwsgi。
此時,通過域名就能夠訪問我們的Web項目了。
八、使用supervisor管理uWSGI服務器
supervisor可以在程序意外關閉時自動重新啟動,使用它管理uWSGI服務器非常不錯。
不過,supervisor只支持Python2,我們需要通過CentOS自帶的Python2.7進行安裝。
首先,安裝“pip”工具。
執行命令:
cd /usr/lib/python2.7/site-packages/
easy_install pip
然后,安裝“supervisor”。
pip install supervisor
接下來,進行配置。
執行命令:
echo_supervisord_conf > /etc/supervisord.conf
vi /etc/supervisord.conf
在打開的文件末尾添加內容。
注意:語句前面不要有空格。
[program:MyWeb]
command=uwsgi --ini /var/www/MyWeb/uwsgi.ini
directory=/var/www/MyWeb/
startsecs=10
stopwaitsecs=10
stopasgroup=true
killasgroup=true
autostart=true
autorestart=true
提示:配置內容的詳細說明,可以參考《Django2:Web項目開發入門筆記(16)》。
這里特別需要注意的是,如果“uwsgi.ini”文件中開啟了多進程,一定要加上下面兩句。
stopasgroup = true # 用于停止進程組,即停止所有通過“uwsgi.ini”配置啟動的進程。
killasgroup = true # 用于關閉進程組,即關閉所有通過“uwsgi.ini”配置啟動的進程。
如果不添加這兩句,supervisorctl命令停止或關閉進程時,只會關閉其中1個進程,從而導致再次啟動或重啟uWSGI失敗,出現類似“MyWeb: ERROR (spawn error)”的錯誤。
這是因為殘留的孤兒進程,阻止了新的同類進程的開啟。
當我們完成配置文件的修改之后,必須重新加載配置文件,才能使其生效。
執行命令:
supervisorctl reload
最后,啟動supervisord和uWSGI。
執行命令:
/usr/bin/supervisord -c /etc/supervisord.conf
或者:
supervisorctl -c /etc/supervisord.conf start MyWeb
此時,可能會發生錯誤。
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
這是因為supervisord已經啟動過,我們需要先查詢已開啟的程序,將其關閉。
執行命令:
find / -name supervisor.sock
unlink /被鏈接文件的所在路徑/supervisor.sock
另外,通過“supervisorctl”命令,可以方便的管理項目。
啟動項目命令:supervisorctl start [配置文件中的項目名稱]
重啟項目命令:supervisorctl restart [配置文件中的項目名稱]
停止項目命令:supervisorctl stop [配置文件中的項目名稱]
控制所有項目:supervisorctl all