python開發web項目_Django2:Web項目開發入門筆記(20)

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓

這一篇教程,我們一起來了解如何在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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446214.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446214.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446214.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STL源碼剖析 Set相關算法 并集 set_union|交集 set_intersection|差集 set_difference |對稱差集 set_symmetric_difference

注意事項 四種相關算法:并集、交集、差集、對稱差集本章的四個算法要求元素不可以重復并且經過了排序底層接受STL的set/multiset容器作為輸入空間不接受底層為hash_set和hash_multiset兩種容器 并集 set_union s1 U s2考慮到s1 和 s2中每個元素都不唯一&#xff0…

python sqlserver 數據操作_python對Excel數據進行讀寫操作

python對Excel數據進行讀寫操作將學習到的基礎操作記錄在這里,便與復習查看1.python讀取Excel工作簿、工作表import xlrd # 讀取工作簿 wbxlrd.open_workbook(招生表.xls) # 讀取工作簿下所有的工作表 wswb.sheets() # 讀取工作簿下所有工作表名稱 wsnamewb.sheet_n…

Arrays數組工具類

介紹 代碼 package lesson.l8_arrays;import java.util.Arrays;/*** Illustration** author DengQing* version 1.0* datetime 2022/6/23 16:53* function Arrays數組工具類*/ public class ArraysUtil {public static void main(String[] args) {int[] arr1 new int[]{1, 12…

通過解析URL實現通過Wifi的用戶查找

使用鏈接 遇見數據倉庫|遇見工具|IP地址精確查詢|WIFI精確查詢|在線語音識別|夢幻藏寶閣估價|福利資源|自定義導航-met.redhttps://sina.lt/ 操作步驟 打開第一個鏈接,點擊高精度IP定位,然后點擊右上角,創建一個Key,隨便輸入一…

anaconda中怎么sh_【好工具】 深度學習煉丹,你怎么能少了這款工具!JupyterLab 遠程訪問指南...

歡迎來到【好工具】專欄,本次我們給介紹一款可以進行遠程深度學習煉丹的工具 JupyterLab 及其配置流程,幫助讀者在本地進行調試,Max 開發效率。作者 & 編輯 | Leong導言不知道讀者們有沒有發現,如果你用 Anaconda 中的 Notebo…

java 類和對象 屬性和行為 成員變量和局部變量

概念 使用 案例 public class PersonText {public static void main(String[] args) {Person person new Person();person.name "dq";person.age 11;person.eat("番茄炒蛋");} }class Person {/*** 姓名*/String name;/*** 年齡*/Integer age;/*** 方…

STL源碼剖析 數值算法 heap算法

算法 adjacent_findcountcount_iffindfind_iffind_endfor_eachgenerategenerate_nincludesmax_elementmergemin_elementpartitionremoveremoveremove_copyremove_ifremove_copy_ifreplacereplace_copyreplace_ifreplace_copy_ifreversereverse_copyrotaterotate_copysearchsea…

java 學生對象數組

題目 代碼 package lesson.l10_oop;/*** Illustration** author DengQing* version 1.0* datetime 2022/7/1 9:57* function*/ public class Student {int number;int state;int score;public static final int NUM 20;public static void main(String[] args) { // 對…

STL源碼剖析 lower_bound | upper_bound | binary_search

lower_bound 二分查找的一種版本,試圖在已經排序的區間內查找元素value,如果區間內存在和value數值相等的元素,便返回一個迭代器,指向其中的第一個元素。如果沒有數值相等的元素,會返回假設這個元素存在的前提下應該出…

java能調用python嗎_如何使用運行時在Java中調用python程序 - java

我想用來自Java的參數調用python程序。但是我的輸出是空白。代碼在這里。 Python代碼在這里: import sys print(sys.argv[1]) Java代碼在這里: public class PrintNumber{ public static void main(String[] args){ Process proc; try { proc Runtime.g…

java 匿名對象

概念 代碼 package lesson.l10_oop;/*** Illustration** author DengQing* version 1.0* datetime 2022/7/1 13:39* function 匿名對象*/ public class Anonymous {public static void main(String[] args) { // 用法1new Teacher().say("dq");new Teacher()…

STL源碼剖析 第七章 仿函數(函數對象)

函數對象&#xff1a;具有函數性質的對象使得用戶像使用函數一樣使用它一般函數提供兩個版本&#xff0c;第一個版本使用operator < ;第二版本需要用戶 指定某種操作第二版本就是設計一個函數&#xff0c;將函數指針作為算法的一個參數&#xff1b;或者將函數操作設計成為一…

開源合同管理系統_「物聯網架構」最適合物聯網的開源數據庫

物聯網產生大量的數據&#xff0c;包括流數據、時間序列數據、RFID數據、傳感數據等。要有效地管理這些數據&#xff0c;就需要使用數據庫。物聯網數據的本質需要一種不同類型的數據庫。以下是一些數據庫&#xff0c;當與物聯網一起使用時&#xff0c;會給出非常好的結果。物聯…

java 方法重載

概念 代碼 package lesson.l10_oop;/*** Illustration** author DengQing* version 1.0* datetime 2022/7/1 14:31* function 方法重載*/ public class Load {public static void main(String[] args) {Load load new Load();load.mOL(4);load.mOL(4, 5);load.mOL("ff&qu…

STL源碼剖析 第八章 配接器

設計模式&#xff1a;將一個類的接口轉化為另外一個類的接口 配接器的概觀和分類 改變仿函數接口 函數配接器 &#xff1b;queue和stack 通過修飾deque函數接口來實現改變容器接口 容器配接器 &#xff1b; insert、reverse、iostream 等iterators他們的接口可以由ite…

python中random庫_python標準庫之random模塊

Python中的random模塊用于生成隨機數。 下面具體介紹random模塊的功能&#xff1a; 1.random.random() #用于生成一個0到1的 隨機浮點數&#xff1a;0< n < 1.0 1 import random 2 a random.random() 3 print (a)2.random.uniform(a,b) #用于生成一個指定范圍內的隨機符…

java 可變個數形參

概念 案例 package lesson.l10_oop;/*** Illustration** author DengQing* version 1.0* datetime 2022/7/1 14:53* function 可變個數形參*/ public class ChangeableFormalParameter {public static void main(String[] args) {ChangeableFormalParameter parameter new Ch…

C++標準庫 第七章 STL迭代器

迭代器 能力&#xff1a;行進和存取的能力Input迭代器 一次一個向前讀取元素&#xff0c;按此順序一個一個返回元素例子&#xff1a;從標準輸入裝置(鍵盤) 讀取數據&#xff0c;同一個數據不會被讀取兩次&#xff0c;流水一樣&#xff0c;指向的是邏輯位置使用前置式遞增運算…

nacos集群的ap cp切換_阿里Nacos-配置-多環境

多環境的配置隔離是配置中心最基礎的一個功能之一。不同的環境配置的值不一樣&#xff0c;比如數據庫的信息&#xff0c;業務的配置等。Spring Boot 多環境配置首先我們來回顧下在Spring Boot中用配置文件的方式怎么進行環境的隔離。默認我們都會創建一個application.propertie…

java 值傳遞機制

說明 案例1 案例2 案例3 案例4 案例5 案例6 package lesson.l11_oop2;/*** Illustration** author DengQing* version 1.0* datetime 2022/7/2 21:24* function 將對象作為參數傳遞給方法*/ public class Circle {double radius;public double findArea() {return Math.PI * Ma…