Nginx+uWsgi部署Django项目

最近需要部署一个Django项目但是不能用宝塔面板!

呜呜呜 不能懒人式一键部署了

那就学习一下黑框框部署吧

基本原理

  • 首先用户浏览器向nginx发送请求,nginx判断是动态请求还是静态请求,如果是静态请求,则直接返回静态文件。如果是动态请求,则将请求转发给uwsgi服务器,uwsgi调用我们的django进行处理请求,然后一步一步的再返回。
  • WSGI是Web 服务器(uWSGI)与 Web 应用程序或应用框架(Django)之间的一种低级别的接口
  • uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议
  • uwsgi是Nginx服务器和uWSGI服务器的通信协议,规定了怎么把请求转发给应用程序和返回

img

img

使用Xshell完成

1.上传文件到服务器

使用scp命令

1
2
3
scp 文件名 用户名@服务器HOST:上传到服务器的路径
// 需要提供 root 密码
scp name root@82.156.215.40:/root/ipbdTCF/

使用xftp等其他方式也可

2.配置虚拟环境

检查是否安装virtualenv

1
virtualenv --version

安装virtualenv

1
pip3 install virtualenv virtualenvwrapper
1
2
// 遇到权限问题在前面加上 sudo
sudo pip3 install virtualenv virtualenvwrapper

创建虚拟环境

1
virtualenv --no-site-packages --python=python3  虚拟环境文件夹名
  • –no-site-packages 这是构建干净,隔离的模块的参数 (如果virtualenv版本大于20默认携带此参数不需要此参数)
  • –python=python3 这个参数是指定虚拟环境以哪一个物理解释器为基础的
  • 最后一个是虚拟环境的名字 会创建这么一个文件夹

激活虚拟环境

1
source /路径/虚拟环境文件夹名/bin/activate

激活虚拟环境的原理就是修改了PATH变量,path的执行是有顺序的

修改了环境变量的位置

  • echo $PATH 检查环境变量
  • which python3
  • which pip3 检查虚拟环境是否正常

退出虚拟环境

1
deactivate 

项目依赖都装在虚拟环境中管理!

3.配置uwsgi

检查是否安装uwsgi

1
2
3
4
5
6
# 已安装会显示版本号
uwsgi --version

# 未安装使用 pip 安装一下
# 注意要在虚拟环境中安装
pip install uwsgi

启动项目

  • 注意:启动前先runserver测试一下是否配置完成能够正常运行
1
2
3
4
5
6
# 使用uwsgi启动项目
# --file 指向项目内 wsgi.py 文件
# --static-map 指向静态文件路径
# uwsgi --http 0.0.0.0:80 --file 项目名称/wsgi.py --static-map=/static=static
# 在项目目录下
uwsgi --http 0.0.0.0:80 --file teacher/wsgi.py --static-map=/static=static

启动后可在自己服务器的公网IP访问到Django项目

  • http://公网IP地址

配置uwsgi

1
2
# 在项目目录下创建 uwsgi.ini 作为uwsgi配置文件
vim uwsgi.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# uwsgi.ini文件详情
[uwsgi]
# 项目目录
chdir=/opt/project_teacher/teacher/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=项目名.wsgi:application

# 指定sock的文件路径
# 与nginx通讯使用
socket=/项目绝对路径/uwsgi.sock
# 启用主进程
master=true
# 进程个数
workers=4
pidfile=/项目绝对路径/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=1028

# 设置日志目录
# 日志保存地点
daemonize=/项目绝对路径/uwsgi.log
1
2
3
4
5
6
# 启动: ini 为uwsgi配置文件
uwsgi --ini uwsgi.ini
# 重启: pid 为uwsgi启动后保存uwsgi启动进程的文件
uwsgi --reload uwsgi.pid
# 停止:
uwsgi --stop uwsgi.pid
1
2
# 查看uwsgi是否正常启动
ps aux | grep uwsgi

Nginx配置

nginx的安装请查看另外一篇博客

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
worker_processes  4;
# 指定使用的用户
user root;

events {
worker_connections 1024;
}

http {
keepalive_timeout 65;
server {
# http 请求的端口
listen 80;
# https 请求的端口
listen 443 ssl http2;
# 配置的IP与域名
# 这里随便输入的
server_name www.abc.com 123.123.24.23;
charset utf-8;
gzip on;
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;
# SSL证书配置
ssl_certificate /usr/local/nginx/conf/cert/tcfapi/tcfapi.snowhouse.space_bundle.pem;
ssl_certificate_key /usr/local/nginx/conf/cert/tcfapi/tcfapi.snowhouse.space.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params;
uwsgi_connect_timeout 30;
# unix: 刚刚配置好的 uwsgi.sock 路径
uwsgi_pass unix:/root/IPBDPythonGroup/medicalSys/tichengfen/uwsgi.sock;
}
# 指定静态文件路径
location /static/ {
alias /root/IPBDPythonGroup/medicalSys/tichengfen/static/;
index index.html index.htm;
}
}
}
1
2
3
4
5
6
# 使用时记得配置全局环境变量
# 启动nginx
# 启动之后访问对应的nginx配置好的路径即可
nginx
# 关闭nginx
nginx -s stop