本文目的: 在 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 上飞一会儿~ https://zhuanlan.zhihu.com/p/25855817 这里的一键脚本, 顺利装完.
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 这些东西究竟是什么关系 http://blog.csdn.net/u014761344/article/details/40146597
这里引用一下.
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 应用快速入门 http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html
然后运行:
- uwsgi --ini uwsgi.ini
- # 后台运行
- # uwsgi --ini mysite_uwsgi.ini --logto mysite.log &
打开 < 服务器公网: 8000 > 就能访问你的网页了.
2.2 nginx
centos 的 nginx 安装: 安装 Nginx 在 CentOS 7 http://blog.51cto.com/cantgis/1540004
- 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
来源: https://juejin.im/entry/5b1f91615188257d3c037f01