部署
2018-01-21 本文已影响0人
马梦里
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
-
反向代理
- gunicorn 2000
- gunicorn 2002
- nginx 80
-
负载均衡
- gunicorn worker
-
静态文件托管
- send_by_directory 每次都 send 很不好
- 配置了一个规则,保存在 nginx 的缓存,不会走到 app 这一层
-
redis
相当于一个数据库,在内存里面,运行速度快。普通数据保存在硬盘。断电后,内存数据就会丢失。
用途:- 缓存
- 共享数据
进程之间的数据是隔离的,worker1 不能访问 worker2 ,如果在 worker1 进行登录,而下一次请求发给了 worker2,那么就是没有登陆的状态。所以需要登录状态、csrf_token 这些数据,这些数据就保存在 redis 里面,因为这些数据不需要持久化,所以不用存在 mongodb(硬盘)里面。