检测是否已安装virtualenv
virtualenv --version若没有显示版本号则表示没有安装virtualenv 安装virtualenv
pip install virtualenv创建虚拟环境 路径可自选,也可放置项目目录下 venv为虚拟环境名,可自定义
virtualenv venv进入虚拟环境(需在venv当前目录下操作)
source /venv/bin/activate# 退出虚拟环境命令deactivate安装项目相关依赖 (此操作需要提前提前生成requirements.txt依赖文件) 插入简单说下django依赖文件如何生成
生成依赖文件pip freeze > requirements.txt安装依赖
pip install -r requirements.txt如何查看依赖列表
pip list至于为什么要用虚拟环境来部署,其中的原因若有疑问就自行谷歌吧。不仅仅是部署,每新建一个项目,都建议使用虚拟环境,好处大大的。
下面就要开始正式的部署了,这篇教程以Ubuntu为例 整个部署结构如下: the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django nginx做反向代理处理静态文件,减轻服务器负载 同时也可以配置多台服务器做负载均衡(此篇博客不超扯) uwsgi处理后台请求 ps:后面写些系列博客介绍下uwsgi和nginx等部署所需 ps:毕竟光讲怎么用,不说原理真是耍流氓
虚拟环境下安装uwsgi
pip install uwsgi# 若安装失败,可能是python依赖库没有安装# 执行以下命令apt-get install python-dev编写测试脚本 在项目目录下添加test.py脚本,添加如下内容
# test.pydef application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 #return ["Hello World"] # python2用test.py测试uwsgi
uwsgi --http :8000 --wsgi-file test.py# 若跑不起来,可能需要添加参数# 具体原因这里不深究,历史遗留# 感兴趣的同学可自行谷歌uwsgi --plugin python,http --http :8000 --wsgi-file test.py浏览器访问localhost:8000查看页面是否显示hello world 若正常显示,则说明如下环节正常拉通 the web client <-> uWSGI <-> Python 接着先测试以下django项目自身能否跑通
python manage.py runserver 0.0.0.0:8000确认没问题后,用uwsgi拉通django
uwsgi --http :8000 --module mysite.wsgi此处wsgi命名方式:项目名.wsgi 此wsgi文件可在项目目录中得主目录下找到 确认正常运行,说明如下环节正常拉通
the web client <-> uWSGI <-> Django安装nginx
apt-get install nginx测试nginx能否正常运行,启动nginx
/etc/init.d/nginx start# 或者service nginx start访问浏览器80端口 打开localhost:80 若显示Welcome to nginx!则说明nginx正常运行 说明如下环节正常拉通
the web client <-> the web servernginx默认占用80端口 同时访问公网ip,默认访问得端口也是80 即可以直接访问localhost,不需要加80端口号 ps:赠送一些常用nginx命令
# 重启nginxservice nginx restart# 查看nginx运行状态service nginx status# 停止nginx服务service nginx stop编写nginx配置文件(ubuntu下,centos路径则不同) nginx相关配置存放在/etc/nginx 先将uwsgi_params文件复制到项目目录下 uwsgi_params可在/etc/nginx下找到
cp /etc/nginx/uwsgi_params /path/to/your/PRoject然后在项目目录下新建mysite_nginx.conf 配置文件名,自己记得住就好,保证可读性 填入以下内容
# myproject_nginx.conf# the upstream component nginx needs to connect toupstream django { # server unix:///path/to/your/mysite/mysite.sock; # for a file socket server 127.0.0.1:8001; # for a web port socket (we'll use this first)}# configuration of the serverserver { # the port your site will be served on listen 8000; # the domain name it will serve for server_name .example.com; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /path/to/your/mysite/media; # your Django project's media files - amend as required } location /static { alias /path/to/your/mysite/static; # your Django project's static files - amend as required } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed }}写好配置文件后,需要将此配置文件软链接至nginx配置文件目录下 配置文件则存放在/etc/nginx/sites-enabled
ln -s /path/to/your/mysite_nginx.conf /etc/nginx/sites-enabled/# 举例conf文件路径为/home/test/mysite/mysite_nginx.conf# 命令就这么写ln -s /home/test/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/接下来拉通部署下静态文件 在django项目得的setting文件中,添加下面一行内容:
STATIC_ROOT = os.path.join(BASE_DIR, "static/")运行python命令
python manage.py collectstatic此命令会将项目中得所有静态文件全部汇总到static目录下 原因就是为了方便给nginx做反向代理时,可以快速得找到所请求得静态文件 现在可以测试以下nginx是否能够正常访问静态文件 重启以下nginx
service nginx restart任意在浏览器访问一个media里面得图片文件(没图片,就自己加一个) 比如访问localhost:8000/media/test.png 若是正常显示,那么接下来得路就好走多了。 然而,意外往往时会发生的,访问不到的就根据报错来定位问题 同时借助nginx日志,来查看问题的原因 nginx日志路径/var/log/nginx/error.log 一般情况下,由于权限问题导致访问失败的可能性最大 这时候就需要修改项目所在目录的权限 所以项目部署的时候不要把代码放到/root等权限敏感的目录下 ok,往下走 这时候就需要拉通nginx和uwsgi了 接着用test.py测试一把
uwsgi --socket :8001 --wsgi-file test.py访问8000端口,没有问题的话,说明以下环节也拉通了 the web client <-> the web server <-> the socket <-> uWSGI <-> Python 这时候举例万里长征真的就几步路了 我们之前nginx使用的时tcp sokect转发请求,也就是使用端口转发 现在,换成unix socket转发 unix socket相对tcp socket速度更快,节省端口资源 然而要是做负载均衡的话,就需要利用不同的端口转发请求至处理服务器了 不多说,修改nginx配置文件
server unix:///path/to/your/mysite/mysite.sock; # for a file socket# server 127.0.0.1:8001; # for a web port socket (we'll use this first)然后重启nginx 启动uwsgi
uwsgi --socket mysite.sock --wsgi-file test.py访问8000端口,看到hello world,那就是胜利的曙光 然而这里往往是会保权限错误所以,出现权限问题,就试试下面两个命令 其实就加个两个权限参数
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666# 或者uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664搞定这个问题后,就可以拉通整个部署结构了(这个权限最保险^_^)
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=666好了,其实整个部署过程到这就可以结束了 但是在命令中加各种参数是不太好的一个编码习惯 还是写到配置文件里面去 在项目目录下新建mysite_uwsgi.ini
# mysite_uwsgi.ini file[uwsgi]# Django-related settings# the base directory (full path)chdir = /path/to/your/project# Django's wsgi filemodule = project.wsgi# the virtualenv (full path)home = /path/to/virtualenv# process-related settings# mastermaster = true# maximum number of worker processes# 进程数设置与cpu核数相同,保证并行性能processes = 10# the socket (use the full path to be safesocket = /path/to/your/project/mysite.sock# ... with appropriate permissions - may be needed# chmod-socket = 664# clear environment on exitvacuum = true然后用简单的uwsgi命令,就能完成部署了
uwsgi --ini mysite_uwsgi.inips:附赠一些相关项目状态查看命令
# 查看某端口占用情况(80端口为例)lsof -i:80# 查看uwsgi或者nginx进程ps -ef | grep uwsgi# 停止uwsgi主进程pkill uwsgi# 杀掉某进程只需要知道pid既可kill pid新闻热点
疑难解答