Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。
在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是NGINX的强项)。然后,NGINX将所有非静态请求通过uwsgi传递给Django,由Django来进行处理,从而完成一次WEB请求。
可见,uwsgi的作用就类似一个桥接器。起到桥梁的作用。
Linux的强项是用来做服务器,所以,下面的整个部署过程我们选择在Ubuntu下完成。
二、必要的前提
2.1 准备知识
django
一个基于python的开源web框架,请确保自己熟悉它的框架目录结构。
uWSGI
一个基于自有的uwsgi协议、wsgi协议和http服务协议的web网关
nginx
常用高性能代理服务器
wsgi.py
django项目携带的一个wsgi接口文件
如果项目名叫destiny的话,此文件就位于[destiny/destiny/wsgi.py]
服务器上的nginx
服务器上的nginx已经安装好了,在/etc/nginx 目录下,部署自己的django程序时,最好写自己的conf配置文件,然后按照自己的配置文件启动,配置文件写法下面会说。
uwsgi的安装
首先要在自己的目录下安装anaconda环境,安装包在 /home/updatefiles 目录下,是一个sh文件,启动安装一路回车即可,然后为自己的项目建造虚拟环境,具体做法看这里,建造虚拟环境后,安装你的程序对应各种包,例如django-1.11.2等等,最后在虚拟环境中,使用pip安装uwsgi
上面的工作都完成了,最后在虚拟环境中,使用pip安装uwsgi
pip install uwsgi
测试uWSGI: 新建文件test.py,写入以下内容
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return "Hello World"
运行
uwsgi --http 0.0.0.0:8000 --wsgi-file test.py
如果端口占用,使用
lsof -i :8000
列出占用端口的程序的pid号,并使用以下命令杀掉所有占用端口的程序
sudo kill -9 pid
然后浏览 http://127.0.0.1:8000(或http://内网ip:8000、或http://外网ip:8000)查看效果,有”Hello World”输出即安装成功。
首先确定你的django程序没什么问题了,再开始部署流程,往往会有但不仅限于以下问题:
setting.py里debug没关
setting.py里数据库信息没有更换为服务器数据库信息
setting.py里没有设置allow_host
setting.py里没有设置template或static目录信息
建立单独的uwsgi配置文件
首先,建议工程目录采取这样的结构
|--工程
|
|--Django程序
|--setting
在自己的工程目录下,建立两个文件夹,一个是django程序,一个是setting,用来装部署配置文件。
在setting中建立如destiny.ini的配置文件
下面是个例子(以图书管理系统为例,把该改的地方改成你自己的)
# backend_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /home/yangtz/booksManage
# Django's wsgi file
module = booksManage.wsgi
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe),将socket写入sock文件,安全又便捷
socket = /home/yangtz/booksManage/booksManage/booksManage.sock
# ... with appropriate permissions - may be needed
chmod-socket = 666
# clear environment on exit
vacuum = true
daemonize = /home/yangtz/booksManage/log/uwsgi.log
建立工程单独的nginx配置文件
在setting中建立如destiny.conf的配置文件,
下面是个例子(以图书管理系统为例,把该改的地方改成你自己的)
user www-data;
worker_processes auto;
pid /run/nginx.pid;
# 如果是非root用户,user设为nobody
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
# backend_nginx.conf
# the upstream component nginx needs to connect to
upstream bookmanager {
server unix:/home/yangtz/booksManage/booksManage/booksManage.sock; #读取uwsgi生成的socket文件中的socket信息
# server 127.0.0.1:8000; # sever信息,有上边sock文件,这个就可以注掉了
}
# configuration of the server,最重要的部分
server {
# 你的服务站点挂载的端口号
listen 4020;
# the domain name it will serve for
server_name 192.168.100.18; # 一般写你服务器的ip或你的域名
charset utf-8;
# access_log /home/yangtz/webback/backend/log/nginx_access.log;
# error_log /home/yangtz/webback/backend/log/nginx_error.log;
# max upload size
client_max_body_size 75M; # adjust to taste
# Finally, 设置总目录,实际就是映射到uwsgi的socket
location / {
uwsgi_pass bookmanager;
include /etc/nginx/uwsgi_params; # the uwsgi_params file you install
}
# 如果有media或者静态文件需要挂载就加上,前后端各自分开的,不加或者注掉就行
# Django media
# location /media {
# alias /path/to/your/mysite/media; # your Django project's media files - amend as required
# }
# location /static {
# alias /home/yangtz/webback/backend/static; # your Django project's static files - amend as required
# }
}
}
最后启动uwsgi和nginx
uwsgi --ini /×××/你的工程/setting/destiny.ini
nginx -c /×××/你的工程/setting/destiny.conf (如果权限问题,你是root的话,可以在前面加sudo)
如果是非root用户,不能listen 1024以下的端口。
那么只好,在你的conf文件中配置user nobody; listen <1024+>;
温馨提示:
使用 lsof -l 查看端口占用
kill 进程号 (杀掉进程,只能kill自己的进程)
前端代码部署只需将包含前端代码文件夹放到 tomcat/webapps下,然后到tomcat/bin里启动 ./startup.sh即可