【Python3.7 Centos服務部署從0開始】Nginx & uWSGI 必知必會

Nginx 概述

不依賴第三方服務搭建網站服務器及功能html

Nginx 做爲反向代理器

Nginx不直接處理請求,而是在雲主機中有一個Real Server,Nginx只是把請求轉發給Real Server,等待Real Server請求處理完成後,再將請求返回給客戶端python

Nginx 做爲負載均衡器

在環境中存在 Nginx, Real Server No.1, Real Server No.2......
Nginx同樣執行請發轉發,可是在 Nginx 挑選 Real Server 的時候,權重是不同的,Nginx 中本身的一套邏輯,這套邏輯就是爲了負載均衡nginx

假設:Real Server No.1 的權重是3,Real Server No.2 的權重是1,在4個請求過來後,極可能 Real Server No.1 會收到3個請求,Real Server No.2會收到一個請求sql

CentOS && Nginx

安裝 Nginx

yum install nginx
複製代碼

Nginx 經常使用指令

1.啓動Nginx

sudo nginx
複製代碼

判斷是否啓動成功
在瀏覽器中輸入公網的IP,出現以下的頁面則爲啓動成功 django

2.中止Nginx

快速中止Nginxubuntu

sudo nginx -s stop
複製代碼

3.退出Nginx

與上面的 stop 相比會更加優雅一下vim

sudo nginx -s quit
複製代碼

4.從新加載Nginx的配置文件

在修改完配置後執行該命令centos

sudo nginx -s reload
複製代碼

5.從新打開Nginx的日誌文件

sudo nginx -s reopen
複製代碼

修改Nginx的配置文件

文件存放的位置

cd /etc/nginx/
主配置文件:nginx.conf
複製代碼

Nginx關鍵配置模塊

  • events 配置域:網絡鏈接相關配置(I/O模型等)
  • server 配置域:相關服務節點配置
  • location 配置域:資源路由配置
  • http 配置域:Nginx做爲網頁服務器時的配置(#mail)
  • upstream 配置域:反向代理配置域

配置存在層級關係瀏覽器

# nginx.conf 五大配置域相關層次關係
events {
    ...
}

http {
    ...
    upstream {
        ...
    }
    
    server {
        ...
        location {
            ...
        }
    }
}

# mail {
# ...
# }
複製代碼

WSGI 協議概述

全稱:Web Server Gateway Interface
是 Web Server 和 Web Application 通訊的規範安全

uWSGI概述

  • 實現了WSGI協議
  • Web服務器
  • 接收客戶端請求經過協議傳達給Django應用

centOS 中安裝 python3.7

1.查找python的位置:

whereis python
複製代碼

2.安裝相關包,用於下載編譯python3

yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 
複製代碼

3.默認的,centos7也沒有安裝pip

#運行這個命令添加epel擴展源
yum -y install epel-release

#安裝pip
yum install python-pip
複製代碼

4.用pip裝wget

pip install wget
複製代碼

5.用wget下載python3的源碼包

wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
複製代碼

6.手動安裝

#解壓
xz -d Python-3.7.0.tar.xz
tar -xf Python-3.7.0.tar

#進入解壓後的目錄,依次執行下面命令進行手動編譯
./configure prefix=/usr/local/python3
make && make install
複製代碼

7.添加軟連接

#將原來的連接備份
mv /usr/bin/python /usr/bin/python.bak

#添加python3的軟連接
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python

#測試是否安裝成功了
python -V
複製代碼

8.更改yum配置,由於其要用到python2才能執行,不然會致使yum不能正常使用

vi /usr/bin/yum
# 把 #! /usr/bin/python修改成#! /usr/bin/python2

vi /usr/libexec/urlgrabber-ext-down
# 把 #! /usr/bin/python 修改成#! /usr/bin/python2
複製代碼

9.修改pip的python版本
原先的pip文件是以python2爲默認版本

查找pip的位置
whereis pip => /usr/bin/pip # 這裏面會有不少其餘的pip,好比pip2,pip3,pip3.6等

vim /usr/bin/pip
#!/usr/bin/python2 ==> #!/usr/bin/python3
複製代碼

centOS 中安裝 uWSGI

1.經過pip安裝 uWSGI

pip install uwsgi
複製代碼

若是出現 致命錯誤:Python.h:沒有那個文件或目錄 執行以下命令

yum install libffi-devel -y
複製代碼

2.添加軟鏈接

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/uwsgi /usr/sbin/uwsgi
複製代碼

uWSGI的基礎配置

  • chdir: WSGI 應用目錄
  • module:WSGI 應用的模塊名字
  • processes:uWSGI 進程數
  • (http-)socket:套接字路徑、地址
  • max-requests:最大併發請求數
  • vacuum:當服務器退出時是否須要自動清理文件,刪除相關的pid文件 socket文件 (Boolean)

uWSGI啓動(兩種方式)

1.經過命令行啓動

將配置經過命令行寫入,進而啓動

uwsgi --chdir xxxx --socket :80 --max-requests 5000 --processes 4 --module xxx.wsgi

--chdir xxxx (指定 uwsgi 的應用目錄)
--socket :80 (指定端口)
--max-requests (最大請求數)
--processes (處理的進程數)
--module (指定具體的wsgi模塊)
複製代碼

2.使用配置文件啓動

1.建立 uwsgi 的配置文件

vim uwsgi-demo.ini
複製代碼

2.寫入配置文件

[uwsgi]

chdir = /xxxx/xx

http-scoket = :80

max-requests = 5000

processes = 4

module = xxx.wsgi
複製代碼

3.經過命令行執行 wsgi 的配置

uwsgi --ini uwsgi-demo.ini
複製代碼

爲何須要uWSGI部署Django

  • Django runserver 能夠直接對外服務,可是隻用於測試,不安全且性能較差
  • uWSGI能夠很好的進行多線程調用、進程監控,例如:uWSGI會監測django服務是否掛了,掛了會主動重啓
  • uWSGI提供完善的請求日誌處理

使用 uWSGI 部署測試

1.建立一個文件夾

mkdir deployment
cd deployment
複製代碼

2建立Python文件,定義uWSGI應用

touch uwsgi_test.py
複製代碼

3.寫入相關配置

def application(env, start_response):
    start_response('200 OK', [('Content-type', 'text/html')])
    return [b'Hello World, Hello uWSGI']
複製代碼

4.運行 uwsgi

uwsgi --http :8000 --wsgi-file uwsgi_test.py
複製代碼

使用 uWSGI 部署 django

1.修改 django 的 setting

ALLOWED_HOSTS = ['*']  # 開啓全部人均可以訪問
複製代碼

啓動方式(一),經過命令行啓動

找到 django 目錄下的 wsgi文件執行 django_deployment.wsgi爲對應django項目下的文件相對路徑

uwsgi --http :8000 --module django_deployment.wsgi
複製代碼

啓動方式(二),經過文件配置啓動

django目錄中建立一個配置文件

touch django-uwsgi.ini
複製代碼

修改裏面的內容

[uwsgi]

chdir = /root/deployment/xianshangbushuceshi/django_deployment
module = django_deployment.wsgi
http-socket = :8000

master = True
processes = 4
threads = 1
vacuum = True
複製代碼

啓動 uwsgi 服務

uwsgi --ini django-uwsgi.ini
複製代碼

優化:改成後臺啓動,將日誌打印到日誌文件中
django-uwsgi.ini修改成

[uwsgi]

chdir = /root/deployment/xianshangbushuceshi/django_deployment
module = django_deployment.wsgi
http-socket = :8000

master = True
processes = 4
threads = 1
vacuum = True

# backend run uwsgi
daemonize = %(chdir)/log/uwsgi-8000.log
log-maxsize = 1024*1024*1024
pidfile = %(chdir)/pid/uwsgi-8000.pid
複製代碼

在對應目錄建立相關的日誌文件夾存放日誌文件

mkdir log
mkdir pid
複製代碼

啓動 uwsgi 服務

uwsgi --ini django-uwsgi.ini
複製代碼

中止 uwsgi 服務

uwsgi --stop pid/uwsgi-8000.pid
複製代碼

查看相關的日誌log

tail -f uwsgi-8000.log
複製代碼

查看相關的進程id pid

cat uwsgi-8000.pid
複製代碼

查看進程

拿到進程 id 以後,13290是個人進程id
ps -aux | grep 12390
複製代碼

Django + Nginx uWSGI 部署

爲何還須要Nginx進行部署?

  • Nginx 做爲知名服務器,Nginx提供更加安全的服務保障
  • Nginx 提供反向代理、負載均衡等豐富功能
  • 對於靜態文件的處理能力更強

Nginx 部署的步驟

  1. uWSGI 啓動 Django 應用服務
  2. 修改 Nginx 配置文件,完成反向代理配置
  3. 收集靜態文件,完成靜態文件尋址配置

第一步 uWSGI 啓動 Django 應用服務

uwsgi --ini django-uwsgi.ini
複製代碼

第二步 修改 Nginx 配置文件

進入 nginx 的配置目錄

cd /etc/nginx
複製代碼

注意該目錄下的文件都是須要root權限才能夠修改,若是當前不是root的話能夠切換成root

sudo su
複製代碼

修改nginx.conf

...
http {
    ...
   upstream uwsgi {
       server 127.0.0.1:8000 # 我這裏django項目是經過8000端口啓動的因此就映射到:8000
   }
   
   server {
        ...
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  .actoress.xyz;  # 這裏配置的是解析到該服務器的域名,前面加 . 表示所有二級域名
        charset utf-8;
        
        access_log /var/log/nginx-uwsgi.log;  # 添加日誌配置
        
        location / {
            proxy_pass http://uwsgi;  # 映射到反向代理
        }
        
        # 配置靜態文件尋址目錄 
        location /static {
            alias /home/ubuntu/jarvis/deployment/django_deployment/static;
        }
        ...
   }
}
...
複製代碼

第三步 收集靜態文件,完成靜態文件尋址配置

添加靜態文件尋址目錄
django.settings.py 文件中

# 最後一行添加
STATIC_OOT = os.path.join(BASE_DIR, 'static/')
複製代碼

執行收集靜態文件

python manage.py collectstatic
複製代碼
相關文章
相關標籤/搜索