nginx + uwsgi + django部署

virtualenv 配置虚拟环境

检测是否已安装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

至于为什么要用虚拟环境来部署,其中的原因若有疑问就自行谷歌吧。不仅仅是部署,每新建一个项目,都建议使用虚拟环境,好处大大的。

推荐一个很不错的扩展库virtualenvwrapper,挺方便,喜欢的小伙伴就赶紧上手吧。


下面就要开始正式的部署了,这篇教程以ubuntu为例
整个部署结构如下:
the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django
nginx做反向代理处理静态文件,减轻服务器负载
同时也可以配置多台服务器做负载均衡(此篇博客不超扯)
uwsgi处理后台请求
ps:后面写些系列博客介绍下uwsgi和nginx等部署所需
ps:毕竟光讲怎么用,不说原理真是耍流氓

配置uwsgi

虚拟环境下安装uwsgi

pip install uwsgi

# 若安装失败,可能是python依赖库没有安装
# 执行以下命令
apt-get install python-dev

编写测试脚本
在项目目录下添加test.py脚本,添加如下内容

# test.py
def 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

安装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 server

nginx默认占用80端口
同时访问公网ip,默认访问得端口也是80
即可以直接访问localhost,不需要加80端口号
ps:赠送一些常用nginx命令

# 重启nginx
service 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 to
upstream 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 server
server {
    # 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 file
module          = project.wsgi
# the virtualenv (full path)
home            = /path/to/virtualenv

# process-related settings
# master
master          = true
# maximum number of worker processes
# 进程数设置与cpu核数相同,保证并行性能
processes       = 10
# the socket (use the full path to be safe
socket          = /path/to/your/project/mysite.sock
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

然后用简单的uwsgi命令,就能完成部署了

uwsgi --ini mysite_uwsgi.ini

ps:附赠一些相关项目状态查看命令

# 查看某端口占用情况(80端口为例)
lsof -i:80
# 查看uwsgi或者nginx进程
ps -ef | grep uwsgi
# 停止uwsgi主进程
pkill uwsgi
# 杀掉某进程只需要知道pid既可
kill pid
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值