1. 程式人生 > >centos7下部署Django(nginx+uwsgi+django+python3)

centos7下部署Django(nginx+uwsgi+django+python3)

參考文獻:

https://blog.csdn.net/anifans9350/article/details/80145535

https://www.cnblogs.com/dalanjing/p/8636338.html

 

0.安裝步驟預覽
(1)系統預設自帶python2.x,所以需要先安裝python3.x
(2)python2對應pip,python3對應pip3,用原始碼安裝python3後pip3也自動安裝了
(3)用pip3安裝virtualenv
(4)用virtualenv建立python3的虛擬環境
(5)在建立的虛擬環境中,用pip3安裝Django和uwsgi
(6)安裝nginx


#################使用root身份登入系統執行#####################
1.編譯安裝python3

(1)依賴安裝

#為centos系統增加編譯功能:
yum -y install gcc gcc-c++

#防止編譯安裝python3出現各種異常:
yum install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

(2)編譯安裝

#下載python3安裝包:
cd /home/<username>/Downloads/ #<username>用自己的使用者名稱代替
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
#解壓: tar -zxvf Python-3.6.3.tgz #配置,將python3安裝到/usr/local/python3/路徑下:
cd Python-3.6.3 .
/configure --prefix=/usr/local/python3 #編譯安裝: make -j2 make install -j2 #建立軟連結,方便在終端中直接使用python3和pip3命令: ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 #安裝成功性測試,顯示相應版本就表示成功了:
python3 -V pip3 -V

2.用pip3安裝virtualenv

#更新pip3至最新版本
pip3 install --upgrade pip
#安裝virtualenv pip3
install virtualenv

#賦予可執行許可權
chmod 777 /usr/local/python3/lib/python3.6/site-packages/virtualenv.py
#建立軟連結,方便在終端中直接使用virtualenv
ln -s /usr/local/python3/lib/python3.6
/site-packages/virtualenv.py /usr/bin/virtualenv

3.用virtualenv建立python3的虛擬環境

#切換到使用者家目錄下
cd /home/<username>/

#新建資料夾 mkdir www_space_venv

#建立名稱為venv的虛擬環境 virtualenv
-p /usr/bin/python3 venv

4.在建立的虛擬環境中,用pip3安裝django和uwsgi

cd /home/<username>/www_space_venv/

#啟用虛擬環境
source venv
/bin/activate

#安裝django與uwsgi pip3
install django pip3 install uwsgi

#檢視django安裝成功與否
pip3 show django
#檢視uwsgi安裝成功與否 pip3 show uwsgi

#退出虛擬環境
deactivate

5.安裝nginx

#新增nginx儲存庫
yum install epel-release

#安裝nginx
yum install nginx

#使用Nginx的幾個好處:
安全:不管什麼請求都要經過代理伺服器,這樣就避免了外部程式直接攻擊web伺服器
負載均衡:根據請求情況和伺服器負載情況,將請求分配給不同的web伺服器,保證伺服器效能
提高web伺服器的IO效能:這個我也沒看懂,總結來說就是請求從客戶端傳到web伺服器是需要時間的,傳遞多長時間就會讓這個程序阻塞多長時間,而通過反向代理,就可以在反向代理這完整接受請求,然後再傳給web伺服器,從而保證伺服器效能,而且有的一些簡單的事情(比如靜態檔案)可以直接由反向代理處理,不經過web伺服器

6.建立一個django的專案

(1)新建專案

#切換到工作目錄
cd /home/<username>/www_space_venv/

#啟用虛擬環境
source venv/bin/activate

#建立自己的django專案,專案取名為mysite_django
django-admin.py startproject mysite_django

#修改settings.py,允許所有HOST的訪問,不然瀏覽器訪問會報錯DisallowedHost at / Invalid HTTP_HOST header
ALLOWED_HOSTS = [ ] #修改前
ALLOWED_HOSTS = ['*'] #修改後

#啟動django自帶web伺服器
cd mysite_django
python3 manage.py runserver <自己主機地址IP>:8080 #<自己主機地址IP>填自己主機地址,後面需要指定一個可用的埠(如8080)

#用瀏覽器訪問django,<自己主機地址IP>:8080,得到如下訊息說明成功
The install worked successfully! Congratulations!

(2)新建應用

#切換到工作目錄
cd /home/<username>/www_space_venv/

#啟用虛擬環境
source venv/bin/activate

#新建應用
cd mysite_django
python3 manage.py startapp hello_app

#
新定義的應用加到settings.py中的INSTALL_APPS中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hello_app',
]
編輯應用中的views.py檔案:
from django.http.response import HttpResponse

def hello(request):
    user = request.GET.get('user')
    if not user: user = 'world'
    return HttpResponse('hello %s' % user)

  編輯專案中的urls.py檔案:

from django.contrib import admin
from django.urls import path

from hello_app import views as hello_views

urlpatterns = [
path('admin/', admin.site.urls),
path('hello',hello_views.hello),
]

(3)測試

#啟動django自帶web伺服器
cd mysite_django
python3 manage.py runserver <自己主機地址IP>:8080 #<自己主機地址IP>填自己主機地址,後面需要指定一個可用的埠(如8080)

#用瀏覽器訪問django,訪問方式為
<自己主機地址IP>:8080/hello
<自己主機地址IP>:8080/hello?user=123

#瀏覽器可以看到對應返回資訊,說明django專案新建成功

7.關聯nginx、uwsgi、django

(1)防火牆中相應埠開放,允許外網訪問

#以80埠為例

#查詢TCP/UDP的80端口占用情況
firewall-cmd --query-port=80/tcp
firewall-cmd --query-port=80/udp
#如果返回結果為“no”,則表示該埠尚未開放

#永久開放TCP/UDP的80埠
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=80/udp

#重啟防火牆
firewall-cmd --reload

(2)關聯nginx與uwsgi

#為django站點建立一個nginx服務的配置檔案
cd /etc/nginx/conf.d/
touch mysite_django.conf
vim mysite_django.conf
#在檔案mysite_django.conf中填入如下內容
server {
    server_name 192.168.2.141; #暴露給外部訪問的IP地址,根據實際情況改寫成自己主機IP
    listen 80; #暴露給外部訪問的埠
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:8080; #nginx與uwsgi通訊用的socket介面
    }
}
#如遇到nginx服務啟動失敗,請檢查mysite_django.conf中指定的埠是否被佔用

(3)關聯uwsgi與django

#建立uwsgi配置檔案
cd /home/<username>/www_space_venv
touch mysite_django_uwsgi.ini
vim mysite_django_uwsgi.ini
#在mysite_django_uwsgi.ini檔案中填入如下內容
#mysite_django_uwsgi.ini
[uwsgi]

#與nginx通訊
socket = 127.0.0.1:8080
#讓uwsgi作為單獨的web-server,這裡註釋掉
#http = 127.0.0.1:8080

#django專案根目錄
chdir = /home/chatbot/www_space_venv/mysite_django #根據實際情況改寫成自己django專案的路徑

#本項指示uwsgi.py檔案的位置,其位於Django工程目錄下有個與工程名同名的子資料夾內(設定方式為:資料夾名.wsgi)
#module = mysite_django
wsgi-file = mysite_django/wsgi.py

processes = 4
threads = 2
master = True
pidfile = uwsgi.pid
daemonize = uwsgi.log

# 虛擬環境地址
#virtualenv = /home/chatbot/www_space_venv/venv

(4)nginx+uwsgi+django聯調測試

#先關閉nginx與uwsgi服務
pkill -9 nginx
pkill -9 uwsgi

#啟動nginx服務
service nginx start

#啟動uwsgi服務
cd /home/chatbot/www_space_venv
source venv/bin/activate #啟用虛擬環境
uwsgi --ini mysite_django_uwsgi.ini

#用瀏覽器訪問django,訪問方式為
<自己主機地址IP>:80/hello
<自己主機地址IP>:80/hello?user=123

#瀏覽器可以看到對應返回資訊,說明部署成功,後面只需專注於django專案的開發了