部署

1. nginx.py:
  • 监听 80 端口
  • 转发请求,根路由写在最下面
  • 可以部署多个网站,改变本地端口即可
server {
    listen 80;

    location /uploads {
        alias /root/forum/user_image;
    }
    location /static {
        alias /root/forum/static;
    }

    location / {
        proxy_pass http://localhost:2000;
    }

}
2. supervisor:

supervisor 的配置文件:forum.conf

  • 启动 gunicorn
  • 进程守护(挂了就拉起来,自动启动)
  • 暴露在最外面的是 nginx 监听 80 端口,gunicorn 是第二环,所以用 localhost,本地访问。以前用 0.0.0.0 是因为没有 nginx,gunicorn 在第一环,必须接收所有主机的访问。
[program:forum]
command=/usr/local/bin/gunicorn wsgi --bind localhost:2000 --workers 3 --worker-class gevent
directory=/root/forum
autostart=true
autorestart=true
environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"
3. gunicorn
  • python 里面的线程很烂,单线程单进程只能处理一个请求,为了处理很多请求,需要用协程。利用 gevent 这个协程库,gunicorn 会自动帮我们解决;
  • workers 后面的数字表示开的进程数。一个进程占用 cpu 的一个核,为了充分利用资源,实现负载均衡,需要开多进程。
  • nginx 根路由对应的转发就是这个:localhost:2000。先转发给 master 进程,master 根据子进程负载,分配给子进程,子进程再给 flak,再给 路由函数,最后连接数据库处理数据,最后返回数据。

wsgi.py

import sys
from os.path import abspath
from os.path import dirname
import app

sys.path.insert(0, abspath(dirname(__file__)))
application = app.configured_app()

部署

  • nginx : web server
  • gunicorn: application server
  • wsgi: 包装出来一个app
  • request -> nginx -> gunicorn -> wsgi -> app(Flask) -> route
  1. 反向代理

    • gunicorn 2000
    • gunicorn 2002
    • nginx 80
  2. 负载均衡

    • gunicorn worker
  3. 静态文件托管

    • send_by_directory 每次都 send 很不好
    • 配置了一个规则,保存在 nginx 的缓存,不会走到 app 这一层
  4. redis
    相当于一个数据库,在内存里面,运行速度快。普通数据保存在硬盘。断电后,内存数据就会丢失。
    用途:

    • 缓存
    • 共享数据
      进程之间的数据是隔离的,worker1 不能访问 worker2 ,如果在 worker1 进行登录,而下一次请求发给了 worker2,那么就是没有登陆的状态。所以需要登录状态、csrf_token 这些数据,这些数据就保存在 redis 里面,因为这些数据不需要持久化,所以不用存在 mongodb(硬盘)里面。

你可能感兴趣的:(部署)