本文用来记录Django部署的一些笔记,文中描述的系统环境为Ubuntu,采用的服务器为nginx以及用uwsgi来链接Django,这也是目前Django比较主流的部署套餐。html
浏览器发起web请求<——>nginx接收请求<——>uwsgi处理请求<—–>django程序python
安装nginxlinux
sudo apt-get install nginx
运行并查看状态nginx
/etc/init.d/nginx start
/etc/init.d/nginx status
先安装python-dev,不然uwsgi安装可能会报错web
apt-get install python-dev
安装uwsgi django
pip install uwsgi
安装完后添加环境变量: vim
打开文件:sudo vim .bashrc,添加如下内容:浏览器
export PATH=/home/nmask/.local/bin/:$PATH
而后运行source .bashrc使之生效,就能够在命令行直接运行uwsgibash
/etc/init.d/nginx start
测试uwsgi打开http://localhost:80,能看到nginx说明nginx安装成功。服务器
项目根目录下建立test.py文件,写入:
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return "Hello World”
项目根目录下运行:
uwsgi --http :8001 --wsgi-file test.py#表示运行test文件,8001端口
访问http://localhost:8001,若是能看到hello world,说明uwsgi安装成功。
uwsgi --http :8001 --chdir /home/nmask/mydjango --wsgi-file mydjango/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:8080
http : 协议类型和端口号经常使用选项:
以配置文件形式设置
项目根目录下建立:myweb_uwsgi.ini文件(名字能够是任意的),写入:
# myweb_uwsgi.ini file [uwsgi] # Django-related settings socket = :8000#推荐将socket换成http # the base directory (full path) chdir = /home/nmask/mydjango # Django s wsgi file module = mydjango.wsgi # process-related settings # master master = true # maximum number of worker processes processes = 4 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true
利用uwsgi运行django:(与前面命令行的方式同样,这样为了方便写成了文件)
uwsgi --ini myweb_uwsgi.ini
配置文件参数:
打开/etc/nginx/nginx.conf,http内添加如下内容:
server { listen 8890; server_name 127.0.0.1#0.0.0.0为任意IP都可访问 charset UTF-8; access_log /var/log/nginx/myweb_access.log; error_log /var/log/nginx/myweb_error.log; client_max_body_size 75M; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_read_timeout 2; } location /static { expires 30d; autoindex on; add_header Cache-Control private; alias /home/fnngj/pydj/myweb/static/; } }
说明:这里的8000端口是uwsgi的端口,nginx运行将开启8890端口,也就是nginx的8890端口与uwsgi的8000端口相互通讯。
运行uwsgi
nohup uwsgi --ini myweb_uwsgi.ini &
运行nginx:
/etc/init.d/nginx start
最后访问http://IP地址:8890,能够看到django项目已经被运行在nginx上了。
注意:在更新Django代码后,最好重启一下uwsgi进程,避免出现不可预知的Bug!
#关闭uwsgi和nginx sudo nginx -s stop killall -9 uwsgi
No module named django.core.wsgi
启动uwsgi时报如下错误:ImportError: No module named django.core.wsgi for uwsgi
uwsgi在python虚拟环境中启动时,配置文件里面要加虚拟的路径。
打开django.init(本身建立)写入:
home=/path/to/venv/
运行:
uwsgi --ini django.ini --protocol=http
uwsgi http is ambiguous
这也是由于虚拟环境的缘由,建议退出python的虚拟环境,而后pip install uwsgi。