发布时间:2020-03-01 13:47:03编辑:admin阅读(2818)
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了。比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。
要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。
WSGI是一种通信协议。
uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。
默认ubuntu已经有了python3,但是pip没有安装。
apt-get install -y python3-pip
pip3 install virtualenv
创建虚拟环境
sudo mkdir /virtualenvs cd /virtualenvs sudo /usr/local/bin/virtualenv -p /usr/bin/python3 --no-site-packages venv
/virtualenvs/venv/bin/pip3 install django
root@ubuntu:~# mkdir /www root@ubuntu:~# cd /www/ root@ubuntu:/www# /virtualenvs/venv/bin/django-admin startproject mysite1 root@ubuntu:/www# cd mysite1/ root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/python manage.py startapp blog root@ubuntu:/www/mysite1# mkdir static
编辑配置文件
root@ubuntu:/www/mysite1# vim mysite1/settings.py
允许监听所有IP,注意:'*'必须用引号包起来
ALLOWED_HOSTS = ['*']
原生启动方式
/virtualenvs/venv/bin/python manage.py runserver 0.0.0.0:8000
访问页面
效果如下:
/virtualenvs/venv/bin/pip3 install uwsgi
先关闭上面启动的Django项目,使用Ctrl+c,就可以取消。
第一步:进入django项目
cd /www/mysite1/
第二步:命令测试启动
/virtualenvs/venv/bin/uwsgi --http 0.0.0.0:8000 --file mysite1/wsgi.py --static-map=/static=static
参数说明:
--http 这个就和runserver一样指定IP 端口
--file 这个文件就里有一个反射,如果你在调用他的时候没有指定Web Server就使用默认的
注意:mysite1是一个相对路径。--file它的绝对路径是/www/mysite1/mysite1/wsgi.py
--static 做一个映射,指定静态文件。
此时,访问http://192.168.10.104:8000/
如果访问正常,表示项目启动成功
使用Ctrl+c,取消uwsgi启动。
第一步:在django项目同级目录创建uwsgi目录,用于存放相关文件
cd /www/mysite1mkdir uwsgi
项目结构如下:
mysite1/ ├── blog │ ├── admin.py │ ├── apps.py │ ├── __init__.py │ ├── migrations │ │ └── __init__.py │ ├── models.py │ ├── tests.py │ └── views.py ├── db.sqlite3 ├── manage.py ├── mysite1 │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── uwsgi └── static
第二步:进入script目录,创建一个uwsgi.ini文件
cd /www/mysite1/uwsgi vim uwsgi.ini
编辑uwsgi.ini文件内容如下:
[uwsgi] # Django-related settings # the base directory (full path) chdir = /www/mysite1 # Django's wsgi file module = mysite1.wsgi # the virtualenv (full path) home = /virtualenvs/venv # process-related settings # master master = true # maximum number of worker processes processes = 1 # pid file pidfile = /www/mysite1/uwsgi/uwsgi.pid # The address and port of the monitor http = :8000 # clear environment on exit vacuum = true #The process runs in the background and types the log to the specified log file daemonize = /www/mysite1/uwsgi/uwsgi.log
注意几个很重要的参数
chdir 项目目录,写绝对路径
module Django的 wsgi 文件,表示mysite1/wsgi.py
home 虚拟环境目录,写绝对路径
daemonize 进程在后台运行,并将日志打到指定的日志文件
root@ubuntu:~# cd /www/mysite1/ root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/uwsgi --ini uwsgi/uwsgi.ini [uWSGI] getting INI configuration from uwsgi/uwsgi.ini
查看文件
root@ubuntu:/www/mysite1# ll uwsgi/ 总用量 20 drwxr-xr-x 2 root root 4096 8月 10 11:47 ./ drwxr-xr-x 6 root root 4096 8月 10 11:27 ../ -rw-r--r-- 1 root root 717 8月 10 11:41 uwsgi.ini -rw-r----- 1 root root 2021 8月 10 11:47 uwsgi.log -rw-rw-rw- 1 root root 6 8月 10 11:47 uwsgi.pid
刷新页面,查看访问是否正常。
uwsgi 常用的启动命令
uwsgi --ini uwsgi.ini # 启动 uwsgi --reload uwsgi.pid # 重启 uwsgi --stop uwsgi.pid # 关闭
apt-get install -y nginx
cd /etc/nginx/sites-enabled vim mysite1.conf
内容如下:
server { listen 8000; server_name localhost; # 指定项目路径uwsgi location / { include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的 uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间 uwsgi_pass unix:/www/mysite1/uwsgi/mysite1.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他 } # 指定静态文件路径 location /static/ { alias /www/mysite1/static/; } }
改为socket方式
cd /www/mysite1/uwsgi vim uwsgi.ini
内容如下:
[uwsgi] # Django-related settings # the base directory (full path) chdir = /www/mysite1 # Django's wsgi file module = mysite1.wsgi # the virtualenv (full path) home = /virtualenvs/venv # process-related settings # master master = true # maximum number of worker processes processes = 1 # pid file pidfile = /www/mysite1/uwsgi/uwsgi.pid # socket file path (full path) socket = /www/mysite1/uwsgi/mysite1.sock # clear environment on exit vacuum = true #The process runs in the background and types the log to the specified log file daemonize = /www/mysite1/uwsgi/uwsgi.log
重新加载uwsgi
/virtualenvs/venv/bin/uwsgi --reload uwsgi.pid
加载nginx配置文件
nginx -s reload
查看端口,8000已经为nginx接管了
root@ubuntu:/etc/nginx/sites-enabled# netstat -anpt|grep 8000 tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 18895/nginx -g daem tcp 0 0 192.168.10.102:8000 192.168.10.105:52556 ESTABLISHED 19135/nginx: worker tcp 0 0 192.168.10.102:8000 192.168.10.105:52557 ESTABLISHED 19135/nginx: worker
刷新页面,效果同上!
进入目录 /www/mysite1/static ,放一张图片 girl.jpg
访问图片
http://192.168.10.102:8000/static/girl.jpg
效果如下:
本文参考链接:
http://www.py3study.com/Article/details/id/323.html
https://www.jianshu.com/p/07458e99198a
47606
45987
36909
34470
29082
25713
24566
19715
19248
17756
5566°
6155°
5691°
5737°
6706°
5483°
5484°
5989°
5965°
7295°