Yixuan 厨娘界元老, 书呆界新人.

Django+ Nginx + uWsgi 部署 (微信公众号开发一)

Wrote by: Yixuan Franco
Date:  Feb.16, 2017
 Version: 0.0

我的冻鸡…(鸡年好 title)

我的冻鸡很简单呐! 我只是想拿 Django 写个微信公众号而已 T^T, 结果就陷入了无尽的部署黑洞, 万丈深渊. 可见这个世界上没有运维是一件夺么可怕的事情.

我的幻想步骤…

  1. 买阿里云 ECS 服务器.
  2. 把 Django 框架布上去.
  3. 然后过掉 Token.
  4. 撸一遍 Django 和 微信的文档.
  5. 一切搞定.

    俺的环境是 Mac OS X, 所以本篇教程没有 Windows 版本售后服务木哈哈哈.

事实是…

大爷的, 第一步我就扑街了哟.

我自己是有一台阿里服务器的. 上面有另一个项目, 马村的夏天, 然后我很棒. 上去重装了一下 nginx, 然后马村就特么炸了啊. 我内心受到了极大的惊吓. 赶紧找了另一位运维宝宝, 还好, 马村最终被抢救回来了.

然后, 作完与长记性. 还是再重新买一台服务器吧. 于是咣咣咣又买了一台… (CentOS 哒). 然后, 本着朝圣的心…我…打开了 terminal.

先弄好 SSH 吧…

ssh-copy-id root@公网IP
ssh root@公网IP

因为这个教程面向完全小白…所以啰嗦一句, 上面两句命令, 依次复制粘贴到 终端/Terminal 里就好. 但是要替换掉 “公网 IP” 这四个字. 换成你服务器的 IP. 如果你买了阿里云的 ECS, 可以在控制台里找到哈.

一次弄上去之后, 你就要输入密码了. 这个密码在你买服务器的时候就设定好了. 当你 ssh root@公网 IP 后, 你其实就已经在 terminal 进入你的服务器了.

看到了吗, 上面有一个 Welcome to… 然后最后是 root 打头的一行字, 很好. 出现跟图片上类似的东西, 就代表你已经进入服务器了.

下面弄一弄 Nginx.

  1. 安装 Nginx 干吗用的你先甭管那么多, 听姐姐的, 先安装上. 命令是: yum install nginx 注: 如果是别的 linux 系统, 安装命令可能是 apt-get install nginx. 然后, 如果屏幕有提示, 遇到 yes/no 你就输入 yes, 遇到什么 y/n 你就输入 y. 安装上就好!

  2. 启动一下 service install nginx start service install nginx restart

然后打开你的浏览器…在小框框里输入你的公网 IP, 按理说, 你就应该可以打开了一个什么 Nginx 已经 worked 的提示了.

  1. 还不够… Nginx 到底干了什么?

这里先讲一点点东西, 比如你在浏览器打开一个网址, www.google.com , 默认的端口是 80. 什么意思呢? 也就是说, 你实际打开的网址是 www.google.com:80.

下面在终端输入一个命令:

vi /etc/nginx/nginx.conf

你会看到一堆英文…往下拉…其中有一块是这样的:

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /home;


        location / {
        }
        error_page 404 /404.html;
            location = /40x.html {
  }

你的可能会跟我有一点点不一样. 我解释一下代码, 第二行的 listen, 看到了吗, 其实就是说, 要监听 80 端口. 然后 root, 就代表你要监听的代码文件夹啦. (默认设置不是这样的, 我已经改过了.)

这里的 root 写的是 home 对吧, 我怎么确定它是不是真的指向 home 呢? 很简单, 在 home 里新建一个 index.html 文件, 文件里随便写点什么.( 写英文哦, 先不要写汉语. 可以写 Hello world.)

然后你重启 Nginx(service nginx restart), 再在浏览器里, 输入自己服务器的公网 IP 试一下. 如果没问题, 网页上就应该显示了 Hello world.

好了, 又到了讲点儿专业的时候了…

用最 直觉/主观 的方式去看一下上网这回事儿:

有一天, 你…

  1. 打开浏览器.
  2. 打开 Google, 输入 PornHub
  3. 然后看到一堆结果.

然而事情的本质并不是这样的…我们再深入一点…

有一天, 你…

  1. 用 (手机, iPad 上的浏览器) 发出了一张你的自拍照.
  2. 这个照片沿着网络, 发送给了服务器.
  3. 服务器 收到了你的照片, 处理了一下, 然后向你发了一条信息.
  4. 你的手机上显示了服务器发回来的信息: 你太特么丑了.

看到没? 现在逻辑变成了…

开始: 你(客户端) > 网 > 服务器…(应用处理信息)…   跳到下一行
         你(客户端) < 网 < 服务器 <...(处理完毕)...

所以刚刚我们的 nginx 是安装在服务器上哒! 服务器可以有各种各样的功能, 这就意味着, 上面得有各种各样的应用. 是吧. 这个 应用(APP), 你可以用 C, python, Java 等这种语言写. 所以再再再深入一下…

开始: 你(客户端) > 网 > 服务器> …APP 处理…   跳到下一行
         你(客户端) < 网 < 服务器 <...APP处理完毕...

所以, 为了让你访问你的 APP, 中间需要再加一层服务器.

开始: 你(客户端) > 网 >  WEB 服务器> 应用服务器 > APP 处理…   跳到下一行
         你(客户端) < 网 < WEB 服务器 <应用服务器 < APP处理完毕...

为了区别这两种服务器, 我们给他们命名一下: WEB 服务器 + 应用服务器. 我明白你可能有点儿懵逼…那我再简化一点儿:

  1. (WEB 服务器)是: 前台接待
    他啥也不干, 就响应. 发点儿 html 文件给你而已.
  2. (应用服务器)是: 真正的价值服务者 有了她的召唤, 那些应用才肯起来干活.

那我用的 Django 去写 APP…

Django 是 python 语言的一种框架. 假设我用 Django 写了个应用名叫小白. 为了让小白干活我就得有 应用服务器 → uWsgi.

所以就去安装 uWsgi 就可以啦.
uWsgi 安装教程参考 

嗷嗷嗷嗷, 所以部署的整一套可用逻辑就是…

  1. 写个应用.
  2. 把 WEB 服务器架好: Apache, nginx.
  3. 把 应用服务器 架好: uWsgi
  4. 然后把应用传到服务器上去.
  5. 让他们通通开始给你干活…

微信特辑梗….

Background: 如果你要玩微信是吧...你会发现, 人家让你用 80 端口. 我们的 Nginx 一般占据的就是 80 端口. 但是启动 uWsgi 的时候, 可能是用的别的端口...那么这就尴尬了喂.  
-- version 0.1 Feb 19, 2017 17:00 增补

因为, 比如我们把代码都放在 /home 这个文件夹底下, 我们的 /home 文件夹底下放着我们的 Django 项目(mysite), mysite 底下放着我们的 APP(wechat). 那么 APP 的位置就是 /home/mysite/wechat.

假设我们的服务器地址为: 123. 12. 123. 12, 而我们的 nginx 已经设置好指向的是 /home 文件夹了. 那么, 我们如果在 home 底下放一个 index.html 文件, 并且访问 http://123. 12. 123. 12, 那么我们看到的就是 index.html 里的内容.

可是! 为了启动我们的 Django 项目, 我们要用 uwgsi 把 APP 叫起来…用命令叫起来的话: uwsgi –http :8000 –module mysite.wsgi

这个命令的意思是, 在 8000 端口, 启动我们的 mysite 项目…那么, 我们如果想看看 mysite 底下的 wechat APP, 整体的路径应该为:
http://123. 12. 123. 12:8000/wechat

这样是绝对会被微信直接拒绝的呀雅蠛蝶. 这该当如何是好?

好在, nginx 可以反向代理…啥意思? 就是说, 我们告诉 nginx, 只要我在 8000 端口打开 wechat 这个 APP, 你就都给我指向 80(也就是默认) 的端口就行了.

代码…很简单, 逻辑想想明白就行了…

server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /home/mysite;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location /wechat {
            proxy_pass http://127.0.0.1:8000;
        }

解释一下, 上面的代码, 位处于 /etc/nginx/nginx.conf 的 http 模块下…打开编辑一下, 让 nginx 的 listen 确保是 80 端口. 然后, 你的 location 默认的样子应该是:

      location / {
            }

就是这样的, 啥也没有. 但我们启动的端口在 8000, 并且要在后面加 /wechat 才能打开 APP, 所以我们做个反向代理, 就要将 location 改为:

        location /wechat {
            proxy_pass http://127.0.0.1:8000;
        }

记住, 改完一定要重启 nginx 呐…(service nginx restart)…如果成功了…那么意味着, 以前你打开 http://123. 12. 123. 12:8000/wechat(记住前面那串数字换成你服务器的外网 ip) 才能看到的东西, 现在直接打开 http://123. 12. 123. 12/wechat 就可以看到了.

前面讲过了, 80 端口是默认的端口, 所以 http://123. 12. 123. 12/wechat 其实是等同于 http://123. 12. 123. 12:80/wechat 的. 然后就可以开始开发你的微信小公众号了木哈哈哈哈….


Glider

Too fast to live.