社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

Django Web应用部署篇

金正皓 • 7 年前 • 947 次点击  

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

0. 环境篇

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

新拿到的服务器是以root登陆的,我们先新建一个用户,分配权限。

useradd -m username # 新建用户
passwd username # 修改密码
usermod -a -G adm username
usermod -a -G sudo username
exit # 分配权限后退出

退出后已新的用户登陆。

然后安装python3,mysql等等各种组件,一开始装的时候各种问题都有,然后用了

@小小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应用

从仓库下载代码,本地目录/home/username/myblog,这里假设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

关于nginx和uwsgi的作用:nginx uwsgi wsgi django 这些东西究竟是什么关系

这里引用一下。

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 = /tmp/www.wangzhy.com.socket

# the base directory (full path)
chdir = /home/username/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安装:安装Nginx 在 CentOS 7

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 /home/username/myblog/media;  
    }

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

    location / {
        include     uwsgi_params;
        uwsgi_pass unix:/tmp/www.wangzhy.com.socket;
    }
}

然后

nginx -t # 检查文件

service nginx restart # 重启nginx

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

uwsgi --ini uwsgi.ini

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/fHUznpUW7k
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/13488
 
947 次点击