使用 Nginx 部署 Python 项目
今天的目标是完成 Python Web 项目的线上部署,我们使用最新的 Django 项目搭建简易的 Web 工程,然后基于 服务部署该 Python Web 项目。
1. 前期准备
首先要知道,使用虚拟环境逐渐成了 python 项目开发中的一种主流方式。pyenv 可以帮我们多个 python 的虚拟环境,这样我可以在同一台机器上使用 python2 或者 或者 的不同版本,避免不同项目因为依赖模块版本问题发生冲突。只要使用时,切换到那个具体的版本环境即可。下面来看在 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 安装的模块都会被安装到该虚拟环境下,而不是主环境中。
接下来,我们通过 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_ $ cd test_ # 创建第应用 $ django-admin startapp first
创建 django 的 web 工程和第应用后,我们看到工程的结构目录如下:
为了让工程顺利跑起来,我们需要调整下工程中的配置,在 test_/settings.p 中,找到 DATABASES 变量的赋值语句,并成相关配置,改为使用 提供服务,因此我们需要额外准备一台有 服务的机器。具体如下图所示:
最后,我们可以使用命令行启动该 django 服务了。
# 安装依赖 $ yum install -devel $ pip install client -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_/settings.py 中的配置问题,认是只允许本机访问,要开放的话,可以在 中的 ALLOWED_HOSTS 的赋值,具体如下:
# ALLOWED_HOSTS = []# *,允许其他主机访问django服务ALLOWED_HOSTS = ['*']
2. 基于 完成 Django 工程的部署
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
# 进入工程目录$ cd /root/test_ $ mkdir uwsgi# 编辑uwsgi.ini$ vim uwsgi.ini $ cat uwsgi.ini[uwsgi]# 指定监听端口socket = :8000# 重要配置chdir = /root/test_ # 重要,要有wsgi.py module = test_.wsgi master = true# 启动进程数processes = 5 threads = 5 vacuum = truestats=%(chdir)/uwsgi/uwsgi.status pidfile=%(chdir)/uwsgi/uwsgi.pid# 启动uwsgi服务, 使用-d参数可以放到运行$ uwsgi -d --ini uwsgi.ini
我们在 中只需要写上一段简单的配置,将可以将请求转发到对应的 uwsgi 服务上进行处理,具体如下:
$ cat /root//conf/.conf... server { listen 8001; server_name 127.0.0.1 charset UTF-8; access_log /var/log//web_access.log; error_log /var/log//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; # 设置请求超时时间 }}...
重启 服务后,访问8081端口,我们就可以看到前面访问8000端口的结果了。不同的是,前面是交互式的,使用的是 django 内置的 uwsgi 服务。但是线上环境,一般不会这样去部署 django 服务,而是使用 + uwsgi 配合部署 django web 服务。
3. 小结
本节我们介绍了 python 的虚拟环境搭建,使用 django 框架创建第 web 工程,然后使用 uwsgi 服务运行该 django 项目,最后我们使用 服务将 http 请求转发到 uwsgi 容器中的 django 工程去执行。最后我们从浏览器中成功访问了了 django 工程的,这表明着我们部署 django 项目成功。