专栏首页Python中文社区Nginx+uwsgi部署Django应用

Nginx+uwsgi部署Django应用

本文目的:在centos7.x服务器上利用nginx和uwsgi部署Django应用

0. 安装python3

本文使用的服务器是腾讯云的centos7.0 64位,其他的Linux大同小异,部分安装命令自行查询。

首先安装python3的环境,还有各种组件,一开始装的时候各种问题都有,然后用了 @小小Ho 的让Python3.6在Centos7.x上飞一会儿~这里的一键脚本,顺利装完。

wget https://raw.githubusercontent.com/LunacyZeus/Python3.6-for-Centos7.0/master/install.sh && sh install.sh

测试pip安装

python3 -m pip install --upgrade pip
python3 -m pip install requests

没有报错就是安装好了py3

1. Django应用

从仓库下载代码,这里假设django应用的文件夹叫myblog,应用的数据库用的是mysql

git clone <yourcode>
cd myblog

# 安装虚拟环境
python3 -m pip install virtualenv 
virtualenv venv
. venv/bin/activate

# 安装依赖文件
pip install -r requirements.txt

# 静态文件处理
python manage.py collectstatic

接着是数据库迁移

安装好的mysql先设置密码

mysql -u root -p

> set password for 'root'@'localhost' =password('password');

还有设置远程连接的话

> grant all privileges on *.* to root@'%'identified by 'password';

然后新建django中用到的数据库名,修改setting.py里的密码,就可以进行数据库迁移等。

python manage.py migrate
python manage.py createsuperuser
....
python manage.py runserver 0.0.0.0:8001

然后打开服务器的公网查看,可以加载就是work了,但是还没有静态文件的加载。

2.0 uwsgi & nginx

1,首先nginx 是对外的服务接口,外部浏览器通过url访问nginx。

2,nginx 接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接访问用户给nginx配置的静态文件目录,直接返回用户请求的静态文件,如果不是静态文件,而是一个动态的请求,那么nginx就将请求转发给uwsgi,uwsgi 接收到请求之后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi 根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi 发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

3,要知道第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑到某些情况

  • 安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。
  • 负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。
  • 静态文件问题,用django或是uwsgi这种东西来负责静态文件的处理是很浪费的行为,而且他们本身对文件的处理也不如nginx好,所以整个静态文件的处理都直接由nginx完成,静态文件的访问完全不去经过uwsgi以及其后面的东西。 原理:
the web client <-> the web server(nginx) <-> the socket <-> uwsgi <-> Django

2.1 uwsgi

先安装配置uwsgi

(venv) pip install uwsgi

测试一下是否可用:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return b"Hello World"

运行

uwsgi --http :8000 --wsgi-file test.py

打开<公网:8000>看到Hello world就说明已连通

the web client <-> uWSGI <-> Python

接着在项目目录下新建uwsgi.ini文件

# vim uwsgi.ini

[uwsgi]
# Django-related settings
socket = :8001

# the base directory (full path)
chdir = /root/myblog

# Django s wsgi file
module = blog.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

参数的配置文档在此:Python/WSGI 应用快速入门

然后运行:

uwsgi --ini uwsgi.ini

# 后台运行
# uwsgi --ini mysite_uwsgi.ini --logto mysite.log &

打开<服务器公网:8000>就能访问你的网页了。

2.2 nginx

centos的nginx安装, 地址:http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx

# 开启
systemctl start nginx.service

访问ip可以看到上图就安装成功。

在/etc/nginx/conf.d下新建blog.conf

server {
    listen      80;
    server_name 127.0.0.1 <yoursite.com>;
    charset     utf-8;

    client_max_body_size 75M;

    # media文件夹
    location /media  {
        alias /root/myblog/media;  
    }

    # static文件夹
    location /static {
        alias /root/myblog/static;
    }

    location / {
        include     uwsgi_params;
        uwsgi_pass 127.0.0.1:8001;
    }
}

然后

nginx -t # 检查文件

service nginx restart # 重启nginx

然后再把uswgi服务开启就可以访问站点了

uwsgi --ini uwsgi.ini

作者:yonggege,Python中文社区专栏作者

GitHub地址:https://github.com/wzyonggege

本文分享自微信公众号 - Python中文社区(python-china),作者:yonggege

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nginx+uWSGI部署Django网站的详细步骤,脱坑必备,值得收藏!

    对于Django部署来说,选择nginx和uWSGI是一个不错的选择,此教程旨在将Django部署到生产环境的服务器中。当然你也可以使用Apache或者其他的服...

    Python中文社区
  • 移植Python2.7到ARM-LINUX嵌入式平台

    笔者长期在ARM-LINUX嵌入式平台使用C语言开发。硬件IO操作只能用C确实没办法,但是应用程序用C简直就苦逼了,程序复杂一点,各种越界、指针错误、诡异死机、...

    Python中文社区
  • 使用scrapy,redis,mongodb实现的一个分布式网络爬虫

    这个工程是对垂直搜索引擎中分布式网络爬虫的探索实现,它包含一个针对http://www.woaidu.org/ 网站的spider, 将其网站的...

    Python中文社区
  • Django+Nginx+Uwsgi项目布署详细For Mac

    Django项目准备好了,那么如何把项目部署到生产环境是需要接下来要考虑的事情,难不成还用调试时候用的 python manage.py run...

    测试开发技术
  • uwsgi部署

    修改/usr/local/var/www/static/目录的权限,使得django可以向其中 写入文件

    lesM10
  • Django使用uwsgi和nginx修改代码自动重启

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    菲宇
  • CentOS7+nginx+uwsgi+Django部署之路

    1、不要再虚拟环境下启动uwsgi,如果恰巧你的虚拟环境中也装了uwsgi,那么就算启动成功了,外部客户端也访问不了

    Arno
  • Centos8下django项目部署 nginx+uwsgi的教程

    5.在虚拟环境中安装第三方库,导入需要的环境(导出命令:pip3 freeze > packages.txt)

    砸漏
  • Nginx系列:后端服务应用健康检测

    严格来说,nginx到目前为止没有针对负载均衡后端节点的健康检测的模块,但是可以通过proxy_next_upstream来间接实现,但prox...

    java乐园
  • 在nginx配置文件中删除了index.php就报错

    [root@izkbs00av8xzccz conf.d]# systemctl restart nginx Job for nginx.service fa...

    botkenni

扫码关注云+社区

领取腾讯云代金券