Nginx uwsgi部署Django
#0 GitHub
代码语言:javascript复制None
#1 环境
代码语言:javascript复制CentOS6.9 ( 腾讯云服务器 )
Python 3.6.4
Django==2.0.7
#2 开始
#2.1 新建一个Django项目
代码语言:javascript复制项目根目录(把django项目放在opt目录下)
/opt/pro
#2.2 项目结构
代码语言:javascript复制工程名:pro app名:app
.
├── app
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
├── pro
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── templates
#2.3 修改settings.py
代码语言:javascript复制因为不涉及到数据库,所以把数据库配置删掉
#DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
代码语言:javascript复制允许所有url访问
ALLOWED_HOSTS = ["*"]
#3 uwsgi
#3.1 安装uwsgi
代码语言:javascript复制pip3 install uwsgi
#3.2 使用uwsgi启动django项目
代码语言:javascript复制安装django
pip3 install django==2.0.7
代码语言:javascript复制进入项目根目录(/opt/pro)
cd /opt/pro/
uwsgi --http 0.0.0.0:8080 --file pro/wsgi.py --static-map=/static=static
代码语言:javascript复制解释上述命令
--http 0.0.0.0:8080 # 指定ip,因为我用的是云服务器,所以是0.0.0.0,如果用的是虚拟机,把0.0.0.0改成虚拟机内网ip(猜测,没有实践过)
--file pro/wsgi.py # 指定django项目中wsgi.py文件
--static-map=/static=static # 静态文件
#3.3 使用uwsgi配置文件启动django项目(重点)
代码语言:javascript复制在项目根目录下新建文件夹 script
cd /opt/pro/
mkdir script
代码语言:javascript复制在script目录下新建 uwsgi.ini
cd script
vim uwsgi.ini
代码语言:javascript复制填入以下内容
# uwsig使用配置文件启动
[uwsgi]
# 项目目录
chdir=/opt/pro/
# 指定项目的application
module=pro.wsgi:application
# 指定sock的文件路径
socket=/opt/pro/script/uwsgi.sock
# 进程个数
workers=5
pidfile=/opt/pro/script/uwsgi.pid
# 指定IP端口 云服务器需要改成 0.0.0.0
http=0.0.0.0:8080
# 指定静态文件
static-map=/static=/opt/pro/pro/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/opt/pro/script/uwsgi.log
代码语言:javascript复制启动uwsgi
cd /opt/pro/script/
uwsgi --ini uwsgi.ini # 启动uwsgi
代码语言:javascript复制uwsgi相关操作
uwsgi --ini uwsgi.ini # 启动
uwsgi --stop uwsgi.pid # 关闭
#4 Nginx
#4.1 安装Nginx
代码语言:javascript复制配置yum源
vim /etc/yum.repos.d/nginx.repo
代码语言:javascript复制[nginx]
name=nginx repo
# 下面这行centos根据你自己的操作系统修改比如:OS/rehel
# 6是你Linux系统的版本,可以通过URL查看路径是否正确
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1
代码语言:javascript复制安装nginx
yum -y install nginx
代码语言:javascript复制测试是否安装完成,命令启动nginx
/etc/init.d/nginx start
#4.2 Django Uwsgi Nginx
代码语言:javascript复制创建配置文件
cd /etc/nginx/conf.d/
vim pro.conf
代码语言:javascript复制server {
listen 80;
server_name 192.144.190.22; # 如果服务器已经被域名解析,必须填域名
access_log /var/log/nginx/access.log main;
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;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
# 指定项目路径uwsgi
location / {
include uwsgi_params;
uwsgi_connect_timeout 30;
uwsgi_pass unix:/opt/pro/script/uwsgi.sock;
}
# 指定静态文件路径
location /static/ {
alias /opt/pro/pro/static/;
index index.html index.htm;
}
}
代码语言:javascript复制完美 !!!
Nginx相关命令
/etc/init.d/nginx start # 开始
/etc/init.d/nginx stop # 关闭
/etc/init.d/nginx restart # 重启
#5 注意
- 用Nginx uwsgi部署django,必须Nginx和uwsgi都启动
#6 番外篇
#1 uWSGI
# 启动django
代码语言:javascript复制# file : Django项目中wsgi.py文件路径
uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py
# uWSGI参数
参数 | 说明 |
---|---|
http | 地址和端口号,例如:uwsgi --http 0.0.0.0:8000 |
socket | 地址和端口号,例如:uwsgi --socket :8001 |
listen | 设置socket的监听队列大小(默认:100) |
processes | 开启的进程数量 |
workers | 开启的进程数量,等同于processes |
threads | 运行线程(processes的线程数) |
master | 允许主进程存在,启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。 |
daemonize | 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。 |
log-maxsize | 以固定的文件大小(单位KB),切割日志文件 |
pidfile | 指定pid文件的位置,记录主进程的pid号。 |
chdir | 指定运行目录 |
wsgi-file | 载入wsgi-file |
stats | 在指定的地址上,开启状态服务 |
vacuum | 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件 |
disable-logging | 不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中。如果不开启这项,那么你的日志中会大量出现这种记录 |
- http 和 socket 的区别
http : nginx 和 uwsgi 中间走的是 http 协议,文本
socket : nginx 和 uwsgi 中间走的是 wsgi 协议,二进制
生产环境百分之九十九是 unix Socket 的方式,ngnix 是做反向代理用的,因为 uwsgi 不具备路由、过滤等方向代理功能,但论执行效率,可以做性能测试,如果是 http 协议的话,性能是没有 unix Socket 方式好的
# uWSGI 加进程启动Django
代码语言:javascript复制# 添加4个进程,每个进程2个线程
uwsgi --http 0.0.0.0:8000 --file Demo/wsgi.py --processes 4 --threads 2
#2 Nginx
未完待续…