Powered By icbug & AI悦创
本项目 github 地址:

项目难点

  1. 解决 Django 项目中 static 文件夹静态资源无法加载问题
  2. 创建 python3 的 Venv 虚拟环境
  3. 使用 Nginx 反向代理,代理网站
  4. uwsgi 部分报错问题

    提示:本教程仅用于 Ubuntu18.04 ,其它系统版本可能不成功

1.0 环境搭建

1.1 搭建环境介绍

Ubuntu18.04 系统( root 权限)+Nginx+uwsgi+Python3.6+Django
本项目使用 VENV 虚拟环境进行部署。

1.2 环境搭建

1.2.1 更新 APT 索引

  1. apt update

  1. apt upgrade

1.2.2 安装并创建虚拟环境

安装 virtualenv 和 virtualenvwrapper

  1. apt install virtualenv
  1. apt install virtualenvwrapper

1.2.3 配置 ENV 程序环境

编辑 ~/.bashrc

  1. vim ~/.bashrc

~/.bashrc 文件中添加,配置环境变量。

  1. export WORKON_HOME=$HOME/.virtualenvs
  2. source /usr/share/virtualenvwrapper/virtualenvwrapper.sh

之后重载一下 .bashrc 即可:

  1. source ~/.bashrc

没有报错即可继续,有的话可以自行百度一下,CSDN上面一般会有很多解决方案!
我们来检测一下是否安装成功:

  1. mkvirtualenv

有如下显示即为成功:
image.png
但是这个配置的版本为 Python2:
image.png
这个先不用管,创建文件时指定 Python3.6 程序即可。

1.2.4 创建虚拟环境

因为,在 Linux 下,不会有自动查找环境变量这一功能,所以我们就需要进入 python3 路径或者指定 python3 路径。

方法一:

这里是很容易出错的一步,这一步骤必须在 /usr/bin 目录下进行创建,否则会找不到Python程序!!!
因为 ubuntu 自带的 python3 存在路径 :

  1. root@iZ8vb8h5pbkzfj43uzuuc9Z:~# which python3
  2. /usr/bin/python3

所以要进入该路径下。

  1. cd /usr/bin/
  1. mkvirtualenv -p python3.6 p5py

出现如下类似的结果即可:
image.png

方法二:

  1. mkvirtualenv -p /usr/bin/python3.6 Tester

image.png
上图即为成功。成功之后会自动进入虚拟环境。

PS:这里我使用的是 p5py 虚拟环境。

简单介绍一下虚拟环境的进入和退出的方式
退出环境命令:

  1. deactivate

进入虚拟环境:

  1. workon p5py # p5py为虚拟环境名称

1.3 安装 Django 环境

接下来的一系列步骤都要在我们创建虚拟环境 p5py 进行完成,安装 Python3 Django 模块。

  1. pip3 install django

image.png

1.4 上传项目

这里需要特别注意一下,建议打包为 zip 文件进行上传,如果你用的是 xshell 可以安装 lrzsz 程序。

  1. apt install lrzsz

在命令行中输入 rz 即可上传单个文件压缩包, 上传后进行解压,如果你的系统没有 unzip 程序请使用

  1. apt install unzip

自行安装。我放在根目录下进行解压,解压完成后删掉 zip 压缩包即可
如下图:
image.png
image.png

1.5 试运行 Django 项目

我的 Django 项目开源了:https://github.com/AndersonHJB/Python_Online_Programming,记得给整个项目 root 权限。「也可以不用加权限」

在测试的时候,先把 Django 中的 settings.py 中的 DEBUG=True,改成 DEBUG=False。也要把你的服务器 IP 添加到 ALLOWED_HOSTS 里面。
image.png
在运行之前我可以使用如下命令导出项目依赖:

  1. pip freeze > requirements.txt

注意:项目依赖需要在真实环境「也就是退出虚拟环境」和进入虚拟环境我们都要安装。
**
接下来安装依赖:

  1. pip3 install -r requirements.txt

接下来运行,在项目根目录下输入:

  1. sudo python3 manage.py runserver 0.0.0.0:80

如果项目在对应端口成功加载即为 django 程序没有任何问题,如果有问题根据报错自行寻找解决方法进行处理或者留言。

image.png
也能运行代码、保存、分享。

1.6 安装 Nginx

image.png
不管是接下来的方法一,还是方法二,你用一种即可。最后访问公网 IP 都会出现上面的结果。

方法一:

本次安装 nginx 最新稳定版本 nginx(nginx 1.18),首先需要 ppa 镜像添加插件:

  1. sudo apt-get install software-properties-common

添加 ppa 镜像:

  1. sudo add-apt-repository ppa:nginx/stable

更新源:

  1. apt update

安装 nginx:

  1. apt install nginx

之后查看 nginx 版本号确定版本是否正确:

  1. (p5py) root@iZ8vb8h5pbkzfj43uzuuc9Z:/p5py# nginx -v
  2. nginx version: nginx/1.18.0 (Ubuntu)

方法二:

1)如果你之前安装过 Nginx,你可以输入:

  1. sudo apt-get --purge remove nginx

将 Ngxin 的配置文件和程序全都卸载,然后按照下面的方式安装即可。

2)如果你不想卸载之前的,仍然可以按照下面的方式进行安装升级,但是 /etc/nginx 目录下可能会有你之前版本的一些配置文件,比如 sites-enabled 文件夹和 sites-available 文件夹等等,但1.18.0 稳定版本不需要这些文件夹了,所以最好是卸载了重新安装。

Nginx 版本介绍

Nginx 官网下载:https://nginx.org/en/download.html
image.png

  • Mainline version:正在开发阶段的版本,可能会有漏洞。
  • Stable version:稳定版
  • Legacy versions: 历史版本
  • 本次安装1.18.0的稳定版本

实际操作

安装或升级,需要添加源才能下载 Nginx 的稳定版本,首先输入以下两条命令:

  1. sudo wget http://nginx.org/keys/nginx_signing.key
  2. sudo apt-key add nginx_signing.key

/etc/apt/sources.list 文件中加入下面两行:

  1. deb http://nginx.org/packages/ubuntu/ codename nginx
  2. deb-src http://nginx.org/packages/ubuntu/ codename nginx

注意 codename 要根据系统来选择可以点击查看详细说明:http://nginx.org/en/linux_packages.html#stable
image.png

  1. sudo vim /etc/apt/sources.list

image.png
Ubuntu 其他版本和系统平台更换 codename 即可最后输入:

  1. sudo apt-get update
  2. sudo apt-get install nginx

输入完成之后,如果你看见这句话:
image.png

输入 nginx -v 查看安装版本:

  1. root@iZ8vb1o9x5vmr6vy4go7tsZ:~# nginx -v
  2. nginx version: nginx/1.18.0

此外,/etc/nginx/ 下的目录结构:
image.png


1.7 安装并测试 uwsgi

image.png
这里一定不要用 apt 进行安装,要用 pip3 的方式进行安装,apt 安装会导致很多报错!

  1. pip3 install uwsgi

安装完成后如下画面:
image.png
下面我们来测试一下我们的 uwsgi 网站服务**器,创建个 test.py,用 vim 编辑打开。**

  1. touch test.py # 创建文件
  2. vim test.py # 编辑文件

写入如下内容:

  1. def application(env, start_response):
  2. start_response('200 OK', [('Content-Type','text/html')])

使用 uwsgi 测试启动命令指定端口以及文件:

  1. uwsgi --http :8000 --wsgi-file test.py

用 F12 Network 查看是否为 200 OK 状态码:
image.png

2.0 部署 Django

2.1 uwsgi_params 拷贝到项目根目录

复制 nginx 目录下的 uwsgi_params 文件到根目录:

  1. cp /etc/nginx/uwsgi_params /p5py # Tips:中间有空格,/p5py为根目录下的p5py文件夹,也是项目的根目录

2.2 创建 uwsgi 目录,编写 uwsgi 配置文件

在项目根目录下创建 uwsgi 文件夹:

  1. (p5py) root@iZ8vb8h5pbkzfj43uzuuc9Z:/p5py# mkdir uwsgi && cd uwsgi

创建 uwsgi.ini 配置文件:

  1. (p5py) root@iZ8vb8h5pbkzfj43uzuuc9Z:/p5py# touch uwsgi.ini

编辑 uwsgi.ini :

  1. vim uwsgi.ini
  2. # 写入内容如下:
  3. [uwsgi]
  4. socket=:8080
  5. plugin=python3
  6. wsgi-file=p5py/wsgi.py
  7. master=true
  8. processes=1
  9. threads=1
  10. stats = 127.0.0.1:8000
  11. vhost = true

2.3 部署 Nginx 服务

进入 nginx 配置文件夹

  1. cd /etc/nginx/conf.d/

创建 project 配置文件

  1. vim project.conf

写入如下内容:

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. charset utf-8;
  5. client_max_body_size 75M;
  6. location /static {
  7. alias /p5py/static;
  8. }
  9. location / {
  10. include uwsgi_params;
  11. uwsgi_pass 127.0.0.1:8000;
  12. #include /p5py/p5py/uwsgi_params;
  13. }
  14. }

重启:

  1. /etc/init.d/nginx restart

输入之后的结果:

  1. (p5py) root@iZ8vb8h5pbkzfj43uzuuc9Z:/etc/nginx/conf.d# /etc/init.d/nginx restart
  2. [ ok ] Restarting nginx (via systemctl): nginx.service.

2.4 编辑 setting.py,收集静态文件

找到同名文件夹中的 p5py,编辑 setting.py

第一步,把 DEBUG 改为 False:
image.png
第二步,确定 Allow Host 选项中有自己的域名,否则无法访问。
image.png
第三部,重要的一步,配置 static_root 路径:

  1. STATIC_ROOT = os.path.join(BASE_DIR, '/static/')

image.png
这些配置完成之后,返回项目根目录
运行收集静态程序命令:

  1. python3 manage.py collectstatic

我的输入:

  1. (p5py) root@iZ8vb8h5pbkzfj43uzuuc9Z:/p5py# python3 manage.py collectstatic

image.png
如上图即为成功。

2.5 安装 uwsgi-Python3 插件

  1. sudo apt-get install uwsgi-plugin-python3

进入 uwsgi 文件夹:

  1. cd uwsgi

启动命令:

  1. uwsgi --ini uwsgi.ini
  1. uwsgi -d --ini uwsgi.ini # 这个-d是后台运行

各大服务器厂商的云服务器请确保安全组的端口打开!
使其在后台运行
确保 socket 端口为正常状态!
一定在 ini 中再次确认是 socket 而不是 http_socket!

3.0 解析域名

把域名解析到对应的服务器,并在 Setting.py 中把解析的域名添加到 ALLOW_HOST 中


4.0 SSL部署

参考阿里云文档
https://help.aliyun.com/document_detail/98728.html
其中的 nginx.conf 替换为 conf.d 目录中的 project.conf 即可!


完整版仓库地址:
https://github.com/AndersonHJB/Python_Online_Programming