亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 Nginx 入門教程 Nginx 入門教程 23 使用 Nginx 部署 Python 項目

使用 Nginx 部署 Python 項目

今天的目標是完成一個 Python Web 項目的線上部署,我們使用最新的 Django 項目搭建一個簡易的 Web 工程,然后基于 Nginx 服務部署該 Python Web 項目。

1. 前期準備

1.1 安裝虛擬環境pyenv

首先要知道,使用虛擬環境逐漸成了 python 項目開發中的一種主流方式。pyenv 可以幫我們生成多個 python 的虛擬環境,這樣我可以在同一臺機器上使用 python2 或者 python3 或者 python3 的不同版本,避免不同項目因為依賴模塊版本問題發生沖突。只要使用時,切換到那個具體的版本環境即可。下面來看在 CentOS 上如何安裝并使用 pyenv :

# 安裝git
$ yum install git
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
# 安裝 pyenv-virtualenv
$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
$ cat ~/.bashrc
  ...

  # 在~/.bashrc最后加上如下3行
  export PATH="~/.pyenv/bin:$PATH"
  eval "$(pyenv init -)"
  eval "$(pyenv virtualenv-init -)"

# 使配置生效
$ source ~/.bashrc

# 查看pyenv的版本
$ pyenv version

# 查看 pyenv 已經托管了哪些 python 版本
$ pyenv versions

# 安裝某個版本的python
$ pyenv install <version>

接下來我們安裝 python 3.8.1 ,同時建立一個以該版本為基礎的虛擬環境:

 # 安裝python 3.8.1版本
 $ pyenv install 3.8.1
 # 建立一個虛擬環境,python版本選擇3.8.1
 $ pyenv virtualenv 3.8.1 env-3.8.1
 # 激活該虛擬環境
 $ pyenv activate env-3.8.1
 # 查看該環境下python版本
 $ python

激活創建的虛擬環境后,在使用 python 就是3.8.1版本的了,pip 命令也是該虛擬環境下的命令。所有 pip 安裝的模塊都會被安裝到該虛擬環境下,而不是主環境中。

1.2 創建django項目

接下來,我們通過 django 框架創建一個簡單的 web 項目,操作系統是 CentOS 7.6。

 # 進入虛擬環境
 $ pyenv activate env-3.8.1
 # 安裝django 2.2版本
 $ pip install django==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
 # 使用django-admin命令創建項目
 $ django-admin startproject test_nginx
 $ cd test_nginx
 # 創建第一個應用
 $ django-admin startapp first

創建 django 的 web 工程和第一個應用后,我們看到工程的結構目錄如下:

圖片描述

為了讓工程順利跑起來,我們需要調整下工程中數據庫的配置,在 test_nginx/settings.p 中,找到 DATABASES 變量的賦值語句,并修改成數據庫相關配置,改為使用 mysql 提供數據庫服務,因此我們需要額外準備一臺有 mysql 服務的機器。具體修改如下圖所示:

圖片描述

最后,我們可以使用命令行啟動該 django 服務了。

 # 安裝依賴
 $ yum install mysql-devel
 $ pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple
 # 首先要生成django系統給我們準備好的一些數據表
 $ python manage.py migrate
 # 交互式啟動django服務
 $ python manage.py runserver 0.0.0.0:8000

執行上述指令后的運行結果如下:

圖片描述

訪問主機的8000端口,發現有報錯,如下:

圖片描述

同樣是 test_nginx/settings.py 中的配置問題,默認是只允許本機訪問,要開放的話,可以在 settings.py 中的修改 ALLOWED_HOSTS 的賦值,具體如下:

# ALLOWED_HOSTS = []
# 添加*,允許其他主機訪問django服務
ALLOWED_HOSTS = ['*']

圖片描述

2. 基于 Nginx 完成 Django 工程的部署

2.1 安裝 uwsgi

python web 服務必須通過 uwsgi 協議才能進行訪問,因此需要安裝 uwsgi 服務來轉發 python 的 http 請求。因此,第一步我們要安裝 uwsgi 服務:

# 激活虛擬環境
$ pyenv activate env-3.8.1
# 安裝uwsgi服務
$ pip install uwsgi -i https://pypi.tuna.tsinghua.edu.cn/simple

2.2 使用 uwsgi 啟動 django 服務

# 進入工程目錄
$ cd /root/test_nginx
$ mkdir uwsgi
# 編輯uwsgi.ini
$ vim uwsgi.ini
$ cat uwsgi.ini
[uwsgi]
# 指定監聽端口
socket = :8000
# 重要配置
chdir = /root/test_nginx   
# 重要,要有wsgi.py文件              
module = test_nginx.wsgi                

master = true
# 啟動進程數
processes = 5
threads = 5
vacuum = true
stats=%(chdir)/uwsgi/uwsgi.status
pidfile=%(chdir)/uwsgi/uwsgi.pid

# 啟動uwsgi服務, 使用-d參數可以放到后臺運行
$ uwsgi -d --ini uwsgi.ini   

2.3 配置 nginx ,將請求轉發到 uwsgi 服務處理

我們在 nginx 中只需要寫上一段簡單的配置,將可以將請求轉發到對應的 uwsgi 服務上進行處理,具體如下:

$ cat /root/nginx/conf/nginx.conf
...
server {
   listen         8001;
   server_name    127.0.0.1
   charset UTF-8;
   access_log      /var/log/nginx/web_access.log;
   error_log       /var/log/nginx/web_error.log;

   client_max_body_size 75M;

   # 最重要的部分
   location / {
       include uwsgi_params;          # 通過uwsgi轉發請求
       uwsgi_pass 127.0.0.1:8000;     # 和前面配置django服務的socket端口保持一致
       uwsgi_read_timeout 15;         # 設置請求超時時間
   }
}

...

重啟 nginx 服務后,訪問8081端口,我們就可以看到前面訪問8000端口的結果了。不同的是,前面是交互式的,使用的是 django 內置的 uwsgi 服務。但是線上環境,一般不會這樣去部署 django 服務,而是使用 nginx + uwsgi 配合部署 django web 服務。

圖片描述

3. 小結

本節我們介紹了 python 的虛擬環境搭建,使用 django 框架創建第一個 web 工程,然后使用 uwsgi 服務運行該 django 項目,最后我們使用 Nginx 服務將 http 請求轉發到 uwsgi 容器中的 django 工程去執行。最后我們從瀏覽器中成功訪問了了 django 工程的首頁,這表明著我們部署 django 項目成功。